sql having 和 where(sql where 和on)
SQL查詢,是數據庫人用凌波微步都躲不過的一道檻。
孩子學習?對于所有的家長來,最關心就是孩子的學習,對吧?如何幫孩子提升學習成績呢?影響孩子學習成績的因素有哪些?左養右學教育賴頌強團隊13年的家庭教育服務經驗總結,影響孩子學習的主要因素有22條之多,家長你了解幾條呢?
非常湊巧,就在前幾天,小編的一個朋友在面試時遇到一個SQL查詢的問題,“請解釋SQL中where與having的區別,最好舉個例子”。他支吾了一句,“選擇having一般是在無法用where的時候”。其實除了where和having,where和on也是面試官們經常喜歡問的問題。
那這三者究竟有什么區別呢,借此機會,小編就學習和整理了一些資料,分享給大家。

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