源自劉嘉老師的課程《數據庫開發》,課堂筆記
Group By 分組
Group By 是什麼?
- 結果集,每一行都是一組;而且表示一行(或多行)中某一列(或者多列)具有相同的值
ANSI標準
-
Select後面接的結果集字端只有兩種
-
要麼是group by出現的字段
selete deptno,count(*) as cnt from emp group by deptno
-
要麼是group by後出現的字段+聚合函數的組合
-
-
錯誤案例:
selete deptno, count(*) as cnt from emp # 這裏的count(*)count的是啥?沒有意義。一定要有group by這樣一個聚合函數,纔能有這樣的一個邏輯 select deptno, name, count(*) as cnt from emp group by deptno # 這裏的name的意義不明確,不知道指向的是結果集中的哪一個name(有可能結果集之中有多個name)
select和group by
-
規則之外可以放入select子句中的內容
- 用戶定義的函數、窗口函數、非關聯的標量自查詢返回的常量、標量值。
-
例子:
select deptno, count(*) as cnt from emp group by deptno select 'hello' as msg, 1 as num, deptno, (select count(*) from emp) as total count(*) as cnt from emp group by deptno
group by 必須要保證後面接的每一個組,他們組合起來的內容必須是有唯一的行,只有這樣才能進行聚合。
Group by 中 count(*)問題
- count(*)需要返回一個>0的值。
- 對於NULL值,他也會對NULL值進行一個單獨的分組。
SQL的執行順序
Select xx, max(a)
From T
Where b > 3
Group bu xx
Having max(a) > ??
Order by xx
- 上述sql語句的執行順序爲:
- From …生成一個很大的中間結果集
- where … 對From操作選出來的每一條結果集進行比對,把不符合條件的結果進行剔除
- Group by … 本質上是進行排序。把相似的特徵放到一起然後進行Group by。是對where操作的結果集的一個壓縮
- having … 對group by的結果進行一個聚合。
- select … having昨晚之後,通過select進行讀取
- order by …對最終的結果進行排序
- 查詢優化器能夠管道的就是select和where;group by是沒法管的。