Bài viết dưới đây sẽ hướng dẫn bạn cách sử dụng truy vấn con (subquery) trong SQL Server kèm theo cú pháp và các ví dụ minh họa.
Subquery trong SQL là gì?
Trong SQL Server, subquery (truy vấn con) là một truy vấn nằm bên trong một truy vấn khác. Bạn có thể tạo các truy vấn lồng nhau trong các mệnh đề WHERE, FROM hoặc SELECT.
Lưu ý:
- Subquery còn được gọi là INNER QUERY hoặc INNER SELECT.
- Truy vấn chính chứa subquery được gọi là OUTER QUERY hoặc OUTER SELECT.
Subquery trong mệnh đề WHERE
Thường subquery được đặt trong mệnh đề WHERE. Những subquery này còn được gọi là truy vấn lồng nhau (nested queries).
SELECT s.sanpham_id, s.sanpham_ten
FROM sanpham s
WHERE s.sanpham_id IN
(SELECT htk.sanpham_id
FROM hangtonkho htk
WHERE htk.soluong > 10);
Đoạn truy vấn con trong câu lệnh SELECT trên:
(SELECT htk.sanpham_id
FROM hangtonkho htk
WHERE htk.soluong > 10);
Subquery cho phép tìm các giá trị sanpham_id từ bảng hangtonkho có số lượng lớn hơn 10. Sau đó subquery được dùng để lọc kết quả từ truy vấn chính sử dụng điều kiện IN.
Subquery có thể viết lại dưới dạng INNER JOIN như bên dưới.
SELECT s.sanpham_id, s.sanpham_ten
FROM sanpham s
INNER JOIN hangtonkho htk
ON s.sanpham_id = htk.sanpham_id
WHERE htk.soluong > 10;
INNER JOIN thường thực thi hiệu quả hơn subquery gốc. Cũng quan trọng là không phải truy vấn nào cũng có thể viết lại bằng JOIN.
Subquery trong mệnh đề FROM
SELECT nhacung.nhacung_ten, truyvancon1.tong_sl
FROM nhacung,
(SELECT nhacung_id, SUM(donhang.soluong) AS tong_sl
FROM donhang
GROUP BY nhacung_id) truyvancon1
WHERE truyvancon1.nhacung_id = nhacung.nhacung_id;
Trong ví dụ này, chúng ta tạo subquery trong mệnh đề FROM như sau:
(SELECT nhacung_id, SUM(donhang.soluong) AS tong_sl
FROM donhang
GROUP BY nhacung_id) truyvancon1
Subquery này được gán bí danh (alias) là truyvancon1. Đây sẽ là tên dùng để tham chiếu đến subquery này hoặc bất kỳ trường thông tin nào của nó.
Subquery trong mệnh đề SELECT
Thường subquery được đặt trong mệnh đề SELECT để tính toán bằng các hàm tổng hợp như SUM, COUNT, MIN hoặc MAX nhưng không muốn nhóm trong truy vấn chính.
SELECT n1.ho, n1.ten,
(SELECT MAX(luong)
FROM nhanvien n2
WHERE n1.nhanvien_id = n2.nhanvien_id) truyvancon2
FROM nhanvien n1;
Subquery được tạo trong ví dụ trên:
(SELECT MAX(luong)
FROM nhanvien n2
WHERE n1.nhanvien_id = n2.nhanvien_id) truyvancon2
Subquery này cũng được gán bí danh truyvancon2. Kỹ thuật đặt subquery trong mệnh đề SELECT được sử dụng vì subquery trả về một giá trị đơn lẻ. Đó là lý do các hàm tổng hợp như SUM, COUNT, MIN hoặc MAX thường được dùng trong subquery.