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.
1. Cú pháp cơ bản của câu lệnh SELECT
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.
Ví dụ:
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
.
2. Lấy tất cả cột dữ liệu với dấu *
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ự *
.
Lệnh này sẽ trả về toàn bộ dữ liệu của bảng employees
.
3. Sử dụng 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.
Kết hợp nhiều điều kiện với AND, OR
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.
4. Sắp xếp dữ liệu với 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.
5. Giới hạn số dòng trả về với 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.
6. Sử dụng LIKE
để tìm kiếm mẫu dữ liệu
Mệ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.
7. Sử dụng 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.
8. Sử dụng 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.
9. Alias (Bí danh) cho cột hoặc bảng
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
.
10. Kết hợp nhiều bảng với 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
.
Ví dụ sử dụng 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
).
11. Tính toán trên dữ liệu với hàm tổng hợp
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
.
Tính số lượng nhân viên:
SELECT COUNT(*) AS TotalEmployees
FROM employees;
Lệnh này trả về tổng số nhân viên trong bảng.
Tính tổng lươ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.
12. Sử dụng GROUP BY
để nhóm dữ liệu
Mệ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.
13. Sử dụng HAVING
để lọc dữ liệu sau khi nhóm
Khá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.
14. Lồng câu lệnh SELECT
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.
15. Sử dụng DISTINCT
để loại bỏ bản ghi trùng lặp
Mệ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
.
Kết luận:
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.
1. Sử dụng CASE
trong câu lệnh SELECT
CASE
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
.
2. Sử dụng UNION
để kết hợp nhiều truy vấn
UNION
đượ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
.
3. Tự nối bảng (Self-Join)
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.
4. Sử dụng EXISTS
để kiểm tra sự tồn tại
EXISTS
đượ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.
5. Sử dụng NOT EXISTS
để kiểm tra sự không tồn tại
Trườ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
).
6. Tính toán với các phép toán phức tạp
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.
7. Subquery trong mệnh đề 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
.
8. Sử dụng FULLTEXT
để tìm kiếm văn bản
FULLTEXT
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.
9. Lọc dữ liệu với các điều kiện phức tạp (Sử dụng 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.
Ví dụ với 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
.
Ví dụ với 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
.
Kết luận:
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ế.