Truy vấn lồng nhau (nested query) trong MySQL, còn được gọi là subquery (truy vấn con), là một truy vấn được đặt bên trong một truy vấn khác. Có nhiều cách để sử dụng truy vấn lồng nhau trong MySQL, dưới đây là một số ví dụ phổ biến:
1. Truy vấn con trong mệnh đề WHERE
Truy vấn con thường được sử dụng trong mệnh đề WHERE
để lọc dữ liệu dựa trên kết quả của một truy vấn khác.
Ví dụ:
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
Giải thích: Truy vấn này sẽ tìm tất cả các nhân viên có mức lương cao hơn mức lương trung bình của tất cả nhân viên.
2. Truy vấn con trong mệnh đề FROM
Một truy vấn con có thể được sử dụng trong mệnh đề FROM
, cho phép bạn coi kết quả của truy vấn con như một bảng tạm thời.
Ví dụ:
SELECT department, avg_salary
FROM (SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department) AS avg_dept
WHERE avg_salary > 50000;
Giải thích: Ở đây, truy vấn con tính toán mức lương trung bình cho từng phòng ban và sau đó lọc ra các phòng ban có mức lương trung bình lớn hơn 50,000.
3. Truy vấn con trong mệnh đề SELECT
Truy vấn con có thể được sử dụng trong mệnh đề SELECT
để tính toán một giá trị cụ thể cho từng hàng.
Ví dụ:
SELECT name, salary,
(SELECT MAX(salary) FROM employees) AS max_salary
FROM employees;
Giải thích: Truy vấn con này trả về mức lương cao nhất từ bảng employees
, và kết quả này được hiển thị cho mỗi nhân viên.
4. Truy vấn con có mệnh đề IN
Sử dụng truy vấn con với mệnh đề IN
để lọc ra các hàng khớp với kết quả của truy vấn con.
Ví dụ:
SELECT name, department
FROM employees
WHERE department IN (SELECT department
FROM departments
WHERE location = 'New York');
Giải thích: Truy vấn này sẽ trả về tên của các nhân viên làm việc trong các phòng ban ở New York.
5. Truy vấn con có mệnh đề EXISTS
EXISTS
kiểm tra sự tồn tại của một tập kết quả trả về từ truy vấn con.
Ví dụ:
SELECT name, department
FROM employees e
WHERE EXISTS (SELECT 1
FROM departments d
WHERE d.department = e.department
AND d.location = 'New York');
Giải thích: Truy vấn này trả về thông tin của các nhân viên làm việc trong các phòng ban có trụ sở tại New York.
Lưu ý:
- Hiệu suất của các truy vấn lồng nhau phụ thuộc vào cách sử dụng và kích thước dữ liệu. Đôi khi, sử dụng JOIN có thể cải thiện hiệu suất thay vì sử dụng truy vấn con.
- Đảm bảo các truy vấn con của bạn trả về kết quả thích hợp (chẳng hạn như chỉ trả về một giá trị cho truy vấn con trong mệnh đề
WHERE
hoặc SELECT
).