Mệnh đề HAVINGWHERE đề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.

1. Sự khác biệt chính:

  • WHERE: Được sử dụng để lọc các hàng trước khi dữ liệu được nhóm bởi GROUP BYtrướ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 BYsau 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.

2. Cách hoạt động của 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.
  • Chỉ áp dụng trên các cột cụ thể, không thể sử dụng trên các giá trị tổng hợp.

Ví dụ với 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.

3. Cách hoạt động của 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.
  • Có thể sử dụng với các hàm tổng hợp như COUNT(), SUM(), AVG(),…

Ví dụ với 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ị.

4. Kết hợp WHEREHAVING:

Bạn có thể kết hợp cả WHEREHAVING 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.

Ví dụ kết hợp WHEREHAVING:

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.

5. Tóm tắt sự khác biệt giữa HAVINGWHERE:

Tiêu chíWHEREHAVING
Thời điểm áp dụngTrước khi nhóm (GROUP BY) hoặc hàm tổng hợpSau khi nhóm (GROUP BY) hoặc hàm tổng hợp
Áp dụng trênCác cột gốcCác cột gốc và hàm tổng hợp
Lọc dữ liệuLọc các hàng trước khi tính toán và nhómLọ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.