Mệnh đề having trong SQL

5261 lượt xem

Như bạn đã biết, SQL là ngôn ngữ máy tính mang tính truy vấn cấu trúc, được dùng để tạo lạp, xử lý trên một hệ CSDL quan hệ, trong đó có nhiều lệnh như Select, Insert, Update, Merge, Delete, Truncate, Join. Trong đó Select là lệnh thường xuyên được dùng để thao tác với dữ liệu trên bảng nhất.

Having trong SQL là gì ?

Select bao gồm các từ khoá liên quan như From, Where, Group By, Having, Order by, cùng phối hợp để xử lý CSDL cho người dùng. Trong bài viết này, chúng ta sẽ đề cập đến câu lệnh having SQL – mệnh đề having cho phép xác định các điều kiện lọc nhóm kết quả nào sẽ xuất hiện trong kết quả cuối cùng. Hầu hết các câu lệnh, mệnh đề having trong SQL rất dễ thiết lập, người dùng không cần nhớ kỹ từng chi tiết mà vẫn có thể thao tác trên dữ liệu một cách dễ dàng.

Hàm Having trong ngôn ngữ lập trình có cấu trúc SQL

Lệnh HAVING trong SQL Server cho phép lọc kết quả truy vấn dựa trên các hàm tổng hợp và nhóm dữ liệu, điều mà mệnh đề WHERE không thể thực hiện được. WHERE chỉ lọc từng hàng riêng lẻ, trong khi HAVING áp dụng điều kiện cho các nhóm dữ liệu đã được tổng hợp.

Nói một cách đơn giản, lệnh HAVING áp dụng bộ lọc trên kết quả của GROUP BY theo điều kiện cụ thể, thường là các biểu thức Boolean sử dụng các toán tử logic như AND và OR. Mệnh đề HAVING khắc phục hạn chế của WHERE, giúp sử dụng với các biểu thức tổng hợp.

HAVING rất phổ biến trong SQL và hoạt động trên các nhóm dữ liệu tương tự như WHERE hoạt động trên từng hàng. Khi cần lọc một nhóm dữ liệu, HAVING là lựa chọn phù hợp.

Một số điểm quan trọng:

  • Mệnh đề HAVING được sử dụng để lọc dữ liệu dựa trên các điều kiện cụ thể trong các tập hợp dữ liệu lớn.
  • Thường được áp dụng trong các báo cáo chứa lượng dữ liệu khổng lồ để tinh chỉnh và chọn lọc kết quả.
  • Chỉ được sử dụng cùng với câu lệnh SELECT.
  • Các biểu thức trong mệnh đề HAVING có thể bao gồm hằng số.
  • Trong các truy vấn SQL, mệnh đề ORDER BY được đặt sau mệnh đề HAVING, nếu có.
  • Mệnh đề HAVING không được dùng để chỉnh sửa cột.
  • Được dùng sau mệnh đề GROUP BY để lọc các nhóm dữ liệu.

sql having

Cú pháp thực hiện Having trong SQL

Cú pháp hàm having trong sql sẽ có cấu trúc như sau:

SELECT cot1, cot2
FROM bang1, bang2
WHERE [ cac_dieu_kien ]
GROUP BY cot1, cot2
HAVING [ cac_dieu_kien ]
ORDER BY cot1, cot2

Tên biến hoặc giá trị biến

ham_tong

Bao gồm các hàm như SUM, COUNT, MIN, MAX hoặc AVG.

bieuthuc1, bieuthuc2, … bieuthuc_n

Các biểu thức không nằm bên trong hàm tổng và phải nằm trong mệnh đề GROUP BY.

WHERE dieukien

Tùy chọn. Đây là các điều kiện mà các bản ghi phải đáp ứng để được chọn.

HAVING dieukien_having

Điều kiện này áp dụng cho các kết quả tổng để giới hạn các nhóm của những hàng được trả về. Chỉ các nhóm mà điều kiện được đánh giá là TRUE mới nằm trong bộ kết quả.

Ví dụ ta có bảng “HOCPHI” được diễn giải như sau:

ID TEN TUOI MONHOC HOCPHI
01 VIET 20 CNTT 5.000.000
02 HUY 21 TC 4.500.000
03 UYEN 19 KT 3.000.000
04 KHANH 22 QTKD 3.500.000
05 NHUNG 23 TCNK 4.000.000
06 QUYNH 21 TCDN 3.500.000

Muốn lọc ra học viên có TUOI >20, HOCPHI > 3.000.000 và sắp xếp ID theo thứ tự tăng dần thì ta sử dụng cú pháp sau:

SELECT ID, TEN, TUOI, MONHOC, HOCPHI
FROM HOCPHI
WHERE TUOI>20
GROUP BY SUM(HOCPHI)
HAVING SUM(HOCPHI)>3000000
ORDER BY ID ASC

Khi đó, ta có bảng kết quả sau:

ID TEN TUOI MONHOC HOCPHI
02 HUY 21 TC 4.500.000
04 KHANH 22 QTKD 3.500.000
05 NHUNG 23 TCNK 4.000.000
06 QUYNH 21 TCDN 3.500.000

Tuy nhiên, để có được bảng kết quả này buộc chúng ta phải sử dụng group by having để cho ra cột SUM(HOCPHI) để có thể thực hiện đầy đủ cú pháp trên. Bảng HOCPHI không có học viên nào học 2 môn nên dùng Group by vẫn cho ra kết quả học phí như ban đầu, sau khi Group by, ta sẽ có bảng trung gian:

ID TEN TUOI MONHOC SUM(HOCPHI)
01 VIET 20 CNTT 5.000.000
02 HUY 21 TC 4.500.000
03 UYEN 19 KT 3.000.000
04 KHANH 22 QTKD 3.500.000
05 NHUNG 23 TCNK 4.000.000
06 QUYNH 21 TCDN 3.500.000

Một ví dụ khác về hàm Having trong SQL:

Để dễ hiểu hơn về cách dùng lệnh having trong sql, chúng tôi sẽ đưa ra một ví dụ về lọc nhân viên trong bản ghi có độ tuổi lớn hơn hoặc bằng hai lần như sau:

– Ví dụ, ta sẽ có một bảng NHANVIEN có các bản ghi như dưới đây:

ID TEN TUOI DIACHI LUONG
12 Trinh 32 Binhdinh 2000.00
3 Diep 25 Hanoi 1500.00
4 Lai 23 Hanam 2000.00
5 Thuy 25 Hue 6500.00
6 Nam 27 Danang 8500.00
7 Lan 22 HCM 4500.00
8 Dao 24 Hanoi 10000.00

– Bước tiếp theo, ta tiến hành sử dụng cú pháp theo hướng dẫn như trên để lọc nhân viên có độ tuổi lớn lớn hoặc bằng hai như sau:

SQL > SELECT ID, TEN, TUOI, DIACHI, LUONG

FROM NHANVIEN

GROUP BY tuoi

HAVING COUNT(tuoi) >= 2;

– Ngay sau đó, kết quả trả về chúng ta nhận được sẽ hiển thị như sau là:

ID TEN TUOI DIACHI LUONG
2 Diep 25 Hanoi 1500.00

Một số lưu ý khác khi sử dụng mệnh đề having

Trên đây là hướng dẫn các bạn sử dụng lệnh having sql. Nên chú ý sự khác biệt giữa mệnh đề having với mệnh đề where để thực hành cho đúng với yêu cầu. Sql ra đời khá lâu nhưng nó vẫn được sử dụng nhiều trong các doanh nghiệp và không có dấu hiệu bị lạc hậu bởi những ngôn ngữ khác xuất hiện sau này.

Ngoài ra, having trong sql còn nhiều sức mạnh khác khá phức tạp, đóng vai trò quan trọng trong công tác xử lý, quản lý và sử dụng CSDL, hỗ trợ thao tác cặn kẽ cho người dùng. Chúng ta cũng có thể dùng câu lệnh left join trong sql để sử dụng những chức năng tuyệt vời của nó trong việc xử lý, thao tác dữ liệu. Nếu có thể nắm vững cách sử dụng Having, người dùng sẽ không phải lo lắng với hàng tá CSDL quan hệ trên máy tính.

Kết luận

Do đó, để thành thạo hơn trong sử dụng sql, hay có kiến thức sâu hơn về hàm having trong sql bạn nên học một khóa học chuyên về sql để được hướng dẫn kỹ hơn cách sử dụng các lệnh trong sql từ cơ bản đến nâng cao.