在 SQL 中增加 HAVING 子句原因是犯戏,WHERE 關(guān)鍵字無法與聚合函數(shù)一起使用瑞眼,HAVING 子句可以讓我們篩選分組后的各組數(shù)據(jù)台盯。
SQL HAVING 語法:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;
從上面的語法中可以看出 HAVING 和 WHERE 是不沖突,作用不一樣的绅项。
WHERE 是一個(gè)約束聲明种吸,使用 WHERE 約束來自數(shù)據(jù)庫(kù)的數(shù)據(jù),WHERE 是在結(jié)果返回之前起作用的毅否,WHERE 中不能使用聚合函數(shù)矮固。
HAVING 是一個(gè)過濾聲明,是在查詢返回結(jié)果集以后對(duì)查詢結(jié)果進(jìn)行的過濾操作氯质,在 HAVING 中可以使用聚合函數(shù)募舟。
在查詢過程中聚合語句(sum,min,max,avg,count)要比 HAVING 子句優(yōu)先執(zhí)行。而 WHERE 子句在查詢過程中執(zhí)行優(yōu)先級(jí)高于聚合語句闻察。
即當(dāng)同時(shí)含有 WHERE 子句拱礁、GROUP BY 子句 、HAVING 子句及聚集函數(shù)時(shí)辕漂,執(zhí)行順序如下:
- 執(zhí)行 WHERE 子句查找符合條件的數(shù)據(jù)呢灶;
- 使用 GROUP BY 子句對(duì)數(shù)據(jù)進(jìn)行分組;對(duì) GROUP BY 子句形成的組運(yùn)行聚集函數(shù)計(jì)算每一組的值钉嘹;
- 最后用 HAVING 子句去掉不符合條件的組鸯乃。
栗子??
擁有下面這個(gè) "Orders" 表:
Orders表.png
現(xiàn)在,我們希望查找訂單總金額少于 2000 的客戶跋涣。
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
結(jié)果如下:
Orders_result1.png
現(xiàn)在我們希望查找客戶 "Bush" 或 "Adams" 擁有超過 1500 的訂單總金額缨睡。
SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500
結(jié)果如下:
Orders_result2.png