group by和聚合函數(很好理解版)


原文鏈接: https://pyai.top 已經找不到原文章,博主刪了
摘自:https://blog.csdn.net/intmainhhh/article/details/80777582

為什么不能夠select * from Table group by id,為什么一定不能是*,而只能是某一個列或者某個列的聚合函數,group by 多個字段可以怎么去很好的理解呢?
正文開始

先來看下表1,表名為test:
表一 test

id name number
1 aa 2
2 aa 3
3 bb 4
4 bb 5
5 cc 6
6 dd 7
7 ee 7
8 bb 5
9 cc 6

執行如下sql語句:

select name from test
group by name
  • 1
  • 2

你應該很容易知道運行的結果,沒錯,就是下表2:
表2

name
aa
bb
cc
dd
ee

可是為了能夠更好的理解“group by”多個列“和”聚合函數“的應用,我建議在思考的過程中,由表1到表2的過程中,增加一個虛構的中間表:虛擬表3。下面說說如何來思考上面sql語句執行情況:

1.from test:該句執行后,應該結果和表1一樣,就是原來的表。

2.from test group by name:該句執行后,我們想象生成了虛擬表3,如下所圖所示,生成過程是這樣的:group by name,那么找name那一列,具有相同name值的行,合並成一行,如對於name值為aa的,那么<1 aa 2>與<2 aa 3>兩行合並成1行,所有的id值和number值寫到一個單元格里面。
這里寫圖片描述
3.接下來就要針對虛擬表3執行select語句了:

(1)如果執行select *的話,那么返回的結果應該是虛擬表3,可是id和number中有的單元格里面的內容是多個值的,而關系數據庫就是基於關系的,單元格中是不允許有多個值的,所以你看,執行select * 語句就報錯了。

(2)我們再看name列,每個單元格只有一個數據,所以我們select name的話,就沒有問題了。為什么name列每個單元格只有一個值呢,因為我們就是用name列來group by的。

(3)那么對於id和number里面的單元格有多個數據的情況怎么辦呢?答案就是用聚合函數,聚合函數就用來輸入多個數據,輸出一個數據的。如cout(id),sum(number),而每個聚合函數的輸入就是每一個多數據的單元格。

(4)例如我們執行select name,sum(number) from test group by name,那么sum就對虛擬表3的number列的每個單元格進行sum操作,例如對name為aa的那一行的number列執行sum操作,即2+3,返回5,最后執行結果如下:

name (無列名)
aa 5
bb 14
cc 12
dd 7
ee 7

(5)group by 多個字段該怎么理解呢:如group by name,number,我們可以把name和number 看成一個整體字段,以他們整體來進行分組的。如下圖
這里寫圖片描述
(6)接下來就可以配合select和聚合函數進行操作了。如執行select name,sum(id) from test group by name,number,結果如下圖:

name (無列名)
aa 1
aa 2
bb 3
bb 12
cc 14
dd 6
ee 7
 


免責聲明!

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



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