sql語句中where和having的區(qū)別
更新時間:2013年06月24日 23:41:37 作者:
HAVING是先分組再篩選記錄,WHERE在聚合前先篩選記錄.也就是說作用在GROUP BY 子句和HAVING子句前;而 HAVING子句在聚合后對組記錄進行篩選
HAVING是先分組再篩選記錄,WHERE在聚合前先篩選記錄.也就是說作用在GROUP BY 子句和HAVING子句前;而 HAVING子句在聚合后對組記錄進行篩選。
作用的對象不同。WHERE 子句作用于表和視圖,HAVING 子句作用于組。WHERE 在分組和聚集計算之前選取輸入行(因此,它控制哪些行進入聚集計算), 而 HAVING 在分組和聚集之后選取分組的行。因此,WHERE 子句不能包含聚集函數(shù); 因為試圖用聚集函數(shù)判斷那些行輸入給聚集運算是沒有意義的。 相反,HAVING 子句總是包含聚集函數(shù)。(嚴格說來,你可以寫不使用聚集的 HAVING 子句, 但這樣做只是白費勁。同樣的條件可以更有效地用于 WHERE 階段。)比如說:
select * from tablename where id > 1; 和
select * from tablename having id > 1
這兩者是查詢結(jié)果是沒有區(qū)別的。不建議使用having
總結(jié)就兩句話:
WHERE語句在GROUPBY語句之前;SQL會在分組之前計算WHERE語句。
HAVING語句在GROUPBY語句之后;SQL會在分組之后計算HAVING語句。
作用的對象不同。WHERE 子句作用于表和視圖,HAVING 子句作用于組。WHERE 在分組和聚集計算之前選取輸入行(因此,它控制哪些行進入聚集計算), 而 HAVING 在分組和聚集之后選取分組的行。因此,WHERE 子句不能包含聚集函數(shù); 因為試圖用聚集函數(shù)判斷那些行輸入給聚集運算是沒有意義的。 相反,HAVING 子句總是包含聚集函數(shù)。(嚴格說來,你可以寫不使用聚集的 HAVING 子句, 但這樣做只是白費勁。同樣的條件可以更有效地用于 WHERE 階段。)比如說:
select * from tablename where id > 1; 和
select * from tablename having id > 1
這兩者是查詢結(jié)果是沒有區(qū)別的。不建議使用having
總結(jié)就兩句話:
WHERE語句在GROUPBY語句之前;SQL會在分組之前計算WHERE語句。
HAVING語句在GROUPBY語句之后;SQL會在分組之后計算HAVING語句。
相關(guān)文章
sqlserver中drop、truncate和delete語句的用法
這篇文章主要介紹了sqlserver中drop、truncate和delete語句的用法,本文圖文并茂,內(nèi)容清晰,需要的朋友可以參考下2014-09-09利用Navicat Premium導(dǎo)出數(shù)據(jù)庫表結(jié)構(gòu)信息至Excel的方法
這篇文章主要介紹了利用Navicat Premium導(dǎo)出數(shù)據(jù)庫表結(jié)構(gòu)信息至Excel的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03Access轉(zhuǎn)換成SQL Server需要注意事項整理
很多朋友想用SQL2000數(shù)據(jù)庫的編程方法,但是卻又苦于自己是學(xué)ACCESS的,對SQL只是一點點的了解而已,這里我給大家提供以下參考---將ACCESS轉(zhuǎn)化成SQL2000的方法和注意事項2008-04-04MyBatis獲取數(shù)據(jù)庫自生成的主鍵Id詳解及實例代碼
這篇文章主要介紹了MyBatis獲取數(shù)據(jù)庫自生成的主鍵Id詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05ADO,OLEDB,ODBC,DAO,RDO的區(qū)別說明
ADO,OLEDB,ODBC,DAO,RDO的區(qū)別說明,因為我們用程序開發(fā)的時候經(jīng)常會用到OLEDB,ODBC鏈接數(shù)據(jù)庫等2012-09-09