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).