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 |