1. Mệnh đề HAVING

Mệnh đề HAVING được sử dụng để làm điều kiện giới hạn các kết quả trả về trong một nhóm (GROUP), Các mệnh đề HAVING được thêm vào SQL bởi vì mệnh đề WHERE không thể được sử dụng với một số hàm tổng hợp như: COUNT, SUM, AVG…

Cú pháp mệnh đề HAVING như sau:

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

Trong đó:

  • SELECT column_name(s) là câu lệnh chọn các cột
  • FROM table_name là chọn từ bảng chứa các cột cần chọn
  • WHERE condition là điều kiện cho một bản ghi
  • GROUP BY column_name(s) là câu lệnh nhóm các cột có cùng điểm chung
  • HAVING condition là điều kiện cho một nhóm

Chú ý: Mệnh đề HAVING phải được ghép nối với câu lệnh GROUP BY để trích xuất dữ liệu. Nếu không có thì một lỗi được tạo ra.

2. Ví dụ mệnh đề HAVING

2.1 Mệnh đề HAVING 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 dưới đây sẽ đếm số lượng khách hàng theo cột ID, sau đó sẽ nhóm số lượng khách hàng ở mỗi thành phố theo cột ThanhPho và sử dụng mệnh đề HAVING để làm điều kiện chọn ra các nhóm mà có số lượng khách hàng lớn hơn hoặc bằng 2

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

Kết quả:

ThanhPho SoLuongKH
Ha Noi 3
Ho Chi Minh 2

2.2 Mệnh đề HAVING 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 sẽ liệt kê số lượng đơn đặt hàng được gửi bởi mỗi tên người gửi, 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 và sử dụng HAVING làm điều kiện chọn ra các nhóm có số lượng hàng gửi bằng 1

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

Kết quả:

TenNG SL_HangGui
Nguoi Gui B 1
Nguoi Gui C 1