SqlServer 中 Group by、having、order by、Distinct 使用注意事項


直奔主題,如下SQL語句(via:女孩禮物網):

SELECT COUNT(*) AS COUNT,REQUEST,METHOD FROM REQUESTMETH GROUP BY 
REQUEST,METHOD HAVING (REQUEST ='FC.OCEAN.JOB.SERVER.CBIZOZBKHEADER' OR REQUEST='FC.Ocean.Job.Server.CBizOzDocHeader')
AND COUNT(*) >3
ORDER BY REQUEST

注意事項:

HAVING后的條件不能用別名COUNT>3 必須使用COUNT(*) >3,否則報:列名 'COUNT' 無效。

having 子句中的每一個元素並不一定要出現在select列表中

如果把該語句寫成:

SELECT COUNT(*) AS COUNT,REQUEST,METHOD FROM REQUESTMETH GROUP BY 
REQUEST ORDER BY REQUEST

那么將報:

選擇列表中的列 'REQUESTMETH.method' 無效,因為該列沒有包含在聚合函數或 GROUP BY 子句中。

注意:
1、使用GROUP BY 子句時,SELECT 列表中的非匯總列必須為GROUP BY 列表中的項。
2、分組時,所有的NULL值分為一組。
3、GROUP BY 列表中一般不允許出現復雜的表達試、顯示標題以及SELECT列表中的位置標號。

如:

SELECT REQUEST,METHOD, COUNT(*) AS COUNT FROM REQUESTMETH GROUP BY 
REQUEST,2 ORDER BY REQUEST  

錯誤信息為:每個 GROUP BY 表達式都必須包含至少一個列引用。

 

GROUP BY 中使用 ORDER BY注意事項:

SELECT COUNT(*) AS COUNT FROM REQUESTMETH GROUP BY REQUEST,METHOD ORDER BY REQUEST,METHOD

--這樣是允許的, ORDER BY后面的字段包含在GROUP BY 子句中

 

SELECT COUNT(*) AS COUNTS FROM REQUESTMETH GROUP BY REQUEST ORDER BY COUNT(*) DESC 

--這樣是允許的,ORDER BY后面的字段包含在聚合函數中,結果集同下面語句一樣

 

SELECT COUNT(*) AS COUNTS FROM REQUESTMETH GROUP BY REQUEST ORDER BY COUNTS DESC 

--這樣是允許的,區別於HAVING,HAVING后不允許跟聚集函數的別名作為過濾條件

 

SELECT COUNT(*) AS COUNTS FROM REQUESTMETH GROUP BY REQUEST ORDER BY METHOD

--這樣是錯誤的:ORDER BY 子句中的列 "REQUESTMETH.method" 無效,因為該列沒有包含在聚合函數或 GROUP BY 子句中。


SELECT DISTINCT 中使用 ORDER BY注意事項:

SELECT DISTINCT BOOKID FROM BOOK ORDER BY BOOKNAME

以上語句將報:

--如果指定了SELECT DISTINCT,那么ORDER BY 子句中的項就必須出現在選擇列表中。

因為以上語句類似

SELECT BOOKID FROM BOOK GROUP BY BOOKID ORDER BY BOOKNAME

其實錯誤信息也為:

--ORDER BY子句中的列"BOOK.BookName" 無效,因為該列沒有包含在聚合函數或GROUP BY 子句中。


應該改為:

SELECT DISTINCT BOOKID,BOOKNAME FROM BOOK ORDER BY BOOKNAME
SELECT DISTINCT BOOKID,BOOKNAME FROM BOOK
SELECT BOOKID,BOOKNAME FROM BOOK GROUP BY BOOKID,BOOKNAME

 

以上兩句查詢結果是一致的,DISTINCT的語句其實完全可以等效的轉換為GROUP BY語句

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM