SQL Server: Hướng dẫn subquery trong SQL Server từ A-Z
Trong hướng dẫn này, bạn sẽ tìm hiểu về truy vấn con (subquery), toán tử EXISTS
, ANY
, ALL
trong SQL Server và cách sử dụng truy vấn con để truy vấn dữ liệu.
Subquery trong SQL Server
Giới thiệu về Subquery trong SQL Server
Một subquery là một truy vấn lồng vào bên trong một câu lệnh như SELECT
, INSERT
, UPDATE
hoặc DELETE
.
Ví dụ: hãy xem bảng orders
và customers
trong cơ sở dữ liệu mẫu BikeStores.
Câu lệnh sau đây chỉ ra cách sử dụng một truy vấn con trong mệnh đề WHERE
của một câu lệnh SELECT
để tìm đơn đặt hàng bán hàng của những khách hàng ở New York
:
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;
Đây là kết quả:
Trong ví dụ này, câu lệnh sau là một truy vấn con:
SELECT
customer_id
FROM
sales.customers
WHERE
city = 'New York'
Lưu ý rằng bạn phải luôn đặt câu truy vấn
SELECT
của một truy vấn con trong dấu ngoặc đơn()
.
Truy vấn con còn được gọi là truy vấn bên trong hoặc vùng chọn bên trong trong khi câu lệnh chứa truy vấn con được gọi là vùng chọn bên ngoài hoặc truy vấn bên ngoài:
SQL Server thực thi toàn bộ ví dụ truy vấn ở trên như sau:
Đầu tiên, SQL Server thực hiện truy vấn con để lấy danh sách mã khách hàng của những khách hàng có địa chỉ ở New York
.
SELECT
customer_id
FROM
sales.customers
WHERE
city = 'New York'
Tiếp theo, SQL Server sử dụng các mã khách hàng được trả về bởi truy vấn con gắn vào toán tử IN
và thực hiện truy vấn bên ngoài để có được tập kết quả cuối cùng.
Như bạn có thể thấy, bằng cách sử dụng truy vấn con, bạn có thể kết hợp hai bước với nhau. Truy vấn con loại bỏ nhu cầu chọn mã khách hàng và gắn chúng vào truy vấn bên ngoài. Hơn nữa, bản thân truy vấn sẽ tự động điều chỉnh bất cứ khi nào dữ liệu khách hàng thay đổi.
Subquery lồng nhau 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 đa 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;
Đầu tiên, SQL Server thực thi truy vấn con sau để nhận danh sách các mã thương hiệu của thương hiệu Strider
và Trek
:
SELECT
brand_id
FROM
production.brands
WHERE
brand_name = 'Strider'
OR brand_name = 'Trek';
Tiếp theo, SQL Server tính toán bảng giá trung bình của tất cả các sản phẩm thuộc các thương hiệu đó.
SELECT
AVG (list_price)
FROM
production.products
WHERE
brand_id IN (6,9)
Cuối cùng, SQL Server tìm các sản phẩm có giá niêm yết lớn hơn giá niêm yết trung bình của tất cả các sản phẩm có nhãn hiệu Strider
hoặc Trek
.
Các loại subquery trong SQL Server
Bạn có thể sử dụng một truy vấn con (subquery) ở nhiều nơi như:
- Subquery thay cho một biểu thức
- Subquery với toán tử
IN
hoặcNOT IN
- Subquery với toán tử
ANY
hoặcALL
- Subquery với toán tử
EXISTS
hoặcNOT EXISTS
- Subquery trong câu lệnh
UPDATE
,DELETE
hoặcINSERT
. - Subquery trong mệnh đề
FROM
.
Xem thêm về subquery trong SQL Server tại bài viết:
Toán tử EXISTS trong SQL Server
Tổng quan về toán tử EXISTS trong SQL Server
Toán tử EXISTS
là một toán tử logic cho phép bạn kiểm tra xem một subquery có trả về bất kỳ bản ghi nào không. Toán tử EXISTS
trả về TRUE
nếu subquery trả về một hoặc nhiều bản ghi.
Sau đây minh họa cú pháp của toán tử EXISTS
trong SQL Server :
EXISTS ( subquery)
Trong cú pháp này, truy vấn con chỉ là một câu lệnh SELECT
. Ngay sau khi truy vấn con trả về các bản ghi, toán tử EXISTS
sẽ trả về TRUE
và ngừng xử lý ngay lập tức.
Lưu ý rằng ngay cả khi truy vấn con trả về một giá trị
NULL
, toán tửEXISTS
vẫn trả vềTRUE
.
Ví dụ về toán tử EXISTS trong SQL Server
Hãy lấy một số ví dụ để hiểu cách hoạt động của toán tử EXISTS
.
Sử dụng toán tử EXISTS với một truy vấn con trả về NULL
Hãy xem bảng customers
trong cơ sở dữ liệu mẫu BikeStores.
Ví dụ sau đây trả về tất cả các bản ghi từ bảng customers
:
SELECT
customer_id,
first_name,
last_name
FROM
sales.customers
WHERE
EXISTS (SELECT NULL)
ORDER BY
first_name,
last_name;
Trong ví dụ này, truy vấn con trả về một tập hợp kết quả có chứa NULL
, nhưng do toán tử EXISTS
trả về TRUE
. Do đó, toàn bộ truy vấn trả về tất cả các bản ghi từ bảng customers
.
Xem thêm về toán tử EXISTS
trong SQL Server tại bài viết:
Toán tử ANY trong SQL Server
Giới thiệu về toán tử ANY trong SQL Server
Toán tử ANY
là một toán tử logic so sánh một giá trị với một tập các giá trị cột đơn trả về bởi một subquery.
Sau đây là cú pháp của toán tử ANY
:
scalar_expression comparison_operator ANY (subquery)
Trong cú pháp này:
scalar_expression
là bất kỳ biểu thức hợp lệ nào.comparison_operator
là bất kỳ toán tử so sánh hợp lệ nào bao gồm bằng (=), không bằng (<>), lớn hơn (>), lớn hơn hoặc bằng (>=), nhỏ hơn (<), nhỏ hơn hoặc bằng (<=).subquery
là một câu lệnhSELECT
trả về tập kết quả của một cột duy nhất với dữ liệu giống như kiểu dữ liệu của biểu thức.
Giả sử subquery trả về một danh sách các giá trị v1
, v2
, …, vn
. Toán tử ANY
sẽ trả về TRUE
nếu có bất kỳ biểu thức so sánh (scalar_expression
, vi
) trả về TRUE
. Nếu không, nó sẽ trả về FALSE
.
Lưu ý rằng toán tử
SOME
tương đương với toán tửANY
.
Ví dụ về toán tử ANY trong SQL Server
Hãy xem bảng products
trong cơ sở dữ liệu mẫu BikeStores.
Ví dụ sau đây tìm các sản phẩm đã được bán với nhiều hơn hai đơn vị trong một đơn đặt hàng:
SELECT
product_name,
list_price
FROM
production.products
WHERE
product_id = ANY (
SELECT
product_id
FROM
sales.order_items
WHERE
quantity >= 2
)
ORDER BY
product_name;
Trong hướng dẫn này, bạn đã tìm hiểu cách sử dụng toán tử ANY
trong SQL Server để so sánh một giá trị với một tập giá trị cột đơn.
Toán tử ALL trong SQL Server
Tổng quan về toán tử ALL trong SQL Server
Toán tử ALL
trong SQL Server là một toán tử logic so sánh một giá trị với một danh sách giá trị cột đơn được trả về bởi một truy vấn con.
Sau đây minh họa cú pháp toán tử ALL
trong SQL Server:
scalar_expression comparison_operator ALL ( subquery)
Trong cú pháp này:
scalar_expression
là bất kỳ biểu thức hợp lệ nào.comparison_operator
là bất kỳ toán tử so sánh hợp lệ nào bao gồm bằng (=), không bằng (<>), lớn hơn (>), lớn hơn hoặc bằng (>=), nhỏ hơn (<), nhỏ hơn hoặc bằng (<=).- Trong
subquery
là một câu lệnhSELECT
trả về kết quả của một cột duy nhất. Ngoài ra, kiểu dữ liệu của cột trả về phải cùng kiểu dữ liệu với kiểu dữ liệu của biểu thức.
Toán tử ALL
sẽ trả về TRUE
nếu tất cả các cặp biểu thức (scalar_expression
, v
) trả về TRUE
; với v là một giá trị trong tập giá trị cột đơn.
Nếu một trong các cặp biểu thức (scalar_expression
, v
) trả về FALSE
thì toán tử ALL
sẽ trả về FALSE
.
Ví dụ về toán tử ALL trong SQL Server
Hãy xem bảng products
trong cơ sở dữ liệu mẫu BikeStores.
Câu lệnh sau trả về giá niêm yết trung bình của các sản phẩm cho từng thương hiệu:
SELECT
AVG (list_price) avg_list_price
FROM
production.products
GROUP BY
brand_id
ORDER BY
avg_list_price;
scalar_expression > ALL ( subquery )
Biểu thức trả về TRUE
nếu giá trị scalar_expression
lớn hơn giá trị lớn nhất được trả về bởi truy vấn con (subquery).
Ví dụ: truy vấn sau đây tìm các sản phẩm có giá niêm yết lớn hơn giá niêm yết trung bình của các sản phẩm thuộc tất cả các thương hiệu:
SELECT
product_name,
list_price
FROM
production.products
WHERE
list_price > ALL (
SELECT
AVG (list_price) avg_list_price
FROM
production.products
GROUP BY
brand_id
)
ORDER BY
list_price;
scalar_expression < ALL ( subquery )
Biểu thức trả về TRUE
nếu giá trị scalar_expression
nhỏ hơn giá trị nhỏ nhất được trả về bởi truy vấn con (subquery).
Ví dụ sau đây tìm các sản phẩm có giá niêm yết nhỏ hơn giá nhỏ nhất trong bảng giá trung bình theo thương hiệu:
SELECT
product_name,
list_price
FROM
production.products
WHERE
list_price < ALL (
SELECT
AVG (list_price) avg_list_price
FROM
production.products
GROUP BY
brand_id
)
ORDER BY
list_price DESC;
Tương tự, bạn có thể lấy ví dụ của riêng mình về việc sử dụng toán tử ALL
với một trong các toán tử so sánh sau, chẳng hạn như bằng (=), lớn hơn hoặc bằng (>=), nhỏ hơn hoặc bằng (<=) và không bằng (<>).
Trong hướng dẫn này, bạn đã tìm hiểu về truy vấn con (subquery), toán tử EXISTS
, ANY
, ALL
trong SQL Server và cách sử dụng truy vấn con để truy vấn dữ liệu.