理解group by

來源:互聯網
上載者:User
文章出處:理解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,結果如下圖:


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.