Subquery, còn được gọi là inner query hoặc nested query, là một truy vấn được đặt bên trong một truy vấn khác.
Subquery có thể được sử dụng với câu lệnh SELECT, FROM, WHERE, HAVING, INSERT, UPDATE, và DELETE cùng với các toán tử như: =, <,>,> =, <=, IN, BETWEEN, v.v …
Dưới đây là một số phân loại phổ biến của subquery
- Subquery trong mệnh đề WHERE: Sử dụng để lọc dữ liệu dựa trên kết quả của một truy vấn con.
SELECT column_name
FROM table_name
WHERE column_name = (SELECT another_column FROM another_table WHERE condition);
- Subquery trong mệnh đề FROM: Sử dụng để tạo một bảng tạm thời từ kết quả của một truy vấn con.
SELECT *
FROM (SELECT column1, column2 FROM table1) AS subquery_table
WHERE column1 > 10;
- Subquery trong mệnh đề SELECT: Sử dụng để trả về một giá trị hoặc một tập hợp giá trị để sử dụng trong mệnh đề SELECT.
SELECT column_name, (SELECT MAX(another_column) FROM another_table) AS max_value
FROM table_name;
- Subquery trong mệnh đề HAVING: Sử dụng để lọc kết quả của một nhóm dựa trên kết quả của một truy vấn con.
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees WHERE department = 'HR');
Bên cạnh đó ta cần chú ý đến các dạng hình thái của subquery (1 bảng, 1 giá trị, 1 hàng, 1 cột)
1. Single-Row Subquery: Subquery trả về duy nhất một hàng kết quả. Thường được sử dụng trong các mệnh đề WHERE hoặc HAVING để so sánh với một giá trị cụ thể.
Trong ví dụ này, subquery trả về giá trị product_id lớn nhất từ bảng products, sau đó truy vấn chính lấy tên sản phẩm tương ứng.
SELECT product_name
FROM products
WHERE product_id = (SELECT MAX(product_id) FROM products);
2. Multiple-Row Subquery: Subquery trả về nhiều hàng kết quả. Thường được sử dụng với các toán tử IN, ANY hoặc ALL để so sánh với tập hợp các giá trị.
Subquery trong ví dụ này trả về danh sách các khách hàng đã đặt hàng vào ngày cụ thể, và truy vấn chính trả về tên của những khách hàng này.
SELECT customer_name
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date = '2023-08-01');
Subquery trong ví dụ này trả về danh sách các sản phẩm là laptop hoặc máy tính bảng; sau đó truy vấn chính trả về danh sách các sản phẩm có giá cao hơn ít nhất giá của một sản phẩm trong danh sách đã chỉ định
SELECT ProductID, ProductName, Price
FROM Products
WHERE Price > ANY (SELECT Price FROM Products WHERE ProductName IN ('Laptop', 'Tablet'));
3. Multiple-Column Subquery: Subquery trả về nhiều cột trong kết quả. Điều này thường được sử dụng trong các mệnh đề WHERE.
Trong ví dụ này, subquery trả về bộ cặp (department_id, MAX(salary)) cho mỗi phòng ban, và truy vấn chính hiển thị danh sách tên nhân viên và bộ phận của họ có mức lương cao nhất trong từng phòng ban.
SELECT employee_name, department_id
FROM employees
WHERE (department_id, salary) IN (SELECT department_id, MAX(salary) FROM employees GROUP BY department_id);
4. Correlated Subquery: Subquery chứa tham chiếu đến cột từ bảng ở một truy vấn ngoài. Nó được sử dụng trong các trường hợp mà dữ liệu của subquery phụ thuộc vào dữ liệu của truy vấn bên ngoài.
Trong ví dụ này, subquery tính trung bình giá của các sản phẩm trong cùng một danh mục và truy vấn chính hiển thị tên sản phẩm và giá trung bình tương ứng.
SELECT product_name,
(SELECT AVG(price) FROM products WHERE category = categories.category) AS avg_price
FROM categories;
- Scalar Subquery (Subquery trả về một giá trị kết quả): Trả về một giá trị kết quả và có thể sử dụng nó như là một phần của biểu thức.
Trong ví dụ này, subquery (SELECT AVG(Salary) FROM Employees) tính trung bình mức lương của tất cả nhân viên trong bảng “Employees”.
SELECT EmployeeID, FirstName, LastName, Salary,
CASE
WHEN Salary > (SELECT AVG(Salary) FROM Employees) THEN 'Above Average'
WHEN Salary = (SELECT AVG(Salary) FROM Employees) THEN 'Average'
ELSE 'Below Average'
END AS Performance
FROM Employees;
Có một vài quy tắc mà Subquery phải tuân theo:
- Subquery phải được đặt trong dấu ngoặc đơn.
- Một subquery có thể chỉ có một cột trong mệnh đề SELECT, trừ khi nhiều cột trong truy vấn chính cho subquery để so sánh các cột đã chọn của nó.
- Không thể sử dụng lệnh ORDER BY trong subquery, mặc dù truy vấn chính có thể sử dụng ORDER BY. Lệnh GROUP BY có thể được sử dụng để thực hiện chức năng giống như ORDER BY trong một subquery.
- Subquery trả về nhiều hơn một hàng chỉ có thể được sử dụng với toán tử nhiều giá trị như toán tử IN.
- Toán tử BETWEEN không thể được sử dụng với một subquery. Tuy nhiên, toán tử BETWEEN có thể được sử dụng trong subquery.
– Xem ngay Lộ trình học Data Analyst chuyển ngành thành công trong vòng 6 tháng
– Xem ngay Lộ trình học Marketing Automation & Analytics Coaching 1 on 1 để upgrade kỹ năng phân tích cho Marketer
– Tham gia Vietnam Data Analyst Forum – #1 Informative Group để học hỏi và chia sẻ kiến thức về Data Analytics
– Cập nhật lịch khai giảng, chương trình ưu đãi và nhận tư vấn chuyển ngành miễn phí tại Data Coaching 1 on 1 – UniGap