Thứ Tư, 26 tháng 7, 2023

Group By trong MySQL

Group By trong MySQL có công dụng gom nhóm dữ liệu theo một hoặc nhiều field nào đó. Nó rất hữu ích khi xuất dữ liệu trong báo cáo, nhưng sẽ ảnh hưởng đến tốc độ xử lý của cấu truy vấn.

Nói là ảnh hưởng nhưng thực tế bắt buộc ta phải sử dụng lệnh này, nếu không bạn sẽ không thể lọc dữ liệu chính xác được.

Mục lục

  • 1. Giới thiệu Group By trong MySQL
  • 2. Cách sư dụng Group By trong MySQL
  • 3. Dùng Having để thêm điều kiện cho Group By

1. Giới thiệu Group By trong MySQL

Mệnh đề GROUP BY sẽ gom nhóm dữ liệu và chỉ trả về một record cho một nhóm duy nhất, vì vậy nó giúp giảm bớt dữ liệu không cần thiết trong kết quả trả về.

Lệnh này thường kết hợp với các hàm như: SUM, AVG, MAX, MIN và COUNT để đếm hoặc lấy thông tin cần thiết trả về cho từng nhóm.

Bài viết này được đăng tại tranvanbinh.vn

Cú pháp như sau:

1
2
3
4
5
6
7
SELECT
    c1, c2,..., cn
FROM
    table
WHERE
    where_conditions
GROUP BY c1 , c2,...,cn;

* Lưu ý:

  • Lệnh Group By có khoảng trắng, và nó phải nằm sau lệnh WHERE.
  • Những field có trong group by bắt buộc phải có trong Select.
  • Thứ tự thực thi câu lệnh sẽ là: From -> Where -> Select -> Group By

2. Cách sư dụng Group By trong MySQL

Cho bảng Students có dữ liệu như sau:

student data JPG

Bài toán 1: Hãy lấy danh sách tuổi và số sinh viên có độ tuổi đó.

Với bài toán này ta phải hiển thị hai thông tin: Tuổi | Số sinh viên có độ tuổi này. Ví dụ tuổi 20 thì sẽ có 2 sinh viên, tuổi 21 có 2 sinh viên, tuổi 22 có một sinh viên.

Vì bài toán yêu cầu lấy danh sách theo tuổi nên ta sẽ gom nhóm theo tuổi. Hãy thử câu lệnh sau:

1
2
3
SELECT student_age
FROM students
    GROUP BY student_age

Kết quả:

student age JPG

Đây không phải là kết quả mong muốn, bởi chưa có thông tin số sinh viên thuộc độ tuổi đó.

Vì kết quả nó trả về 1 record, chính là đại diện cho nhóm nên ta có thể sử dụng hàm Count để đếm số record trong nhóm. Đây cũng chính là số sinh viên thuộc độ tuổi đó. Bạn có thể đếm một field bất kì nhé.

1
2
3
SELECT student_age, COUNT(student_name) AS total_students
FROM students
    GROUP BY student_age

Kết quả:

student group result 1 JPG

* Ghi nhớ: Các hàm Count, Max, Sum sẽ có tác dụng đến các records trong nhóm ở câu lệnh group by.

Bài toán 2: Đếm tổng số tuổi của tất cả sinh viên và hiển thị theo lớp (class_id).

Bài này ta sử dụng hàm SUM và gom nhóm theo class_id là được.

1
2
3
SELECT  class_id, SUM(student_age) AS total_age
FROM students
GROUP BY class_id

Kết quả:

group by sum JPG

3. Dùng Having để thêm điều kiện cho Group By

Bạn có thể thêm điều kiện lọc ở lệnh Group By bằng cách sử dụng mệnh đề Having. Lúc này thứ tự chạy sẽ như sau:

  • From -> Where -> Select -> Group By -> Having -> Order By -> Limit

Quay lại dữ liệu ở trên mình sẽ ra một bài toán như sau: Đếm tổng số sinh viên theo từng lớp, và chỉ trả về lớp nào có từ 2 sinh viên trở đi.

Mình sẽ hiển thị lại bảng dữ liệu cho bạn dễ hình dung.

student data JPG

Bạn hãy nhìn thứ tự chạy ở trên để suy ngẫm nhé. Kết quả mong muốn phải được lấy từ lệnh Group By nên điều kiện này không thể đặt ở Where được (where chạy trước group by). Vì vậy ta phải đặt trong Having.

1
2
3
4
SELECT  class_id, COUNT(student_age) AS total_student
FROM students
GROUP BY class_id
HAVING total_student >= 2

Kết quả:

having theo lop JPG

Bạn hãy thử đặt điều kiện ở lệnh Where xem thế nào nhé.

1
2
3
4
SELECT  class_id, COUNT(student_age) AS total_student
FROM students
WHERE total_student >= 2
GROUP BY class_id

Chạy lên sẽ nhận được lỗi không tồn tại field total_student.

1
2
3
4
5
Error Code : 1054
Unknown column 'total_student' in 'where clause'
Execution Time : 00:00:00:000
Transfer Time  : 00:00:00:000
Total Time     : 00:00:00:000

Trên là cách sử dụng lệnh Group By và Group By có Having trong MySQL. Hy vọng đây qua bài này bạn sẽ hiểu hơn về lệnh Group By trong MySQL để có cách sử dụng chính xác hơn.

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