GROUP BY nhóm rows có cùng giá trị thành groups, mỗi group trả về một row.
Quy tắc bắt buộc: mọi column trong SELECT phải hoặc là trong GROUP BY hoặc là aggregate function — SELECT dept, name, COUNT(*) GROUP BY dept lỗi vì name không trong GROUP BY và không phải aggregate (PostgreSQL strict, MySQL lenient).
Ví dụ thực tế: SELECT category, COUNT(*) as total, AVG(price) as avg_price, MAX(price) as max_price FROM products GROUP BY category ORDER BY total DESC.
Group by nhiều columns: GROUP BY year, month tạo group riêng cho mỗi cặp year-month.
ROLLUP cho subtotals: GROUP BY ROLLUP(dept, team) tự động thêm rows tổng hợp cho mỗi dept và grand total — dùng cho báo cáo.
CUBE: tất cả combinations của dimensions — GROUP BY CUBE(dept, year) tạo subtotals cho dept, year, và cả hai.
GROUPING SETS: chỉ định chính xác những groupings cần: GROUP BY GROUPING SETS ((dept), (year), ()) — flexible hơn ROLLUP/CUBE.
Pitfall: GROUP BY column không có index → full scan + sort — cân nhắc thêm index.
Xem toàn bộ Database cùng filter theo level & chủ đề con.