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ụng WHERE vớ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ệnh GROUP BY. Bạn có thể sử dụng HAVING với các hàm tổng hợp.

3. Cú pháp của SQL HAVING

shell
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_idfirst_namelast_namedepartmentsalary
1JohnDoeSales1500000
2JaneSmithMarketing1700000
3BobJohnsonSales1300000
4AliceBrownHR2000000
5CharlieGreenMarketing1800000

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

shell
SELECT department, COUNT(employee_id) AS total_employees
FROM employees
GROUP BY department
HAVING COUNT(employee_id) > 1;

Kết quả:

departmenttotal_employees
Sales2
Marketing2

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

shell
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department
HAVING SUM(salary) > 3000000;

Kết quả:

departmenttotal_salary
Marketing3500000

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

shell
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 1600000;

Kết quả:

departmentavg_salary
Marketing1750000
HR2000000

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

shell
SELECT department, MAX(salary) AS max_salary
FROM employees
GROUP BY department
HAVING MAX(salary) > 1800000;

Kết quả:

departmentmax_salary
HR2000000

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

shell
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ả:

departmenttotal_salaryavg_salary
Marketing35000001750000

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

shell
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

shell
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

shell
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

shell
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!