在編寫 SQL 查詢時,數據過濾是常見需求。WHERE 和 HAVING 子句雖然都用于篩選數據,但實際用法大不相同。本文通過具體示例對比兩者的核心區別,并結合實際場景演示聯合使用技巧,助力快速掌握這兩個關鍵工具的正確用法。
一、數據表結構
假設存在?sales
?表,其結構如下:
sale_id | product_id | sale_date | sale_amount |
---|---|---|---|
1 | 101 | 2024-01-01 | 100 |
2 | 101 | 2024-01-02 | 200 |
3 | 102 | 2024-01-03 | 150 |
4 | 103 | 2024-01-04 | 300 |
5 | 103 | 2024-01-05 | 250 |
二、WHERE 子句
(一)功能
用于過濾行數據,直接作用于表中的單行數據,在分組操作之前應用。
(二)特點
不能使用聚合函數。
假設嘗試在?WHERE
?中使用聚合函數:
SELECT product_id, SUM(sale_amount) AS total_sales
FROM sales
WHERE SUM(sale_amount) > 150; -- ? 錯誤:WHERE 無法使用聚合函數
錯誤原因:
執行?WHERE
?時,尚未對?sale_amount
?進行求和計算,因此?SUM(sale_amount)
?不存在。
(三)準確示例
假設要找出?sale_amount
?大于 150 的銷售記錄。
SELECT *
FROM sales
WHERE sale_amount > 150;
結果:
sale_id | product_id | sale_date | sale_amount |
---|---|---|---|
2 | 101 | 2024-01-02 | 200 |
4 | 103 | 2024-01-04 | 300 |
5 | 103 | 2024-01-05 | 250 |
三、HAVING 子句
(一)功能
用于過濾分組后的結果集,作用于分組后的數據,在分組操作之后應用。
(二)特點
可以使用聚合函數(如?SUM()
、AVG()
、COUNT()
?等)來定義過濾條件。
(三)具體示例
假設要找出銷售總額超過 400 的產品。
SELECT product_id, SUM(sale_amount) AS total_sales
FROM sales
GROUP BY product_id
HAVING SUM(sale_amount) > 400;
結果:
product_id | total_sales |
---|---|
103 | 550 |
四、WHERE 和 HAVING 結合使用
(一)使用場景
當需要先對行數據進行過濾,再對分組結果進行過濾時,可結合使用?WHERE
?和?HAVING
?子句。
(二)示例
假設要找出銷售總額超過 400 的產品,并且只考慮在 2024 年 1 月 4 日及之后的銷售記錄。
SELECT product_id, SUM(sale_amount) AS total_sales
FROM sales
WHERE sale_date >= '2024-01-04'
GROUP BY product_id
HAVING SUM(sale_amount) > 400;
結果:
product_id | total_sales |
---|---|
103 | 550 |
(三)執行順序
WHERE
?子句先對?sales
?表中的行進行過濾,只選擇?sale_date
?大于或等于 2024 年 1 月 4 日的記錄。GROUP BY
?對過濾后的數據按?product_id
?進行分組。HAVING
?子句對分組后的結果進行過濾,只選擇銷售總額超過 400 的產品。