Mệnh đề HAVING cũng là một mệnh đề điều kiện có sự giống nhau với mệnh đề WHERE, tuy nhiên cách sử dụng thì lại rất khác nhau.
Trong bài viết trước chúng ta đã tìm hiểu về mệnh đề GROUP BY, với mệnh đề WHERE chỉ có thể đặt điều kiện đối với các thuộc tính(cột) vốn có của bảng, các thuộc tính được tạo sau khi trả kết quả đối chiếu cho các nhóm (Sum, Count, Average,…) được tạo bởi Group by thì không thể sử dụng WHERE đặt điều kiện đối với những thuộc tính này. Vậy trong bài viết này chúng ta sẽ tìm hiểu về mệnh đề HAVING, cách áp dụng mệnh đề HAVING.
Mệnh đề điều kiện HAVING
Mệnh đề HAVING được sử dụng để lọc các kết quả, nó tương tự như WHERE, nhưng được sử dụng để lọc các giá trị được tính toán sau khi GROUP BY được áp dụng.
Cú pháp mệnh đề HAVING
SELECT column_name
FROM table_name
WHERE condition
GROUP BY column_name
HAVING condition
Trong đó:
column_name(s)
là các cột được chọn để truy vấn.table_name
là tên bảng được truy vấn.condition
là các điều kiện để lọc dữ liệu. Nó có thể được sử dụng với các phép so sánh như =, <>, <, >, <=, >= và các từ khóa logic như AND và OR.GROUP BY column_name(s)
được sử dụng để nhóm kết quả theo một hoặc nhiều cột.HAVING condition
: Cũng là để lọc theo điều kiện, nhưng thực hiện với các thuộc tính sau khi Group by được áp dụng.
*Cú pháp mệnh đề HAVING sẽ luôn nằm sau mệnh đề GROUP BY, còn WHERE sẽ luôn phải đứng trước GROUP BY*
>>Xem thêm: Mệnh đề GROUP BY trong MySQL – Hướng dẫn và ví dụ sử dụng
Ví dụ sử dụng
Mình có bảng users lưu thông tin người dùng như bên dưới đây.
Trong bảng này, role tương ứng với các chức vụ 1 – admin, 2-manage, 3-user…và cột salary là mức lương của từng người dùng.
Bây giờ mình sẽ tính trung bình mức lương của mỗi nhóm vai trò bằng cách nhóm các nhóm role lại với mệnh đề Group by, và sau đó tính mức lương trung bình của từng nhóm bằng hàm AVG. Có thể viết câu lệnh SQL đầy đủ như sau.
SELECT role, AVG(salary) as avg_salary
FROM `users`
GROUP BY role
Kết quả thực hiện
Như vậy, có thể thấy mức lương trung bình các nhóm người dùng với nhóm role 1 lương trung bình là 6tr5, role 2 là 5tr4, và role 3 là 3tr750k.
Vậy bây giờ hãy thử sử dụng mệnh đề where đặt điều kiện để lấy các nhóm user có mức lương trung bình là trên 5tr nhé.
SELECT role, AVG(salary) as avg_salary
FROM `users`
WHERE avg_salary > 5000000
GROUP BY role
Lúc này chương trình sẽ báo lỗi như sau:
Lỗi không thể tìm thấy cột avg_salary, vì cột này được tạo sau khi mệnh đề GROUP BY được áp dụng nên mệnh đề where không được áp dụng trong trường hợp này.
Vậy để khác phục lỗi trên thay mệnh đề WHERE bằng mệnh đề HAVING.
SELECT role, AVG(salary) as avg_salary
FROM `users`
GROUP BY role
HAVING avg_salary > 5000000
Kết quả khi thực hiện câu lệnh sử dụng mệnh đề HAVING
Chúng ta có thể thấy role 3 vì có mức lương trung bình nhỏ hơn 5 triệu nên đã bị loại bỏ.
>>Xem thêm: Mệnh đề WHERE trong MySQL – Mệnh đề điều kiện
Tóm lại, mệnh đề HAVING được sử dụng với các thuộc tính được tạo sau khi câu lệnh GROUP BY được áp dụng, mệnh đề where được sử dụng với các thuộc tính vốn có của bảng dữ liệu.
Cảm ơn bạn đã đọc hết bài viết! Chúc bạn học tốt!
[XEM CÁC BÀI VIẾT CHUYÊN ĐỀ HỌC MYSQL CƠ BẢN TẠI ĐÂY]
XEM THÊM Câu lệnh INSERT INTO trong MySQL – Lệnh chèn dữ liệu vào bảng Câu lệnh CREATE TABLE trong MySQL – Lệnh tạo bảng mới Các kiểu dữ liệu trong MySQL (Data Types) – Học MySQL Câu lệnh SELECT trong MySQL – Khi nào thì dùng lệnh SELECT Mệnh đề FROM trong MySQL – truy vấn từ bảng nào Mệnh đề ORDER BY trong MySQL – Hướng dẫn và ví dụ áp dụng Mệnh đề GROUP BY trong MySQL – Hướng dẫn và ví dụ sử dụng