Single Row Subquery (Truy vấn con một hàng)
Dùng khi kết quả truy vấn ngoài dựa trên một giá trị đơn chưa biết. Dù tên gọi "single-row", nó ngụ ý trả về nhiều cột nhưng chỉ một hàng. Tuy nhiên, scalar subquery chỉ trả về 1 hàng 1 cột.
SELECT first_name, salary, department_id FROM employees WHERE salary = (SELECT MIN(salary) FROM employees);
Truy vấn con trả về lương tối thiểu, truy vấn ngoài lọc nhân viên có lương bằng giá trị đó.
Dùng trong HAVING khi so sánh với hàm nhóm:
SELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary) < (SELECT AVG(salary) FROM employees)
Multiple Row Subquery (Truy vấn con nhiều hàng)
Trả về nhiều hàng cho truy vấn cha. Dùng phổ biến trong WHERE và HAVING. Vì trả về nhiều hàng, phải dùng toán tử so sánh tập hợp: IN, ALL, ANY.
IN: khớp bất kỳ giá trị nàoANY: so sánh với từng giá trịALL: so sánh với mọi giá trị
Ví dụ lỗi do dùng = với subquery trả về nhiều hàng:
SELECT first_name, department_id
FROM employees
WHERE department_id = (SELECT department_id
FROM employees WHERE LOCATION_ID = 100)
-- ERROR: Subquery returns more than 1 row
Phải sửa thành IN hoặc ANY.