Hàm tổng hợp (aggregate) gộp nhiều hàng thành một giá trị: COUNT, SUM, AVG, MIN, MAX.
GROUP BY chia hàng thành các nhóm theo cột, rồi hàm tổng hợp tính trên từng nhóm. Vd doanh thu theo từng khách:
SELECT customer_id, SUM(amount)
FROM orders
GROUP BY customer_id;Quy tắc: mọi cột trong SELECT không nằm trong hàm tổng hợp phải có mặt trong GROUP BY.
WHERE vs HAVING — khác ở thời điểm lọc:
- WHERE lọc hàng trước khi gộp (không dùng được hàm tổng hợp).
- HAVING lọc nhóm sau khi gộp (dùng được hàm tổng hợp).
SELECT customer_id, SUM(amount) AS total
FROM orders
WHERE status = 'paid' -- lọc hàng trước
GROUP BY customer_id
HAVING SUM(amount) > 1000; -- lọc nhóm sauThứ tự xử lý logic: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. Lưu ý COUNT(*) đếm mọi hàng (kể cả hàng chỉ có NULL), còn COUNT(col) bỏ qua hàng có col là NULL.
Mẹo hiệu năng: đẩy mọi điều kiện không cần hàm tổng hợp vào WHERE (gom ít hàng hơn, tận dụng được index). Nâng cao: ROLLUP/CUBE/GROUPING SETS thêm dòng tổng phụ cho báo cáo; FILTER (WHERE ...) gom có điều kiện trong một truy vấn.