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 tuyên bố như SELECT, INSERT, UPDATE, hoặc DELETE.

Ví dụ: hãy xem xét các bảng orderscustomers trong cơ sở dữ liệu mẫu BikeStores.

Subquery trong SQL Server

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ả:

Subquery trong SQL Server

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:

Subquery trong SQL Server

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'
Subquery trong SQL Server

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;
Subquery lồng nhau trong SQL Server

Đầ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 StriderTrek:

SELECT
    brand_id
FROM
    production.brands
WHERE
    brand_name = 'Strider'
OR brand_name = 'Trek';
Subquery trong SQL Server

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ặc NOT IN
  • Subquery với toán tử ANY hoặc ALL
  • Subquery với toán tử EXISTS hoặc NOT EXISTS
  • Subquery trong câu lệnh UPDATE, DELETE hoặc INSERT.
  • Subquery trong mệnh đề FROM.

Xem thêm về subquery trong SQL Server tại bài viết:

Subquery trong SQL Server
Tìm hiểu về truy vấn con (subquery) trong SQL Server và cách sử dụng truy vấn con để truy vấn dữ liệu.

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ử EXISTS trong SQL Server
Tìm hiểu cách sử dụng toán tử EXISTS trong SQL Server để kiểm tra sự tồn tại của các bản ghi trong một truy vấn con.

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ệnh SELECT 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.

Toán tử ANY trong SQL Server

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ệnh SELECT 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.

Toán tử ALL trong SQL Server

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;
Toán tử ALL trong SQL Server

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;
Toán tử ALL trong SQL Server

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;
Toán tử ALL trong SQL Server

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.

SQL ServerSubquery
Bài Viết Liên Quan:
INTERSECT trong SQL Server
Trung Nguyen 22/11/2020
INTERSECT trong SQL Server

Tìm hiểu cách sử dụng toán tử INTERSECT trong SQL Server để trả về phần giao nhau của các tập kết quả của hai truy vấn.

EXCEPT trong SQL Server
Trung Nguyen 22/11/2020
EXCEPT trong SQL Server

Tìm hiểu cách sử dụng EXCEPT trong SQL Server để loại trừ tập kết quả của một truy vấn ra khỏi tập kết quả của một truy vấn khác.

UNION trong SQL Server
Trung Nguyen 22/11/2020
UNION trong SQL Server

Tìm hiểu cách sử dụng UNION trong SQL Server để kết hợp kết quả của hai hoặc nhiều truy vấn thành một tập kết quả duy nhất.

Toán tử ALL trong SQL Server
Trung Nguyen 21/11/2020
Toán tử ALL trong SQL Server

Trong hướng dẫn này, bạn sẽ tìm hiểu cách sử dụng toán tử ALL trong SQL Server để so sánh một giá trị với danh sách tập hợp giá trị cột đơn.