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.
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 WHERE
mệ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 BY
và 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
.
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.
HAVING
vớ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.Các bài viết liên quan:
Bình luận: