SQL Tips 09 – Cách hoạt động của GROUP BY và một số lưu ý

Trong thực tiễn làm việc với dữ liệu ta thường xuyên phải chia dữ liệu thành các nhóm và tính toán một số chỉ số nhất định trên từng nhóm. Để làm được điều này, trong SQL ta dùng mệnh đề GROUP BY

Cấu trúc query sử dụng GROUP BY như sau:


SELECT select_list
FROM table_source
[WHERE search_condition ]
[GROUP BY group_by_expression ]
[HAVING search_condition ]
[ORDER BY order_expression [ ASC | DESC ] ]

Thứ tự hoạt động của query trên như sau:

  1. Mệnh đề FROM tạo ra tập dữ liệu.
  2. Mệnh đề WHERE lọc dữ liệu mà đã được tạo ra bởi mệnh đề FROM.
  3. Mệnh đề GROUP BY nhóm tập dữ liệu mà đã được lọc bởi mệnh đề WHERE thành các nhóm để thực hiện tính toán.
  4. Mệnh đề HAVING lọc dữ liệu mà đã được nhóm bởi mệnh đề GROUP BY.
  5. Mệnh đề SELECT lấy ra các cột cần thể hiện và biến đổi, thực hiện tính toán trên tập dữ liệu (thường thông qua việc sử dụng các hàm tập hợp – aggregate functions).
  6. Mệnh đề ORDER BY sắp xếp thứ tự các bản ghi trong tập dữ liệu đã được biến đổi.

Lưu ý:

  • Bất kỳ cột nào xuất hiện trong mệnh đề SELECT mà không được dùng trong một hàm tập hợp (aggregate function) thì đều phải xuất hiện trong mệnh đề GROUP BY
  • Bạn nên lọc dữ liệu trước khi GROUP BY nhiều nhất có thể (dùng mệnh đề WHERE) vì nó sẽ giúp giảm số lượng bản ghi dữ liệu cần tính toán. Bạn chỉ nên lọc dữ liệu ở mệnh đề HAVING khi điều kiện lọc phụ thuộc vào hàm tập hợp, ví dụ như HAVING Count(*) > 2 hay HAVING Sum(Cost) < 1000
  • Thứ tự thực hiện các mệnh đề (FROM -> WHERE -> GROUP BY -> …) rất quan trọng, nắm vững kiến thức này sẽ giúp bạn viết query chính xác hơn. Ví dụ: bạn có thể sử dụng alias của 1 cột trong mệnh đề ORDER BY nhưng không thể sử dụng trong HAVING (vì HAVING xảy ra trước SELECT). Query sau đây sẽ trả ra kết quả chính xác:

SELECT
	Student as StudentName,
	count(1) as NoStudent
FROM student_table
GROUP BY Student
ORDER BY NoStudent desc

Nhưng nếu bạn sửa query này thành GROUP BY StudentName thì query sẽ báo lỗi khi chạy.

Add a Comment

Your email address will not be published.