?
SQL HAVING 出現(xiàn)的原因
在 SQL 中增加 HAVING 子句原因是,WHERE 關(guān)鍵字無(wú)法與合計(jì)函數(shù)一起使用。
SQL HAVING 語(yǔ)法
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
SQL HAVING 實(shí)例
我們擁有下面這個(gè) "Orders" 表:
| O_Id | OrderDate | OrderPrice | Customer |
|---|---|---|---|
| 1 | 2008/12/29 | 1000 | Bush |
| 2 | 2008/11/23 | 1600 | Carter |
| 3 | 2008/10/05 | 700 | Bush |
| 4 | 2008/09/28 | 300 | Bush |
| 5 | 2008/08/06 | 2000 | Adams |
| 6 | 2008/07/21 | 100 | Carter |
現(xiàn)在,我們希望查找訂單總金額少于 2000 的客戶(hù)。
我們使用如下 SQL 語(yǔ)句:
SELECT
Customer,
SUM
(OrderPrice)
FROM
Orders
GROUP
BY
Customer
HAVING
SUM
(OrderPrice)
<
2000
結(jié)果集類(lèi)似:
| Customer | SUM(OrderPrice) |
|---|---|
| Carter | 1700 |
現(xiàn)在我們希望查找客戶(hù) "Bush" 或 "Adams" 擁有超過(guò) 1500 的訂單總金額。
我們?cè)?SQL 語(yǔ)句中增加了一個(gè)普通的 WHERE 子句:
SELECT
Customer,
SUM
(OrderPrice)
FROM
Orders
WHERE
Customer
=
'
Bush
'
OR
Customer
=
'
Adams
'
GROUP
BY
Customer
HAVING
SUM
(OrderPrice)
>
1500
結(jié)果集:
| Customer | SUM(OrderPrice) |
|---|---|
| Bush | 2000 |
| Adams | 2000 |
?
在select 語(yǔ)句中可以使用group by 子句將行劃分成較小的組,然后,使用聚組函數(shù)返回每一個(gè)組的匯總信息,另外,可以使用having子句限制返回的結(jié)果集。group by 子句可以將查詢(xún)結(jié)果分組,并返回行的匯總信息Oracle 按照group by 子句中指定的表達(dá)式的值分組查詢(xún)結(jié)果。
在帶有g(shù)roup by 子句的查詢(xún)語(yǔ)句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚組函數(shù)
??
select
max
(sal),job emp
group
by
job;
//(注意max(sal), job 的job并非一定要出現(xiàn),但有意義 )
查詢(xún)語(yǔ)句的select 和group by ,having 子句是聚組函數(shù)唯一出現(xiàn)的地方,在where 子句中不能使用聚組函數(shù)。
select
deptno,
sum
(sal)
from
emp
where
sal
>
1200
group
by
deptno
having
sum
(sal)
>
8500
order
by
deptno;
當(dāng)在gropu by 子句中使用having 子句時(shí),查詢(xún)結(jié)果中只返回滿(mǎn)足having條件的組。在一個(gè)sql語(yǔ)句中可以有where子句和having子句。having 與where 子句類(lèi)似,均用于設(shè)置限定條件。
?
where 子句的作用是在對(duì)查詢(xún)結(jié)果進(jìn)行分組前,將不符合where條件的行去掉,即在分組之前過(guò)濾數(shù)據(jù),條件中不能包含聚組函數(shù),使用where條件顯示特定的行。
having 子句的作用是篩選滿(mǎn)足條件的組,即在分組之后過(guò)濾數(shù)據(jù),條件中經(jīng)常包含聚組函數(shù),使用having 條件顯示特定的組,也可以使用多個(gè)分組標(biāo)準(zhǔn)進(jìn)行分組。
查詢(xún)每個(gè)部門(mén)的每種職位的雇員數(shù)
?
select
deptno,job,
count
(
*
)
from
emp
group
by
deptno,job;
?
如果你對(duì)何時(shí)應(yīng)該使用WHERE,何時(shí)使用HAVING仍舊很迷惑,請(qǐng)遵照下面的說(shuō)明: ?
WHERE語(yǔ)句在GROUP BY語(yǔ)句之前;SQL會(huì)在分組之前計(jì)算WHERE語(yǔ)句。?
HAVING語(yǔ)句在GROUP BY語(yǔ)句之后;SQL會(huì)在分組之后計(jì)算HAVING語(yǔ)句。
?
PS: 因?yàn)槲矣龅搅诉@個(gè)問(wèn)題,現(xiàn)在已經(jīng)解決了,所以還是記錄哈。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

