3 回答

TA貢獻1807條經(jīng)驗 獲得超9個贊
HAVING:用于在聚合發(fā)生后檢查條件。
WHERE:用于在聚合發(fā)生之前檢查條件。
這段代碼:
select City, CNT=Count(1)From AddressWhere State = 'MA'Group By City
為您提供MA中所有城市的表格以及每個城市的地址數(shù)量。
這段代碼:
select City, CNT=Count(1)From AddressWhere State = 'MA'Group By CityHaving Count(1)>5
為您提供MA的城市表格,其中包含超過5個地址和每個城市的地址數(shù)量。

TA貢獻1865條經(jīng)驗 獲得超7個贊
對我來說最重要的一點是:如果HAVING
從SQL語言中刪除,那么生活會像以前一樣或多或少地繼續(xù)下去。當(dāng)然,少數(shù)查詢需要使用派生表,CTE等進行重寫,但結(jié)果可能更容易理解和維護。也許供應(yīng)商的優(yōu)化程序代碼需要重寫才能解決這個問題,這也是行業(yè)內(nèi)部改進的機會。
現(xiàn)在考慮WHERE
從語言中刪除一下。這一次,現(xiàn)有的大多數(shù)查詢都需要在沒有明顯替代構(gòu)造的情況下進行重寫。編碼器必須具有創(chuàng)造性,例如內(nèi)連接到已知包含恰好一行的表(例如DUAL
在Oracle中),使用該ON
子句來模擬先前WHERE
子句。這樣的結(jié)構(gòu)將是人為的; 很明顯,語言中缺少某些內(nèi)容,因此情況會更糟。
TL; DR我們HAVING
明天可能輸了,事情不會更糟,可能更好,但同樣不能說WHERE
。
從這里的答案來看,似乎很多人都沒有意識到一個HAVING
條款可以在沒有條款的情況下使用GROUP BY
。在這種情況下,該HAVING
子句將應(yīng)用于整個表表達式,并且只需要在SELECT
子句中出現(xiàn)常量。通常,該HAVING
條款將涉及聚合。
這比聽起來更有用。例如,請考慮此查詢以測試該name
列是否對于以下所有值都是唯一的T
:
SELECT 1 AS result FROM THAVING COUNT( DISTINCT name ) = COUNT( name );
只有兩種可能的結(jié)果:如果HAVING
子句為true,則結(jié)果為包含該值的單行1
,否則結(jié)果將為空集。
添加回答
舉報