1. Giới thiệu
Câu lệnh HAVING trong MySQL được sử dụng để lọc dữ liệu sau khi các nhóm đã được tạo bằng câu lệnh GROUP BY. HAVING cho phép bạn áp dụng các điều kiện trên các hàm tổng hợp như COUNT(), SUM(), AVG(), MIN(), MAX(), trong khi câu lệnh WHERE không thể được sử dụng với các hàm tổng hợp.
Bài viết này sẽ giúp bạn hiểu rõ hơn về cách sử dụng HAVING, cú pháp và các ví dụ thực tế từ bảng dữ liệu giả định.
2. Sự khác biệt giữa WHERE và HAVING
WHERE: Được sử dụng để lọc các hàng trước khi dữ liệu được nhóm lại. Bạn không thể sử dụngWHEREvới các hàm tổng hợp.HAVING: Được sử dụng để lọc các nhóm dữ liệu sau khi chúng đã được nhóm lại bởi câu lệnhGROUP BY. Bạn có thể sử dụngHAVINGvới các hàm tổng hợp.
3. Cú pháp của SQL HAVING
SELECT column1, AGGREGATE_FUNCTION(column2)
FROM table_name
WHERE condition
GROUP BY column1
HAVING condition_on_aggregate_function;AGGREGATE_FUNCTION(column2): Hàm tổng hợp (nhưCOUNT(),SUM(),AVG()).HAVING condition_on_aggregate_function: Điều kiện được áp dụng cho kết quả của hàm tổng hợp.
4. Bảng dữ liệu giả định
Giả sử chúng ta có bảng employees với các thông tin như sau:
| employee_id | first_name | last_name | department | salary |
|---|---|---|---|---|
| 1 | John | Doe | Sales | 1500000 |
| 2 | Jane | Smith | Marketing | 1700000 |
| 3 | Bob | Johnson | Sales | 1300000 |
| 4 | Alice | Brown | HR | 2000000 |
| 5 | Charlie | Green | Marketing | 1800000 |
5. Cách sử dụng MySQL HAVING
a. Sử dụng HAVING với hàm COUNT()
Ví dụ 1: Tìm tất cả các phòng ban có hơn 1 nhân viên
SELECT department, COUNT(employee_id) AS total_employees
FROM employees
GROUP BY department
HAVING COUNT(employee_id) > 1;Kết quả:
| department | total_employees |
|---|---|
| Sales | 2 |
| Marketing | 2 |
Trong ví dụ này, HAVING COUNT(employee_id) > 1 lọc các phòng ban có hơn 1 nhân viên.
b. Sử dụng HAVING với hàm SUM()
Ví dụ 2: Tìm tất cả các phòng ban có tổng lương lớn hơn 3 triệu
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department
HAVING SUM(salary) > 3000000;Kết quả:
| department | total_salary |
|---|---|
| Marketing | 3500000 |
Trong ví dụ này, HAVING SUM(salary) > 3000000 lọc các phòng ban có tổng lương vượt quá 3 triệu.
c. Sử dụng HAVING với hàm AVG()
Ví dụ 3: Tìm tất cả các phòng ban có lương trung bình lớn hơn 1,600,000
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 1600000;Kết quả:
| department | avg_salary |
|---|---|
| Marketing | 1750000 |
| HR | 2000000 |
Trong ví dụ này, HAVING AVG(salary) > 1600000 chỉ trả về các phòng ban có lương trung bình lớn hơn 1,600,000.
d. Sử dụng HAVING với hàm MAX() và MIN()
Ví dụ 4: Tìm tất cả các phòng ban có mức lương cao nhất lớn hơn 1,800,000
SELECT department, MAX(salary) AS max_salary
FROM employees
GROUP BY department
HAVING MAX(salary) > 1800000;Kết quả:
| department | max_salary |
|---|---|
| HR | 2000000 |
Trong ví dụ này, HAVING MAX(salary) > 1800000 chỉ trả về các phòng ban có mức lương cao nhất vượt quá 1,800,000.
6. Sử dụng HAVING với nhiều điều kiện
Bạn có thể kết hợp nhiều điều kiện trong câu lệnh HAVING bằng các toán tử logic như AND hoặc OR.
Ví dụ 5: Tìm tất cả các phòng ban có tổng lương lớn hơn 3 triệu và lương trung bình trên 1,600,000
SELECT department, SUM(salary) AS total_salary, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING SUM(salary) > 3000000 AND AVG(salary) > 1600000;Kết quả:
| department | total_salary | avg_salary |
|---|---|---|
| Marketing | 3500000 | 1750000 |
Trong ví dụ này, HAVING lọc các phòng ban có cả tổng lương lớn hơn 3 triệu và lương trung bình trên 1,600,000.
7. Các ví dụ khác về HAVING trong MySQL
Ví dụ 1: Tìm các phòng ban có nhiều hơn 2 nhân viên
SELECT department, COUNT(employee_id) AS total_employees
FROM employees
GROUP BY department
HAVING COUNT(employee_id) > 2;Ví dụ 2: Tìm các phòng ban có tổng lương nhỏ hơn 3 triệu
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department
HAVING SUM(salary) < 3000000;Ví dụ 3: Tìm các phòng ban có lương trung bình lớn hơn 1,700,000 và có nhiều hơn 1 nhân viên
SELECT department, AVG(salary) AS avg_salary, COUNT(employee_id) AS total_employees
FROM employees
GROUP BY department
HAVING AVG(salary) > 1700000 AND COUNT(employee_id) > 1;Ví dụ 4: Tìm tất cả các phòng ban có lương cao nhất lớn hơn 1,800,000 hoặc tổng lương dưới 3 triệu
SELECT department, MAX(salary) AS max_salary, SUM(salary) AS total_salary
FROM employees
GROUP BY department
HAVING MAX(salary) > 1800000 OR SUM(salary) < 3000000;8. Một số lưu ý khi sử dụng HAVING trong MySQL
a. HAVING được sử dụng sau GROUP BY
Câu lệnh HAVING luôn được sử dụng sau câu lệnh GROUP BY. Nếu bạn không sử dụng GROUP BY, hãy sử dụng WHERE để lọc dữ liệu.
b. Sử dụng HAVING với các hàm tổng hợp
HAVING chủ yếu được sử dụng với các hàm tổng hợp (COUNT(), SUM(), AVG(), MAX(), MIN()) để lọc kết quả dựa trên các tính toán tổng hợp.
c. Có thể sử dụng HAVING mà không có GROUP BY
Trong một số trường hợp, bạn có thể sử dụng HAVING mà không có GROUP BY. Tuy nhiên, điều này hiếm khi được sử dụng và chỉ có ý nghĩa khi bạn sử dụng các hàm tổng hợp mà không cần nhóm dữ liệu.
Kết luận
SQL HAVING là một công cụ mạnh mẽ khi bạn cần lọc các kết quả sau khi đã nhóm dữ liệu bằng GROUP BY. HAVING cho phép bạn áp dụng các điều kiện trên các hàm tổng hợp như COUNT(), SUM(), AVG(),... Điều này giúp bạn dễ dàng thực hiện các phép phân tích và lọc dữ liệu theo từng nhóm một cách hiệu quả.
Hãy thử áp dụng các ví dụ này vào các bài tập và dự án thực tế trên CodeTutHub để nắm vững hơn về cách sử dụng SQL HAVING trong MySQL!








