sql having 和 where(sql where 和on)
SQL查詢,是數(shù)據(jù)庫人用凌波微步都躲不過的一道檻。
孩子學(xué)習(xí)?對(duì)于所有的家長(zhǎng)來,最關(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)你了解幾條呢?
非常湊巧,就在前幾天,小編的一個(gè)朋友在面試時(shí)遇到一個(gè)SQL查詢的問題,“請(qǐng)解釋SQL中where與having的區(qū)別,最好舉個(gè)例子”。他支吾了一句,“選擇having一般是在無法用where的時(shí)候”。其實(shí)除了where和having,where和on也是面試官們經(jīng)常喜歡問的問題。
那這三者究竟有什么區(qū)別呢,借此機(jī)會(huì),小編就學(xué)習(xí)和整理了一些資料,分享給大家。

放大鏡在灰色背景上顯示sql字
一、where和having
- “where”是在結(jié)果返回之前起作用,where后面不能使用“聚合函數(shù)”;
- “having”是在結(jié)果返回之后起作用,having后面可以使用“聚合函數(shù)”
常見的聚合函數(shù)如:求總和sum() ,求最大值 max() ,求最小值 min() ,求平均值avg()
通過下面的例子來說明:
食品表 food,表字段 name(名稱)、price(價(jià)格)、category(種類)、number(數(shù)量)
1. where和having 都可以用的場(chǎng)景
如:查詢價(jià)格大于50的食品和價(jià)格
說明:having是從前面篩選的字段再篩選,而where是從數(shù)據(jù)表中的字段直接進(jìn)行的篩選的,select price已經(jīng)篩選,所以此時(shí)where和having效果是一樣的。
2.只可以用having,不可以用where情況
如:查詢每種食品category 的價(jià)格平均值,獲取平均價(jià)格大于200的食品
說明:這里只能用having,是因?yàn)閣here后面要跟的東西必須是表格里的字段,換成avg(price)也是錯(cuò)的,而having此時(shí)就有優(yōu)勢(shì)了,它是根據(jù)前文查詢的內(nèi)容來是篩選,不論在表中是否有該字段。
3.只可以用where,不可以用having的情況
如:查詢價(jià)格大于100的食品和數(shù)量
說明:這里不能用having的理由是,having是根據(jù)前文查詢結(jié)果來篩選,前文并沒有告訴它price是多少,所以報(bào)錯(cuò)。
二、where和on
數(shù)據(jù)庫在連接兩張表或多張表來返回記錄時(shí),都會(huì)生成一張臨時(shí)表。在使用左連接left join 時(shí),where和on有如下區(qū)別:
- “where”是在臨時(shí)表生成好后,再對(duì)臨時(shí)表進(jìn)行過濾。
- “on”是在生成臨時(shí)表時(shí)使用的條件,它不管on中的條件是否為真,都會(huì)返回左邊表中的記錄。
兩條查詢語句:
1、select * form A left join B on (A.id=B.id) where B.name=’aa’
2、select * form A left join B on (A.id=B.id and B.name=’aa’)
第一條的執(zhí)行過程如下:
第二條的執(zhí)行過程如下:
通過上面的例子可以看出,on子句不管on上的條件是否為真都會(huì)返回left或right表中的記錄;where子句是在臨時(shí)表生成好后,再對(duì)臨時(shí)表進(jìn)行過濾的條件,且這時(shí)已經(jīng)沒有l(wèi)eft join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。
最后
where、having、on 這三個(gè)都可以加條件的子句中,它們的執(zhí)行順序是 on > where > having。有時(shí)候如果這先后順序不影響中間結(jié)果的話,那最終結(jié)果是相同的。
關(guān)于三者的查詢速度,因?yàn)閛n是先把不符合條件的記錄過濾后才進(jìn)行統(tǒng)計(jì),可以減少中間運(yùn)算要處理的數(shù)據(jù),所以按理說速度應(yīng)該是最快的。