SQL之GROUP BY & HAVING


聚合函數

From CSDN 葉子

一、Sql Server 中有哪些聚合函數?

提到聚合函數大家一定會首先想到最常用的:
1、 求個數:count
2、 求總和:sum
3、 求最大值:max
4、 求最小值:min
5、 求平均值:avg

聚合函數中有四個函數是我一直以來幾乎就沒有用到過的:
1、 求方差:var
2、 求總體方差:varp
3、 標準偏差:stdev
4、 求總體標準偏差:stdevp

除此以外Sql Server中還有幾個集合函數:
1、 求校驗和:checksum_agg
2、 求個數:count_big
3、 用于測試 cube 或 rollup 空值:grouping

二、聚合函數在什么情況下使用?

聚合函數只能在以下位置作為表達式使用:
1、 select 語句的選擇列表(子查詢或外部查詢)。
2、 compute 或 compute by 子句。
3、having 子句。

三、聚合函數count和count_big的區別?

count_big的用法與count 函數類似。兩個函數唯一的差別是它們的返回值。 
count_big始終返回 bigint 數據類型值。count始終返回 int 數據類型值。


GROUP BY

From cnblogs Myhsg / CSDN 王曉斌 / cnblogs 夕諾

GROUP BY 是分組查詢, 一般 GROUP BY 是和聚合函數配合使用

  • group by語句從英文的字面意義上理解就是“根據(by)一定的規則進行分組(Group)”。

  • group by 作用是通過一定的規則將一個數據集劃分成若干個小的區域,然后針對若干個小區域進行數據處理。select子句中的列名必須為分組列或列函數,列函數對于group by子句定義的每個組各返回一個結果。

  • group by 有一個原則,就是 select 后面的所有列中,沒有使用聚合函數的列,必須出現在 group by 后面

  • group by子句可以包含任意數目的列,這使得能對分組進行嵌套,為數據分組提供更細致的控制;

  • 如果在group by子句中嵌套了分組,數據將在最后規定的分組上進行匯總;

  • group by子句中列出的每個列都必須是檢索列或有效的表達式。如果在select中使用表達式,則必須在group by子句中指定相同的表達式,不能使用別名;

  • 大多數SQL實現不允許group by列帶有長度可變的數據類型;

  • 除聚集計算語句外,select語句中的每個列都必須在group by子句中給出;

  • 如果分組列中具有NULL值,則NULL將作為一個分組返回。如果列中有多行NULL值,它們將分為一組;

  • group by子句必須出現在where子句之后,order by子句之前;

  • group by all語法解析:
    如果使用 ALL 關鍵字,那么查詢結果將包括由 GROUP BY 子句產生的所有組,即使某些組沒有符合搜索條件的行。
    沒有 ALL 關鍵字,包含 GROUP BY 子句的 SELECT 語句將不顯示沒有符合條件的行的組。

HAVING

having 子句的作用是篩選滿足條件的組,即在分組之后過濾數據,條件中經常包含聚集函數,使用having 條件顯示特定的組,也可以使用多個分組標準進行分組。

  • where過濾行,而having過濾分組。having支持所有where操作符,having子句中能使用聚集函數。where在數據分組前進行過濾。having在數據分組后進行過濾。where排除的行不包括在分組中。
  • having 子句被限制子已經在select語句中定義的列和聚合表達式上。通常,你需要通過在having子句中重復聚合函數表達式來引用聚合值,就如你在select語句中做的那樣。例如:
    SELECT A COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2
  • 需要注意說明:當同時含有where子句、group by 子句 、having子句及聚集函數時,執行順序如下:

1.執行where子句查找符合條件的數據;
2.使用group by 子句對數據進行分組;對group by 子句形成的組運行聚集函數計算每一組的值;最后用having 子句去掉不符合條件的組。
3.having 子句中的每一個元素也必須出現在select列表中。有些數據庫例外,如oracle.
4.having子句和where子句都可以用來設定限制條件以使查詢結果滿足一定的條件限制。
5.having子句限制的是組,而不是行。where子句中不能使用聚集函數,而having子句中可以。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容