Truy vấn lồng (Subquery) trong SQL – Bí kíp giúp xử lý và truy xuất dữ liệu với mức độ phức tạp cao

Khám phá truy vấn lồng Subquery trong SQL

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:

Kết quả truy vấn 1

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_idvà phiên bản ứng dụng app_versionnhư đơ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

Bài viết liên quan
[HOẠT ĐỘNG CỘNG ĐỒNG] Cuộc thi Doanh nhân tập sự – CLB Kỹ năng Doanh nhân (ACTION CLUB) – CSII Đại học Ngoại Thương TP. HCM (FTU2)

Ngày 21/06/2025 vừa rồi, với danh vị là Nhà tài trợ Học bổng – UniTrain hân hạnh tham dự chung kết cuộc thi Doanh nhân tập sự. Cuộc thi với quy

Xem thêm
Hàm TRIMRANGE() – Hàm xóa giá trị trống “đỉnh” hơn cả TRIM.

Như bạn đã biết hàm TRIM() trong Excel giúp loại bỏ các ký tự trống (khoảng trắng). Tương tự vậy hàm TRIMRANGE() được sử dụng để xóa các giá trị trống khỏi một phạm vi

Xem thêm
[HOẠT ĐỘNG CỘNG ĐỒNG] Cuộc thi Financial Student Contest (FSC) mùa 13 – CLB Tài chính – Chứng khoán (SeSC) – Đại học Ngoại Thương CSII TP. HCM (FTU2)

Chiều tối ngày 13/06/2025, Chung kết cuộc thi Financial Student Contest (FSC) mùa 13 do CLB Tài chính – Chứng khoán (SeSC) thuộc Đại học Ngoại Thương CSII TP. HCM (FTU2)

Xem thêm
[HOẠT ĐỘNG CỘNG ĐỒNG] Cuộc thi myInsight – MDS Datathon Challenge 2025 – CLB Toán ứng dụng & Khoa học dữ liệu (MDS) – CSII Đại học Ngoại Thương TP. HCM (FTU2)

Chiều ngày 08/06/2025 vừa qua, cuộc thi myInsight – MDS Datarthon Challenge 2025 đã chính thức tiến đến vòng chung kết dưới sự góp mặt của top 5 đội thi xuất

Xem thêm