Truy vấn lồng (Subquery) là một trong những công cụ hiệu quả trong SQL, giúp xử lý và truy xuất dữ liệu với mức độ phức tạp cao hơn so với các truy vấn thông thường. Bài viết này sẽ giới thiệu các nguyên tắc cơ bản về truy vấn lồng, đồng thời phân tích cách áp dụng chúng trong thực tế cũng như một số kỹ thuật nâng cao. Dù bạn mới học SQL hay đã có kinh nghiệm, nắm vững truy vấn lồng sẽ giúp bạn nâng cao khả năng thao tác dữ liệu một cách rõ rệt.
Subquery là gì?
Truy vấn lồng (còn gọi là truy vấn lồng nhau hoặc truy vấn con) là một truy vấn được đặt bên trong một truy vấn khác. Truy vấn con được thực thi trước, và kết quả của nó sẽ được truy vấn ngoài sử dụng để tiếp tục xử lý.
Trong câu lệnh SELECT
, truy vấn lồng có thể được dùng để trả về một giá trị duy nhất, nhiều giá trị, hoặc thậm chí toàn bộ một tập dữ liệu – tùy thuộc vào cách truy vấn được xây dựng.
Vai trò của truy vấn lồng trong SQL bao gồm:
- Lọc dữ liệu dựa trên thông tin từ các bảng liên quan.
- Tổng hợp dữ liệu và thực hiện các phép tính một cách linh hoạt, theo ngữ cảnh.
- Tham chiếu chéo dữ liệu giữa các bảng để truy xuất thông tin cụ thể.
- Lựa chọn có điều kiện các dòng dữ liệu mà không cần sử dụng phép nối (join) rõ ràng hoặc viết thêm logic xử lý bên ngoài.
Subquery ở Select
Ví dụ viết truy vấn để liệt kê các giao dịch trong tháng 1, kèm theo giá trị final_price cao nhất trong tháng 1.
SELECT customer_id, order_id, final_price
, (SELECT Max(final_price)
from payment_history_17
WHERE MONTH(transaction_date)=1)
from payment_history_17
where MONTH(transaction_date)=1
Kết quả trả về của truy vấn:
Subquery ở Where
Từ bảng payment_history_17, hãy viết truy vấn để liệt kê các giao dịch trong tháng 1 của những khách hàng không có giao dịch nào trong tháng 2.
SELECT customer_id, product_id, transaction_date
FROM payment_history_17
WHERE MONTH(transaction_date) = 1
AND customer_id NOT IN (
SELECT customer_id
FROM payment_history_17
WHERE MONTH(transaction_date) = 2
)
Kết quả truy vấn:
Truy vấn dòng (Row Subqueries)
Truy vấn dòng là loại truy vấn lồng trả về một dòng chứa nhiều cột. Những truy vấn này thường được sử dụng với các toán tử so sánh như = hoặc IN, khi cần so sánh nhiều giá trị cùng lúc trong một dòng dữ liệu.
Ví dụ trong bảng đơn hàng payment_history_17
, hãy tìm tất cả các đơn hàng có cùng ngân hàng bank_id
và phiên bản ứng dụng app_version
như đơn hàng có order_id = 101
.
SELECT order_id, customer_id, bank_id, app_version
FROM payment_history_17
WHERE bank_id = (
SELECT bank_id
FROM payment_history_17
WHERE order_id = 101
)
AND app_version = (
SELECT app_version
FROM payment_history_17
WHERE order_id = 101
);
Kết quả truy vấn:
Truy vấn bảng con (Table subqueries / Derived tables)
Truy vấn bảng con, hay còn gọi là bảng tạm (derived tables), là những truy vấn trả về một bảng đầy đủ gồm nhiều dòng và nhiều cột. Chúng thường được sử dụng trong mệnh đề FROM như một bảng tạm trong truy vấn chính.
Ví dụ từ bảng payment_history_17
, hãy viết truy vấn để tìm những khách hàng có giá trị đơn hàng trung bình trong tháng 1 lớn hơn 500,000.
SELECT customer_id, AVG_final_price
FROM (
SELECT customer_id, AVG(final_price) AS AVG_final_price
FROM payment_history_17
WHERE MONTH(transaction_date) = 1
GROUP BY customer_id
) AS customer_avg
WHERE AVG_final_price > 500000;
Kết quả truy vấn:
Kết luận
Truy vấn lồng (subquery) là một công cụ mạnh mẽ trong SQL, giúp bạn xử lý dữ liệu phức tạp một cách linh hoạt và hiệu quả. Việc nắm vững cách sử dụng truy vấn lồng không chỉ cải thiện hiệu suất truy vấn, mà còn giúp bạn viết SQL dễ dàng và tối ưu hơn. Đây là một kỹ năng quan trọng đáng để đầu tư nếu bạn muốn nâng cao năng lực phân tích và quản lý dữ liệu.
Theo dõi Fanpage UniTrain để khám phá thêm nhiều thông tin hữu ích nhé.
Xem thêm
[KHÓA HỌC] Ứng dụng SQL trong xử lý dữ liệu
[KIẾN THỨC BỔ ÍCH] Phân biệt WHERE và HAVING trong SQL
[KIẾN THỨC BỔ ÍCH] SQL và các hàm xử lý kiểu dữ liệu Date thông dụng