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.
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 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.
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 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.
Ví dụ kết hợp 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.
5. Tóm tắt sự khác biệt giữa 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.
This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.
Strictly Necessary Cookies
Strictly Necessary Cookie should be enabled at all times so that we can save your preferences for cookie settings.
If you disable this cookie, we will not be able to save your preferences. This means that every time you visit this website you will need to enable or disable cookies again.