Mệnh đề HAVING
và WHERE
đều được dùng để lọc kết quả trong MySQL, nhưng chúng có sự khác biệt rõ ràng về cách hoạt động và thời điểm chúng được áp dụng trong quá trình truy vấn.
WHERE
: Được sử dụng để lọc các hàng trước khi dữ liệu được nhóm bởi GROUP BY
và trước khi bất kỳ hàm tổng hợp nào (như COUNT
, SUM
, AVG
, v.v.) được áp dụng. WHERE
chỉ có thể áp dụng trên các cột dữ liệu gốc.HAVING
: Được sử dụng để lọc các hàng sau khi dữ liệu đã được nhóm bởi GROUP BY
và sau khi các hàm tổng hợp được tính toán. HAVING
có thể sử dụng cả các cột gốc và các hàm tổng hợp.WHERE
:WHERE
lọc các hàng dựa trên các điều kiện trước khi dữ liệu được nhóm và tổng hợp.WHERE
:Giả sử bạn có bảng orders
với các cột customer_id
, order_date
, và order_amount
, và bạn muốn lấy những đơn hàng có giá trị lớn hơn 500.
SELECT customer_id, order_date, order_amount FROM orders WHERE order_amount > 500;
Trong ví dụ này, WHERE
lọc các hàng mà giá trị order_amount
lớn hơn 500, trước khi bất kỳ phép nhóm hay tính toán nào được thực hiện.
HAVING
:HAVING
lọc các nhóm kết quả sau khi dữ liệu đã được nhóm (GROUP BY
) và sau khi các hàm tổng hợp được tính toán.COUNT()
, SUM()
, AVG()
,…HAVING
:Giả sử bạn muốn lấy danh sách các khách hàng có tổng giá trị đơn hàng (SUM(order_amount)
) lớn hơn 1000.
SELECT customer_id, SUM(order_amount) AS total_amount FROM orders GROUP BY customer_id HAVING total_amount > 1000;
Trong ví dụ này, HAVING
lọc các nhóm khách hàng có tổng giá trị đơn hàng lớn hơn 1000, sau khi đã nhóm các hàng theo customer_id
và tính toán tổng giá trị.
WHERE
và HAVING
:Bạn có thể kết hợp cả WHERE
và HAVING
trong cùng một truy vấn. WHERE
lọc dữ liệu trước khi nhóm, trong khi HAVING
lọc kết quả sau khi nhóm.
WHERE
và HAVING
:Giả sử bạn chỉ muốn tính tổng giá trị đơn hàng của những khách hàng đã đặt các đơn hàng lớn hơn 200 và chỉ lấy những khách hàng có tổng đơn hàng lớn hơn 1000.
SELECT customer_id, SUM(order_amount) AS total_amount FROM orders WHERE order_amount > 200 GROUP BY customer_id HAVING total_amount > 1000;
Trong ví dụ này:
WHERE order_amount > 200
: Lọc các đơn hàng có giá trị lớn hơn 200 trước khi nhóm.HAVING total_amount > 1000
: Lọc các nhóm khách hàng có tổng giá trị đơn hàng lớn hơn 1000 sau khi nhóm.HAVING
và WHERE
:Tiêu chí | WHERE | HAVING |
---|---|---|
Thời điểm áp dụng | Trước khi nhóm (GROUP BY ) hoặc hàm tổng hợp | Sau khi nhóm (GROUP BY ) hoặc hàm tổng hợp |
Áp dụng trên | Các cột gốc | Các cột gốc và hàm tổng hợp |
Lọc dữ liệu | Lọc các hàng trước khi tính toán và nhóm | Lọc các nhóm sau khi đã tính toán và nhóm |
WHERE
dùng để lọc các hàng riêng lẻ trước khi thực hiện phép tính tổng hợp hoặc nhóm, còn HAVING
lọc kết quả tổng hợp hoặc nhóm sau khi đã tính toán.