Thứ Hai, 24 tháng 7, 2023

Lọc kết quả ở Group By với lệnh Having trong Oracle

Ở lệnh SELECT chúng ta có WHERE dùng để lọc, vậy ở Group By sẽ lọc dữ liệu bằng cách nào? Rất đơn giản, bạn sẽ sử dụng lệnh HAVING, lệnh này có cách dùng giống với lệnh WHERE.

1. Cú pháp Having trong Oracle

Trước tiên mình sẽ đưa ra cú pháp:

1
2
3
4
5
SELECT expression1, expression2, ... expression_n
FROM tables 
WHERE conditions 
GROUP BY expression1, expression2, ... expression_n 
HAVING having_condition;

Trong đó:

  • expression1, expression2, ... expression_n là các column sẽ được chọn cho kết quả cuối cùng
  • tables là bảng cần truy vấn
  • conditions là điều kiện ở where
  • having_conditions là điều kiện của HAVING, cái này là chủ chốt của bài học hôm nay.

Có những điều kiện ta không thể lọc ở lệnh WHERE được. Ví dụ mình muốn lấy tổng số sinh viên của của từng khoa, và chỉ hiển thị khoa nào có tổng sinh viên lớn hơn 50.

Bài viết này được đăng tại [free tuts .net]

Bảng students sẽ có các thông tin như sau: id | name | department

Và nếu mình viết thế này là sai:

1
2
3
4
SELECT department, count(id) as total_student
FROM students
WHERE total_student> 50
GROUP BY department

Tại sao sai? Để giải thích mình sẽ nói qua câu lệnh SQL hoạt động như thế nào đã nhé. 

Như ta biết trong một câu lệnh SQL sẽ có rất nhiều lệnh con, vậy thứ tự hoạt động của nó như thế nào? Nó sẽ hoạt động như sau:

FROM > WHERE > GROUP BY > HAVING > DISTINCT > SELECT > ORDER BY

Dựa vào câu truy vấn ở trên thì ta thấy FROM -> WHERE, mà lúc này column  ở WHERE là total_student không hề tồn tại (vì lệnh SELECT chưa chạy), nên câu SQL này sai. Ta sẽ sửa lại như sau:

1
2
3
4
SELECT department, count(id) as total_student
FROM students
GROUP BY department
HAVING total_student > 50

2. Một vài ví dụ với lệnh HAVING trong Oracle

Giả sử cho bảng customers có dữ liệu như sau:

Hãy lấy danh sách state và tổng số khách hàng của state đó, và chỉ lấy state nào có từ 2  khách hàng trở lên.

1
2
3
4
SELECT state, COUNT(*) AS total_customer 
FROM customers 
GROUP BY state 
HAVING total_customer >= 2;

Giả sử giờ mình sửa lại điều kiện như sau: Lấy danh sách state và tổng số khách hàng có mức lương lớn hơn 10000, và chỉ lấy state nào có từ 2 khách hàng thỏa điều kiện trở lên.

1
2
3
4
5
SELECT state, COUNT(*) AS total_customer 
FROM customers 
WHERE salary > 10000 
GROUP BY state 
HAVING total_customer >= 2;

3. Lời kết

Trên là tất cả kiến thức về having trong Oracle mà mình muốn giới thiệu tới các bạn. 

Sau này khi nói đến Group by thì các bạn hãy nhớ tới Having nhé, vì đây là cặp mệnh đề đi liền với nhau, rất thường được sử dụng trong các câu truy vấn thống kê.

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