Thứ Ba, 25 tháng 7, 2023

Lệnh Having trong SQL Server

Trong bài này chúng ta sẽ tìm hiểu về lệnh Having trong SQL Server, đây là lệnh giúp bạn thêm điều kiện lọc trong lệnh Group By mà chúng ta đã học ở bài trước.

Mục lục

  • 1. Lệnh Having trong SQL Server dùng để làm gì?
  • 2. Ví dụ Having trong SQL Server
    • Having với hàm Count
    • Having với hàm SUM
    • Having với hàm AVG

1. Lệnh Having trong SQL Server dùng để làm gì?

Như bạn biết, để thêm điều kiện lọc thì ta thường đặt trong lệnh WHERE. Tuy nhiên theo quy tắc hoạt động của câu SQL sẽ chạy ở Group By trước rồi mới đến Where. Vì vậy trường hợp bạn muốn thêm điều kiện trong lúc Group By thì có giải pháp nào không?

Thật may là ngôn ngữ T-SQL khá thông minh, nó cho phép bạn thêm điều kiện ở Group By bằng lệnh HAVING.

Cú pháp như sau:

1
2
3
4
5
6
7
8
SELECT
    select_list
FROM
    table_name
GROUP BY
    group_list
HAVING
    conditions;

Trong cú pháp này thì conditions chính là điều kiện lọc lúc group by.

Ví dụ: bạn muốn tìm tổng số học sinh theo thành phố, nhưng không đếm những học sinh có năm sinh là 2000.

SELECT city, count(student_id) as total
FROM Students
GROUP BY city
HAVING year_bon <> 2000

Bây giờ ta sẽ làm ví dụ thực tế hơn nhé.

2. Ví dụ Having trong SQL Server

Trước tiên hãy giúp mình tạp một số table như sau:

orders png

order items png

products png

Trong đó:

  • Table products dùng lưu trữ sản phẩm
  • Table orders dùng lưu trữ đơn hàng
  • Table order_items dùng lưu trữ danh sách sản phẩm của mỗi đơn hàng. Như vậy nó sẽ có mối quan hệ (n : 1) với cả hai bảng còn lại.

Having với hàm Count

Câu lệnh dưới đây sử dụng mệnh đề HAVING để tìm các khách hàng đã đặt ít nhất hai đơn hàng mỗi năm:

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
    customer_id,
    YEAR (order_date),
    COUNT (order_id) order_count
FROM
    sales.orders
GROUP BY
    customer_id,
    YEAR (order_date)
HAVING
    COUNT (order_id) >= 2
ORDER BY
    customer_id;

SQL Server HAVING example png

Having với hàm SUM

Câu lệnh dứoi đây tìm thấy giá niêm yết tối đa và tối thiểu trong mỗi loại sản phẩm. Sau đó, nó lọc ra sản phẩm có giá niêm yết tối đa lớn hơn 4.000 hoặc giá niêm yết tối thiểu dưới 500:

1
2
3
4
5
6
7
8
9
10
SELECT
    category_id,
    MAX (list_price) max_list_price,
    MIN (list_price) min_list_price
FROM
    production.products
GROUP BY
    category_id
HAVING
    MAX (list_price) > 4000 OR MIN (list_price) < 500;

SQL Server HAVING MIN MAX example png

Having với hàm AVG

Câu lệnh dưới đây tìm các chuyên mục sản phẩm có giá niêm yết trung bình (tất cả sản phẩm của chuyên mục đó) từ 500 đến 1.000:

1
2
3
4
5
6
7
8
9
SELECT
    category_id,
    AVG (list_price) avg_list_price
FROM
    production.products
GROUP BY
    category_id
HAVING
    AVG (list_price) BETWEEN 500 AND 1000;

SQL Server HAVING AVG example png

Trên là cách sử dụng Having trong SQL Server. Nếu bạn thường xuyên sử dụng Group By thì không thể thiếu câu lệnh này.

Và một lưu ý mình muốn nhắc nhở, đó là Having sẽ hoạt động trước lênh Where nhé. Vì vậy bạn không thể sử dụng Where để lọc trong lúc gom nhóm bằng Group By.

=============================
* 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