Thời gian đọc: 12 phút
Câu lệnh SELECT
trong MySQL là một trong những câu lệnh quan trọng nhất, được sử dụng để truy vấn và lấy dữ liệu từ cơ sở dữ liệu. Để hiểu rõ về SELECT
, chúng ta sẽ đi từ những ví dụ cơ bản đến các tình huống nâng cao hơn.
Cú pháp cơ bản của câu lệnh SELECT
như sau:
SELECT column1, column2, ...
FROM table_name;
Trong đó:
column1
, column2
, …: Tên các cột mà bạn muốn truy vấn.table_name
: Tên của bảng chứa dữ liệu.Giả sử chúng ta có bảng employees
với các cột: id
, name
, age
, và salary
.
SELECT name, age
FROM employees;
Lệnh này sẽ lấy thông tin về name
và age
của tất cả nhân viên trong bảng employees
.
*
Nếu muốn lấy tất cả các cột trong bảng, bạn có thể sử dụng ký tự *
.
SELECT *
FROM employees;
Lệnh này sẽ trả về toàn bộ dữ liệu của bảng employees
.
WHERE
để lọc dữ liệuĐể truy vấn dữ liệu theo điều kiện cụ thể, chúng ta sử dụng mệnh đề WHERE
.
SELECT name, salary
FROM employees
WHERE age > 30;
Câu lệnh này trả về danh sách nhân viên có tuổi lớn hơn 30.
Bạn có thể sử dụng AND
và OR
để kết hợp nhiều điều kiện trong WHERE
.
SELECT name, salary
FROM employees
WHERE age > 30 AND salary > 5000;
Câu lệnh này trả về danh sách nhân viên có tuổi lớn hơn 30 và mức lương lớn hơn 5000.
SELECT name, salary
FROM employees
WHERE age > 30 OR salary > 5000;
Câu lệnh này trả về nhân viên có tuổi lớn hơn 30 hoặc lương lớn hơn 5000.
ORDER BY
Bạn có thể sử dụng ORDER BY
để sắp xếp kết quả theo thứ tự tăng dần (ASC
) hoặc giảm dần (DESC
).
SELECT name, salary
FROM employees
ORDER BY salary DESC;
Lệnh này sẽ sắp xếp danh sách nhân viên theo lương giảm dần.
LIMIT
Để giới hạn số lượng kết quả trả về, chúng ta sử dụng LIMIT
.
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;
Lệnh này sẽ lấy 5 nhân viên có mức lương cao nhất.
LIKE
để tìm kiếm mẫu dữ liệuMệnh đề LIKE
được sử dụng để tìm kiếm dữ liệu dựa trên một mẫu.
SELECT name
FROM employees
WHERE name LIKE 'J%';
Lệnh này sẽ trả về danh sách nhân viên có tên bắt đầu bằng chữ ‘J’. Ký tự %
đại diện cho bất kỳ chuỗi ký tự nào.
IN
để kiểm tra nhiều giá trịMệnh đề IN
giúp kiểm tra một cột có thuộc vào một tập hợp giá trị cụ thể không.
SELECT name, salary
FROM employees
WHERE age IN (25, 30, 35);
Lệnh này trả về danh sách nhân viên có tuổi là 25, 30 hoặc 35.
BETWEEN
để kiểm tra khoảng giá trịMệnh đề BETWEEN
giúp kiểm tra xem giá trị có nằm trong một khoảng xác định.
SELECT name, salary
FROM employees
WHERE salary BETWEEN 3000 AND 6000;
Lệnh này trả về danh sách nhân viên có mức lương từ 3000 đến 6000.
Bí danh (AS
) được sử dụng để đặt tên tạm cho cột hoặc bảng, giúp kết quả dễ đọc hơn.
SELECT name AS EmployeeName, salary AS EmployeeSalary
FROM employees;
Lệnh này trả về kết quả với các cột được đổi tên thành EmployeeName
và EmployeeSalary
.
JOIN
Bạn có thể kết hợp dữ liệu từ nhiều bảng khác nhau bằng cách sử dụng các kiểu JOIN
như INNER JOIN
, LEFT JOIN
, RIGHT JOIN
.
INNER JOIN
:Giả sử có bảng departments
với các cột: id
, department_name
.
SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;
Lệnh này sẽ trả về tên nhân viên và tên phòng ban tương ứng, chỉ với những nhân viên có phòng ban (bảng employees
có department_id
khớp với bảng departments
).
MySQL cung cấp các hàm tổng hợp để thực hiện các tính toán trên dữ liệu như COUNT
, SUM
, AVG
, MIN
, MAX
.
SELECT COUNT(*) AS TotalEmployees
FROM employees;
Lệnh này trả về tổng số nhân viên trong bảng.
SELECT SUM(salary) AS TotalSalary
FROM employees;
Lệnh này trả về tổng mức lương của tất cả nhân viên.
GROUP BY
để nhóm dữ liệuMệnh đề GROUP BY
được sử dụng để nhóm dữ liệu dựa trên một hoặc nhiều cột.
SELECT department_id, AVG(salary) AS AvgSalary
FROM employees
GROUP BY department_id;
Lệnh này trả về mức lương trung bình của từng phòng ban.
HAVING
để lọc dữ liệu sau khi nhómKhác với WHERE
, HAVING
được sử dụng để lọc dữ liệu sau khi đã sử dụng GROUP BY
.
SELECT department_id, AVG(salary) AS AvgSalary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 5000;
Lệnh này trả về những phòng ban có mức lương trung bình lớn hơn 5000.
Bạn có thể lồng một câu lệnh SELECT
bên trong câu lệnh khác.
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
Lệnh này trả về danh sách nhân viên có lương lớn hơn mức lương trung bình của tất cả nhân viên.
DISTINCT
để loại bỏ bản ghi trùng lặpMệnh đề DISTINCT
được sử dụng để loại bỏ các kết quả trùng lặp trong dữ liệu.
SELECT DISTINCT department_id
FROM employees;
Lệnh này trả về danh sách các department_id
khác nhau trong bảng employees
.
Câu lệnh SELECT
trong MySQL là công cụ mạnh mẽ giúp bạn truy vấn và thao tác dữ liệu từ cơ sở dữ liệu. Bạn có thể kết hợp nhiều mệnh đề như WHERE
, ORDER BY
, JOIN
, và sử dụng các hàm tổng hợp, các kỹ thuật nhóm dữ liệu với GROUP BY
, cũng như thực hiện các phép tính toán phức tạp khác để khai thác dữ liệu hiệu quả.
Dưới đây là một số ví dụ nâng cao về câu lệnh SELECT
trong MySQL, giúp bạn hiểu sâu hơn về các trường hợp phức tạp khi làm việc với dữ liệu lớn và các yêu cầu truy vấn đặc biệt.
CASE
trong câu lệnh SELECTCASE
trong MySQL được sử dụng để đưa ra các giá trị có điều kiện giống như một lệnh if-else
.
SELECT name,
salary,
CASE
WHEN salary > 7000 THEN 'High'
WHEN salary BETWEEN 5000 AND 7000 THEN 'Medium'
ELSE 'Low'
END AS SalaryLevel
FROM employees;
Lệnh này sẽ trả về tên nhân viên, mức lương, và phân loại mức lương (Cao, Trung bình, Thấp) dựa trên giá trị của salary
.
UNION
để kết hợp nhiều truy vấnUNION
được sử dụng để kết hợp kết quả của nhiều truy vấn SELECT
khác nhau. Các truy vấn phải có cùng số lượng cột và kiểu dữ liệu tương ứng.
SELECT name, salary
FROM employees
WHERE department_id = 1
UNION
SELECT name, salary
FROM employees
WHERE department_id = 2;
Lệnh này sẽ trả về danh sách nhân viên từ cả hai phòng ban (có department_id
là 1 và 2). UNION
sẽ loại bỏ các bản ghi trùng lặp. Nếu muốn bao gồm tất cả bản ghi (kể cả bản trùng), bạn có thể sử dụng UNION ALL
.
Tự nối bảng là việc nối một bảng với chính nó để truy vấn các mối quan hệ phức tạp trong cùng một bảng.
SELECT A.name AS Employee, B.name AS Manager
FROM employees A
INNER JOIN employees B ON A.manager_id = B.id;
Lệnh này sẽ trả về tên nhân viên và tên của người quản lý của họ. Trong bảng employees
, cột manager_id
là khóa ngoại trỏ đến id
của người quản lý trong cùng bảng.
EXISTS
để kiểm tra sự tồn tạiEXISTS
được sử dụng để kiểm tra xem một truy vấn con có trả về kết quả nào hay không. Điều này rất hữu ích khi bạn muốn biết một điều kiện có thỏa mãn trong một tập hợp con dữ liệu hay không.
SELECT name
FROM employees E
WHERE EXISTS (SELECT 1
FROM departments D
WHERE D.id = E.department_id AND D.department_name = 'Sales');
Lệnh này trả về danh sách nhân viên thuộc phòng ban “Sales”. EXISTS
trả về TRUE
nếu truy vấn con trả về bất kỳ kết quả nào.
NOT EXISTS
để kiểm tra sự không tồn tạiTrường hợp này ngược lại với EXISTS
, bạn có thể sử dụng NOT EXISTS
để lọc những dữ liệu không tồn tại trong bảng khác.
SELECT name
FROM employees E
WHERE NOT EXISTS (SELECT 1
FROM departments D
WHERE D.id = E.department_id);
Lệnh này sẽ trả về các nhân viên không thuộc phòng ban nào (tức là không có giá trị department_id
trong bảng departments
).
Bạn có thể sử dụng các phép toán số học phức tạp trong câu lệnh SELECT
. Ví dụ sau sẽ tính tổng mức lương cho tất cả nhân viên và cộng thêm 10% tiền thưởng.
SELECT name, salary, (salary * 0.1) AS Bonus, (salary + salary * 0.1) AS TotalCompensation
FROM employees;
Lệnh này sẽ trả về mức lương, tiền thưởng, và tổng thu nhập của từng nhân viên.
FROM
Truy vấn con (Subquery
) trong mệnh đề FROM
là khi bạn lồng một truy vấn bên trong một truy vấn lớn hơn, nhằm xử lý hoặc tách dữ liệu từ nhiều cấp độ.
SELECT department_name, AVG(salary) AS AvgSalary
FROM (SELECT D.department_name, E.salary
FROM employees E
INNER JOIN departments D ON E.department_id = D.id) AS DeptSalary
GROUP BY department_name;
Lệnh này sẽ tính mức lương trung bình của từng phòng ban bằng cách kết hợp dữ liệu từ hai bảng và nhóm chúng lại với GROUP BY
.
FULLTEXT
để tìm kiếm văn bảnFULLTEXT
cho phép tìm kiếm toàn văn bản trong MySQL trên các cột dạng chuỗi. Chỉ hỗ trợ trên bảng có kiểu MyISAM
hoặc InnoDB
với các cột đã lập chỉ mục.
SELECT name
FROM employees
WHERE MATCH(name, job_title)
AGAINST('developer');
Lệnh này sẽ tìm kiếm tất cả các nhân viên có từ “developer” trong tên hoặc tiêu đề công việc.
ALL
và ANY
)ALL
và ANY
được sử dụng để so sánh một giá trị với tất cả hoặc bất kỳ giá trị nào trong một tập hợp con.
ALL
:
SELECT name, salary
FROM employees
WHERE salary > ALL (SELECT salary
FROM employees
WHERE department_id = 2);
Lệnh này trả về những nhân viên có lương lớn hơn tất cả nhân viên thuộc phòng ban có department_id = 2
.
ANY
:
SELECT name, salary
FROM employees
WHERE salary > ANY (SELECT salary
FROM employees
WHERE department_id = 2);
Lệnh này trả về những nhân viên có lương lớn hơn ít nhất một nhân viên thuộc phòng ban có department_id = 2
.
Các ví dụ nâng cao trên minh họa những tính năng mạnh mẽ của câu lệnh SELECT
trong MySQL. Bạn có thể thực hiện các phép tính phức tạp, kết hợp nhiều bảng, làm việc với dữ liệu con, và sử dụng các hàm đặc biệt để khai thác dữ liệu hiệu quả hơn trong các ứng dụng thực tế.