HAVING
trong MySQLMệnh đề HAVING
trong MySQL thường được sử dụng để lọc các kết quả sau khi đã thực hiện các phép tính nhóm (GROUP BY
). Điểm khác biệt chính giữa HAVING
và WHERE
là HAVING
được áp dụng sau khi các bản ghi đã được nhóm lại, trong khi WHERE
được áp dụng trước khi quá trình nhóm diễn ra.
HAVING
column1
Giải thích:
SUM(quantity)
: Tính tổng số lượng cho mỗi product_id
.HAVING total_quantity > 50
: Chỉ hiển thị các sản phẩm có tổng số lượng bán ra lớn hơn 50.HAVING
Bạn cũng có thể sử dụng nhiều điều kiện trong mệnh đề HAVING
, tương tự như cách bạn sử dụng với WHERE
. Điều này cho phép bạn thực hiện các phép so sánh phức tạp hơn.
Giả sử bạn muốn lấy danh sách những sản phẩm có tổng số lượng bán ra lớn hơn 50 và tổng giá trị bán hàng (SUM(price * quantity)
) lớn hơn 10,000.
HAVING total_quantity > 50 AND total_sales > 10000
Giải thích:
COUNT(employee_id)
: Đếm số nhân viên trong mỗi phòng ban.HAVING num_employees > 5
: Chỉ hiển thị những phòng ban có hơn 5 nhân viên.HAVING
với ORDER BY
Bạn có thể kết hợp HAVING
với ORDER BY
để sắp xếp kết quả sau khi áp dụng điều kiện lọc của HAVING
.
Sắp xếp kết quả của ví dụ trên theo số lượng nhân viên giảm dần:
ORDER BY num_employees DESC
Giải thích:
HAVING total_salary > 500000 AND num_employees <= 100
: Điều kiện lọc các phòng ban có tổng lương lớn hơn 500,000 nhưng số lượng nhân viên không quá 100.HAVING
với aliasTrong nhiều trường hợp, bạn có thể sử dụng các alias (bí danh) cho các hàm tổng hợp và sử dụng chúng trong mệnh đề HAVING
.
COUNT(*) AS total_orders
Giải thích:
HAVING department_id IN (...)
: Lọc các phòng ban có tên chứa chữ "Sales".total_salary > 500000
: Chỉ hiển thị những phòng ban có tổng lương lớn hơn 500,000.HAVING
chỉ hoạt động sau khi đã thực hiện việc nhóm dữ liệu với GROUP BY
.HAVING
thường được sử dụng với các hàm tổng hợp (COUNT()
, SUM()
, AVG()
, v.v.), trong khi WHERE
không thể sử dụng với các hàm này.Mệnh đề HAVING
là một công cụ mạnh mẽ trong MySQL để lọc kết quả sau khi nhóm dữ liệu, đặc biệt là khi làm việc với các hàm tổng hợp. Nó cho phép bạn thực hiện các phép tính phức tạp và lọc kết quả dựa trên các giá trị được tổng hợp, giúp tăng hiệu quả và tính linh hoạt trong việc phân tích dữ liệu.
Giả sử bạn có bảng sales
với các cột region
, product_id
, quantity
, và total_price
. Bạn muốn biết các khu vực (region
) có tổng doanh thu (SUM(total_price)
) lớn hơn 100,000 và có số lượng sản phẩm bán ra (SUM(quantity)
) lớn hơn 500.
SUM(total_price)
Giải thích:
JOIN
liên kết bảng customers
với orders
dựa trên customer_id
.WHERE YEAR(o.order_date) = 2023
chỉ lấy các đơn hàng trong năm 2023.SUM(o.total_price)
tính tổng giá trị đơn hàng cho mỗi khách hàng.HAVING total_spent > 5000
lọc ra các khách hàng có tổng chi tiêu lớn hơn 5,000.HAVING
với hàm lồngGiả sử bạn có một bảng employees
chứa thông tin về nhân viên và tiền lương của họ, và bạn muốn tìm những phòng ban có mức lương trung bình lớn hơn mức lương trung bình của toàn bộ công ty.
employees(employee_id, department_id, salary)
AVG(salary)
Giải thích:
JOIN
giữa bảng orders
và products
để lấy các sản phẩm thuộc danh mục "Electronics".SUM(o.quantity)
tính tổng số lượng sản phẩm đã bán.HAVING total_quantity > 1000
lọc các sản phẩm có tổng số lượng bán ra lớn hơn 1,000.HAVING
để tìm tỷ lệ phần trămGiả sử bạn có bảng student_scores
lưu điểm của sinh viên. Bạn muốn tìm những sinh viên có tỷ lệ điểm số đạt được (score
) so với tổng điểm (total_possible_score
) lớn hơn 80%.
student_scores(student_id, score, total_possible_score)
SUM(score)
Giải thích:
COUNT(*)
đếm số đánh giá cho mỗi sản phẩm.AVG(rating)
tính điểm đánh giá trung bình cho mỗi sản phẩm.HAVING total_reviews > 10 AND avg_rating > 4
lọc những sản phẩm có hơn 10 đánh giá và điểm trung bình lớn hơn 4.HAVING
trong MySQL rất mạnh mẽ khi làm việc với các hàm tổng hợp.GROUP BY
), đặc biệt khi bạn cần so sánh các giá trị tổng hợp.HAVING
với các hàm tổng hợp, JOIN
, hoặc các toán tử logic như AND
, OR
, IN
mang lại sự linh hoạt cao trong việc xử lý dữ liệu phức tạp.Những ví dụ này cho thấy các tình huống nâng cao mà bạn có thể sử dụng mệnh đề HAVING
để xử lý và phân tích dữ liệu trong MySQL.