Group By 分組


源自劉嘉老師的課程《數據庫開發》,課堂筆記

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是沒法管的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章