sql語(yǔ)句中where和having的區(qū)別(sql where having區(qū)別)

WHERE和HAVING子句之間的主要區(qū)別在于與GROUP BY子句一起使用時(shí),在這種情況下,WHERE用于在分組之前過(guò)濾行,HAVING用于在分組后排除記錄。這是最重要的區(qū)別,如果你還記得這個(gè),它將幫助你編寫更好的SQL查詢。這也是要理解的重要SQL概念之一,不僅從面試角度而且從日常使用角度來(lái)理解。我確信您已經(jīng)使用了WHERE子句,因?yàn)樗荢QL中最常見(jiàn)的子句之一以及SELECT,用于指定過(guò)濾條件或條件。您甚至可以使用WHERE子句而不使用HAVING或GROUP BY,因?yàn)槟讯啻慰吹剿?/p>
孩子學(xué)習(xí)?對(duì)于所有的家長(zhǎng)來(lái),最關(guān)心就是孩子的學(xué)習(xí),對(duì)吧?如何幫孩子提升學(xué)習(xí)成績(jī)呢?影響孩子學(xué)習(xí)成績(jī)的因素有哪些?左養(yǎng)右學(xué)教育賴頌強(qiáng)團(tuán)隊(duì)13年的家庭教育服務(wù)經(jīng)驗(yàn)總結(jié),影響孩子學(xué)習(xí)的主要因素有22條之多,家長(zhǎng)你了解幾條呢?
另一方面,只有在SQL查詢中使用GROUP BY子句執(zhí)行分組時(shí)才能使用HAVING。關(guān)于WHERE和HAVING子句的另一個(gè)值得注意的事情是WHERE子句不能包含聚合函數(shù),如COUNT(),SUM(),MAX(),MIN()等,但HAVING子句可能包含聚合函數(shù)。
另一個(gè)值得注意的是WHERE和HAVING子句之間的區(qū)別在于,WHERE用于對(duì)SELECT,UPDATE,DELETE語(yǔ)句以及單行函數(shù)強(qiáng)加過(guò)濾條件,并在group by子句之前使用,但HAVING總是在group by子句之后使用。
SQL中WHERE與HAVING的區(qū)別
1)在查詢處理的邏輯順序中,在FROM子句之后立即處理WHERE子句,這意味著它在GROUP BY子句之前處理,而在創(chuàng)建組之后執(zhí)行HAVING子句。
2)如果在GROUP BY中使用,您可以在WHERE子句中引用表中的任何列,但是您只能使用未分組或聚合的列。
3)如果你使用沒(méi)有g(shù)roup by的HAVING子句,它也可以引用任何列,但不會(huì)使用索引而不是WHERE子句。例如,以下具有相同的結(jié)果集,但是“where”將使用id索引并且將執(zhí)行表掃描
select * from table where id=1
select * from table id=1
4)您可以使用聚合函數(shù)來(lái)過(guò)濾具有HAVING子句的行。因?yàn)樵趯?duì)行進(jìn)行分組后處理HAVING子句,所以可以在邏輯表達(dá)式中引用聚合函數(shù)。例如,以下查詢將僅顯示具有10個(gè)以上學(xué)生的
課程:SELECT課程,COUNT(課程)為培訓(xùn)GROUP BY課程的NumOfStudent課程計(jì)數(shù)(課程)> 10
5)WHERE和HAVING子句之間的另一個(gè)關(guān)鍵區(qū)別是在哪里使用Index和HAVING都不會(huì),例如以下兩個(gè)查詢會(huì)產(chǎn)生相同的結(jié)果但是WHERE會(huì)使用Index和HAVING會(huì)做一個(gè)表掃描
SELECT * FROM Course WHERE Id=101;
SELECT * FROM Course HAVING Id=102;
6)由于在組形成之前評(píng)估WHERE子句,因此它會(huì)對(duì)每行進(jìn)行求值。另一方面,在形成組之后評(píng)估HAVING子句,因此它評(píng)估每組。
何時(shí)使用WHERE和HAVING子句?
雖然兩者都用于從結(jié)果集中排除行,但您應(yīng)該在分組之前使用WHERE子句過(guò)濾行,并在分組后使用HAVING子句過(guò)濾行。換句話說(shuō),WHERE可用于過(guò)濾表列,而HAVING可用于過(guò)濾聚合函數(shù),如count,sum,avg,min和max。
如果可以在沒(méi)有聚合函數(shù)的情況下完成過(guò)濾,則必須在WHERE子句上執(zhí)行此操作,因?yàn)樗梢蕴岣咝阅?,因?yàn)橛?jì)數(shù)和排序?qū)⒃诟〉募仙贤瓿?。如果在分組后過(guò)濾相同的行,則會(huì)不必要地承擔(dān)未使用的排序成本。
例如,以下語(yǔ)句在語(yǔ)法上是正確的并產(chǎn)生相同的結(jié)果,但第二個(gè)語(yǔ)句比第一個(gè)語(yǔ)句更有效,因?yàn)樗诜纸M之前過(guò)濾行:
SELECT Job,City,State,Count(Employee)from … HAVING …
SELECT ….. from … WHERE …
這就是SQL中WHERE和HAVING子句之間的區(qū)別。這些差異適用于幾乎所有主要數(shù)據(jù)庫(kù),例如MySQL,Oracle,SQL Server和PostgreSQL。請(qǐng)記住,WHERE用于在分組之前過(guò)濾行,而HAVING用于在分組后過(guò)濾行。您還可以使用AGGREGATE函數(shù)和HAVING子句進(jìn)行過(guò)濾。