Subquery (truy vấn con) là một truy vấn bên trong truy vấn khác. Nó cho phép viết truy vấn chọn dữ liệu dựa trên tiêu chí được phát triển tại runtime. Chính thức, là sử dụng câu lệnh SELECT bên trong một mệnh đề của câu lệnh SELECT khác.
Subquery có thể lồng nhau nhiều cấp, cũng có thể nằm trong INSERT, UPDATE, DELETE. Subquery phải đặt trong ngoặc đơn. Có thể dùng ở bất kỳ nơi nào cho phép biểu thức, miễn là trả về giá trị đơn. Khi dùng trong mệnh đề FROM, nó được gọi là inline view (bảng ảo). Subquery có thể đặt ở FROM, WHERE, HAVING. Còn gọi là INNER QUERY, truy vấn chứa nó là OUTER QUERY.
1. Scalar Subquery (Truy vấn con vô hướng)
Trả về một giá trị đơn (1 hàng, 1 cột). Dùng gần như mọi nơi cho phép cột đơn hoặc literal.
mysql> Select Name from Customers
WHERE Customer_id = (Select Customer_id FROM Reservations WHERE ID = 5);
+--------+
| Name |
+--------+
| Gaurav |
+--------+
2. Table Subquery (Truy vấn con bảng)
Trả về kết quả 1 hoặc nhiều hàng, 1 hoặc nhiều cột.
mysql> Select Name from customers
where Customer_id IN (SELECT DISTINCT Customer_id from reservations);
+---------+
| Name |
+---------+
| Rahul |
| Yashpal |
| Gaurav |
+---------+
3. Correlated Subquery (Truy vấn con tương quan)
Sử dụng giá trị từ truy vấn ngoài trong mệnh đề WHERE của nó.
mysql> Select Name from cars WHERE Price < (SELECT AVG(Price) from Cars); +--------------+ | Name | +--------------+ | Nexa | | Maruti Swift | | Alto | | Skoda | | Ford | +--------------+ mysql> Select Name from cars WHERE Price > (SELECT AVG(Price) from Cars); +--------+ | Name | +--------+ | BMW | | VOLVO | | Toyota | +--------+
Truy vấn con (SELECT AVG(Price) from Cars) được tính toán lại cho mỗi hàng của truy vấn ngoài (tương quan).