1. Câu lệnh GROUP BY

Câu lệnh  GROUP BY được sử dụng để nhóm các hàng có cùng giá trị trong câu lệnh truy vấn. Các nhóm này sẽ được nhóm lại theo cột. Câu lệnh GROUP BY thường được sử dụng kèm theo các hàm như: COUNT(), MAX(), MIN(), SUM(), AVG() để nhóm các kết quả theo một cột hoặc nhiều cột.

Cú pháp câu lệnh GROUP BY như sau:

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);

Trong đó:

  • SELECT column_name(s) là câu lệnh chọn các cột
  • table_name là bảng cần chọn
  • WHERE condition điều kiện chọn cho từng bảng ghi
  • GROUP BY column_name(s) là câu lệnh nhóm các kết quả theo cột được chỉ định

Chú ý: Trong câu lệnh GROUP BY column_name(s) thì tên cột được chọn làm nhóm phải được có ở trong câu lệnh SELECT column_name(s)

2. Ví dụ câu lệnh GROUP BY

2.1 Câu lệnh GROUP BY trong một bảng

Dưới đây là bảng KhachHang bao gồm các cột: ID, TenKH, DiaChi, ThanhPho, SoDienThoai

ID TenKH DiaChi ThanhPho SoDienThoai
1 Nguyen Van A Tay Ho Ha Noi 0888999888
2 Nguyen Van B Quan 5 Ho Chi Minh 0988988988
3 Nguyen Van C Quan 7 Ho Chi Minh 0899899899
4 Nguyen Van D Bac Tu Liem Ha Noi 0788788788
5 Nguyen Van E Ngo Quen Hai Phong 0858585858
6 Nguyen Van F Ngu Hanh Son Da Nang 0969696969
7 Nguyen Van G Tay Ho Ha Noi 0838383838

Câu lệnh SQL sau liệt kê (hay đếm) số lượng khách hàng ở mỗi thành phố và sắp xếp theo thứ tự A-Z. Câu lệnh thực hiện bằng cách sử dụng hàm COUT() để đếm các bản ghi theo trường ID trong bảng khách hàng và kết hợp với câu lệnh GROUP BY để nhóm lại theo cột ThanhPho như sau:

SELECT ThanhPho, COUNT(KhachHang.ID) AS SoLuongKH
FROM KhachHang
GROUP BY ThanhPho
ORDER BY ThanhPho ASC;

Kết quả:

ThanhPho SoLuongKH
Da Nang 1
Ha Noi 3
Hai Phong 1
Ho Chi Minh 2

2.2 Câu lệnh GROUP BY với hai bảng

Bảng đầu tiên trong ví dụ này sẽ có tên DatHang trong bảng này sẽ có các cột là: MaDH, SoLuong, KhachHang_ID, MaNG bên dưới đây là bảng DatHang

MaDH SoLuong KhachHang_ID MaNG
1 123 3 1
2 345 3 1
3 567 2 3
4 789 1 2

Bảng tiếp theo trong ví dụ này sẽ có tên là NguoiGui bao gồm các cột là: MaNG, TenNG như bên dưới:

MaNG TenNG
1 Nguoi Gui A
2 Nguoi Gui B
3 Nguoi Gui C

Câu lệnh SQL sau liệt kê số lượng đơn đặt hàng được gửi bởi mỗi người gửi hàng, trong câu lệnh này sẽ sử dụng mệnh đề LEFT JOIN kết hợp với câu lệnh GROUP BY như sau:

SELECT NguoiGui.TenNG, COUNT(DatHang.MaDH) AS SL_HangGui
FROM DatHang LEFT JOIN NguoiGui ON DatHang.MaNG = NguoiGui.MaNG
GROUP BY TenNG;

Kết quả:

TenNG SL_HangGui
Nguoi Gui A 2
Nguoi Gui B 1
Nguoi Gui C 1