Subqueries, hay còn gọi là truy vấn con, là truy vấn được nhúng trong một truy vấn khác. Trong MySQL, subqueries có thể được sử dụng trong các câu lệnh SELECT, INSERT, UPDATE, và DELETE, cũng như là một phần của điều kiện trong câu lệnh WHERE hoặc HAVING. Subqueries có thể trả về một giá trị duy nhất, một dãy giá trị, hoặc một bảng dữ liệu.
Subqueries làm Điều Kiện
Ví dụ 1: Tìm tất cả nhân viên có lương cao hơn mức lương trung bình.
SELECT ten, luong
FROM nhan_vien
WHERE luong > (SELECT AVG(luong) FROM nhan_vien);
Trong ví dụ này, subquery (SELECT AVG(luong) FROM nhan_vien) tính mức lương trung bình và được sử dụng làm điều kiện so sánh cho truy vấn ngoài.
Subqueries trong FROM Clause
Ví dụ 2: Sử dụng kết quả của subquery như một bảng tạm thời.
SELECT tmp.ten_phong, COUNT(*)
FROM (SELECT ten AS ten_phong FROM phong_ban) AS tmp
GROUP BY tmp.ten_phong;
Trong ví dụ này, subquery được sử dụng để tạo ra một bảng tạm thời tmp, từ đó truy vấn ngoài thực hiện các thao tác trên bảng tạm thời này.
Subqueries trong SELECT Clause
Ví dụ 3: Lấy mức lương trung bình trong cùng một truy vấn lấy thông tin nhân viên.
SELECT ten, luong, (SELECT AVG(luong) FROM nhan_vien) AS luong_trung_binh
FROM nhan_vien;
Trong ví dụ này, subquery tính mức lương trung bình của nhân viên và kết quả được hiển thị như một cột luong_trung_binh trong kết quả truy vấn chính.
Subqueries và IN Operator
Ví dụ 4: Tìm thông tin nhân viên làm trong các phòng ban có từ 10 nhân viên trở lên.
SELECT *
FROM nhan_vien
WHERE phong_ban_id IN (SELECT id
FROM phong_ban
GROUP BY id
HAVING COUNT(id) >= 10);
Trong ví dụ này, subquery tìm ra các id của phòng ban có từ 10 nhân viên trở lên và được sử dụng làm điều kiện trong câu lệnh IN của truy vấn ngoài.
Subqueries cung cấp sự linh hoạt và mạnh mẽ khi phải xử lý các tình huống yêu cầu nhiều lớp lọc hoặc khi cần thực hiện các phép toán trung gian. Tuy nhiên, chúng cũng có thể ảnh hưởng đến hiệu suất của truy vấn, đặc biệt là khi sử dụng trong các bảng lớn hoặc với nhiều subqueries lồng nhau, do đó cần sử dụng chúng một cách cân nhắc.
Comments