Trong bài viết này, bạn sẽ học cách sử dụng mệnh đề HAVING MySQL để chỉ định điều kiện lọc cho các nhóm hàng hoặc tập hợp.
Giới thiệu về mệnh đề HAVING trong MySQL
Mệnh đề HAVING được sử dụng trong câu lệnh SELECT để chỉ định các điều kiện lọc cho một nhóm hàng hoặc tập hợp.
Mệnh HAVINGđề thường được dùng với mệnh đề GROUP BY lọc nhóm dựa trên một điều kiện xác định. Nếu bạn bỏ qua mệnh đề GROUP BY, mệnh đề HAVING sẽ hoạt động giống như mệnh đề WHERE.
Sau đây minh họa cú pháp của mệnh đề HAVING:
SELECT
select_list
FROM
table_name
WHERE
search_condition
GROUP BY
group_by_expression
HAVING
group_condition;
Trong cú pháp này, bạn chỉ định một điều kiện trong mệnh đề HAVING.
Mệnh đề HAVING đánh giá từng nhóm được trả về bởi mệnh đề GROUP BY. Nếu kết quả là đúng, thì hàng đó được bao gồm trong tập hợp kết quả.
Lưu ý rằng mệnh đề HAVING áp dụng điều kiện lọc cho từng nhóm hàng, trong khi WHEREmệnh đề áp dụng điều kiện lọc cho từng hàng riêng lẻ.
MySQL đánh giá mệnh đề HAVING sau mệnh đề FROM, WHERE, SELECT và GROUP BYvà trước mệnh đề ORDER BY, và LIMIT:
Lưu ý rằng tiêu chuẩn SQL chỉ định rằng mệnh đề HAVING được đánh giá trước SELECT và sau mệnh đề GROUP BY.
Các ví dụ về mệnh đề HAVING trong MySQL
Hãy lấy một số ví dụ về việc sử dụng mệnh đề HAVING để xem nó hoạt động như thế nào. Chúng tôi sẽ sử dụng bảng orderdetails trong cơ sở dữ liệu mẫu để minh họa.
Sau đây sử dụng mệnh đề GROUP BY để lấy số đơn đặt hàng, số lượng mặt hàng được bán trên mỗi đơn hàng và tổng doanh số cho mỗi mặt hàng từ bảng orderdetails:
SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach*quantityOrdered) AS total
FROM
orderdetails
GROUP BY ordernumber;
Kết quả:
Bây giờ, bạn có thể tìm đơn hàng nào có tổng doanh số lớn hơn 1000 bằng cách sử dụng mệnh đề HAVING như sau:
SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach*quantityOrdered) AS total
FROM
orderdetails
GROUP BY
ordernumber
HAVING
total > 1000;
Kết quả:
Có thể hình thành một điều kiện phức tạp trong mệnh đề HAVING bằng cách sử dụng các toán tử logic như OR và AND.
Ví dụ sau sử dụng mệnh đề HAVING để tìm các đơn đặt hàng có tổng số tiền lớn hơn 1000 và chứa nhiều hơn 600 các mặt hàng:
SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach*quantityOrdered) AS total
FROM
orderdetails
GROUP BY ordernumber
HAVING
total > 1000 AND
itemsCount > 600;
Kết quả:
Giả sử bạn muốn tìm tất cả các đơn đặt hàng đã được giao và có tổng số tiền lớn hơn 1500, bạn có thể JOIN bảng orderdetails với bảng orders bằng cách sử dụng mệnh đề INNER JOIN và áp dụng một điều kiện trên cột status và total tổng hợp như trong truy vấn sau:
SELECT
a.ordernumber,
status,
SUM(priceeach*quantityOrdered) total
FROM
orderdetails a
INNER JOIN orders b
ON b.ordernumber = a.ordernumber
GROUP BY
ordernumber,
status
HAVING
status = 'Shipped' AND
total > 1500;
Kết quả:
Mệnh đề HAVING chỉ hữu ích khi bạn sử dụng nó với mệnh đề GROUP BY để tạo đầu ra của các báo cáo cấp cao. Ví dụ: bạn có thể sử dụng mệnh đề HAVING để trả lời các câu hỏi như tìm số lượng đơn đặt hàng trong tháng này, quý này hoặc năm nay có tổng số tiền lớn hơn 10K.
Tổng kết
- Sử dụng mệnh đề MySQL
HAVINGvới mệnh đềGROUP BYđể chỉ định điều kiện lọc cho các nhóm hàng hoặc tập hợp. - Tham khảo thêm ở: https://www.mysqltutorial.org/mysql-having.aspx
Các bài viết liên quan:
