程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 可以這樣去理解group by和聚合函數,groupby

可以這樣去理解group by和聚合函數,groupby

編輯:JAVA綜合教程

可以這樣去理解group by和聚合函數,groupby


轉http://www.cnblogs.com/wuguanglei/p/4229938.html?utm_source=tuicool;個人覺得很受用

寫在前面的話:用了好久group by,今天早上一覺醒來,突然感覺group by好陌生,總有個筋別不過來,為什麼不能夠select * from Table group by id,為什麼一定不能是*,而是某一個列或者某個列的聚合函數,group by 多個字段可以怎麼去很好的理解呢?不過最後還是轉過來了,簡單寫寫吧,大牛們直接略過吧。

=========正文開始===========

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

 

表1

  執行如下SQL語句:

1 2 SELECT name FROM test GROUP BY name

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

 

表2

  可是為了能夠更好的理解“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,最後執行結果如下:

 (5)group by 多個字段該怎麼理解呢:如group by name,number,我們可以把name和number 看成一個整體字段,以他們整體來進行分組的。如下圖

(6)接下來就可以配合select和聚合函數進行操作了。如執行select name,sum(id) from test group by name,number,結果如下圖:

至此,我已經對我自己對如此簡單的問題有如此天馬行空的想法所折服,洗洗睡覺。

(完)

  文檔信息 

  • 版權聲明:自由轉載-非商用-非衍生-保持署名(創意共享3.0許可證)
  • 本文為原創文章,歡迎轉載,後續本博客會不斷更新,因此請保留該文檔信息。
  • 本文地址:http://www.cnblogs.com/wuguanglei/p/4229938.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved