Thứ Ba, 25 tháng 7, 2023

Subquery trong SQL Server - truy vấn con

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 đó.

Mục lục

  • 1. Tìm hiểu Subquery trong SQL Server
  • 2. Subquery nằm ở Where trong SQL Server
  • 3. Nested Subquery trong SQL Server
  • 4. Ví dụ khác về Subquery trong SQL Server
    • Toán tử All
    • EXISTS và NOT EXISTS
    • Subquery trong lệnh From

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:

1
2
3
4
5
6
7
8
9
10
11
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.

1
2
3
4
5
6
(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.

mysql subquery gif

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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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.

SQL Server Subquery png

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.

1
2
3
4
5
6
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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é.

1
2
3
4
5
6
7
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é.

1
2
3
4
5
6
SELECT
     AVG (list_price)
FROM
     production.products
WHERE
     brand_id IN TABLE_TMP_1

nó 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.

1
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

1
2
3
4
5
6
7
SELECT
   staff_id,
   COUNT(order_id) order_count
FROM
   sales.orders
GROUP BY
   staff_id;
1
2
3
4
5
6
7
8
9
10
11
12
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é.

=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master