Subquery trong SQL Server - truy vấn con - SQL Server căn bản
Trong bài này ta sẽ tìm hiểu Subquery trong SQL Server, đây là cách giúp bạn có thể sử dụng nhiều câu lệnh Select trong một câu lênh Select, ta hay gọi là truy vấn con. Thực ra mình đã nói chủ đề này khá nhiều ở một số bài như: Subquery trong ...
Trong bài này ta sẽ tìm hiểu Subquery trong SQL Server, đây là cách giúp bạn có thể sử dụng nhiều câu lệnh Select trong một câu lênh Select, ta hay gọi là truy vấn con.
Thực ra mình đã nói chủ đề này khá nhiều ở một số bài như:
- Subquery trong SQL
- Subquery trong MySQL
Về lý thuyết thì nó giống hai bài kia, vì vậy trong bài này mình chỉ nói đơn giản hóa lại, nếu không hiểu thì bạn hãy tham khảo 2 bài đó.
1. Tìm hiểu Subquery trong SQL Server
Subquery hay còn gọi là truy vấn con, đây là một dạng câu SQL đặc biệt giúp bạn có thể kết hợp nhiều câu lệnh Select trong 1 lệnh Select.
Như bạn biết, theo quy tắc thì trong mỗi câu Select chỉ có duy nhất một lệnh Select mà thôi. Nhưng vì kết quả của lệnh này là trả về một bảng dữ liệu gần giống như một table nên ta có thể ví nó như một table tạm, dùng để join với một table khác.
Vì vậy ta có thể kết hợp kiểu này để tạo ra những câu truy vấn phức tạp hơn.
Hãy xem một ví dụ mẫu dưới đây:
SELECT
lastName, firstName
FROM
employees
WHERE
officeCode IN (SELECT
officeCode
FROM
offices
WHERE
country = 'USA');Trong ví dụ này thì đoạn code sau đây ta gọi là subquery.
(SELECT
officeCode
FROM
offices
WHERE
country = 'USA');Nó sẽ trả về một bảng dữ liệu tạm với một field duy nhất là officeCode. Lúc này câu lệnh select cha sẽ sử dụng toán tử IN để kiểm tra: officeCode IN officeCode_bang_tam.

Khi câu lệnh SQL có subquery thì SQL Server sẽ thực hiện các lệnh subquery trước, sau đó mới thực hiện lệnh ở bên ngoài (lệnh select cha).
2. Subquery nằm ở Where trong SQL Server
Trước tiên hãy tham khảo ví dụ dưới đây.
SELECT
order_id,
order_date,
customer_id
FROM
sales.orders
WHERE
customer_id IN (
SELECT
customer_id
FROM
sales.customers
WHERE
city = 'New York'
)
ORDER BY
order_date DESC;Tương tự như phần 1, ví dụ này trông khá đơn giản, subquery được đặt ở lệnh Where.

Trong đó lệnh subquery sẽ trả về một bảng dữ liệu tạm gồm danh sách các customer_id.
SELECT
customer_id
FROM
sales.customers
WHERE
city = 'New York'Lưu ý rằng bạn phải luôn đặt truy vấn con trong cặp ( .. ) nhé.
Truy vấn con còn được gọi là truy vấn bên trong, còn truy vấn cha ta gọi truy vấn bên ngoài.
3. Nested Subquery trong SQL Server
Một truy vấn con có thể được lồng trong một truy vấn con khác. SQL Server hỗ trợ tới 32 cấp độ lồng nhau. Hãy xem xét ví dụ sau:
SELECT
product_name,
list_price
FROM
production.products
WHERE
list_price > (
SELECT
AVG (list_price)
FROM
production.products
WHERE
brand_id IN (
SELECT
brand_id
FROM
production.brands
WHERE
brand_name = 'Strider'
OR brand_name = 'Trek'
)
)
ORDER BY
list_price;Trong đó truy vấn con đầu tiên sẽ trả về danh sách band_id của thương hiệu có tên là Strider hoặc Trek. Ta đặt tên là TABLE_TMP_1 nhé.
SELECT
brand_id
FROM
production.brands
WHERE
brand_name = 'Strider'
OR brand_name = 'Trek'Truy vấn con thứ hai sẽ tính trung bình cộng về giá của danh sách brand trả về từ TABLE_TMP_1. Table tạm này ta sẽ đặt tên là TABLE_TMP_2 nhé.
SELECT
AVG (list_price)
FROM
production.products
WHERE
brand_id IN TABLE_TMP_1nó sẽ trả về một table tạm chỉ có một giá trị duy nhất, lúc này ta chỉ cần sử dụng toán tử > để so sánh ở câu lệnh cha.
list_price > TABLE_TMP_2
4. Ví dụ khác về Subquery trong SQL Server
Dưới đây là những ví dụ subquery trong các toán tử thường gặp.
Toán tử All
SELECT
product_name,
list_price
FROM
production.products
WHERE
list_price >= ALL (
SELECT
AVG (list_price)
FROM
production.products
GROUP BY
brand_id
)EXISTS và NOT EXISTS
SELECT
customer_id,
first_name,
last_name,
city
FROM
sales.customers c
WHERE
EXISTS (
SELECT
customer_id
FROM
sales.orders o
WHERE
o.customer_id = c.customer_id
AND YEAR (order_date) = 2017
)
ORDER BY
first_name,
last_name;Subquery trong lệnh From
SELECT staff_id, COUNT(order_id) order_count FROM sales.orders GROUP BY staff_id;
SELECT
AVG(order_count) average_order_count_by_staff
FROM
(
SELECT
staff_id,
COUNT(order_id) order_count
FROM
sales.orders
GROUP BY
staff_id
) t;Trên là những kiến thức cơ bản nhất về Subquery trong SQL Server. Hy vọng qua bài này bạn hiểu được kiến thức cách tạo truy vấn con, chúc bạn học tốt nhé.