根據(jù)https://blog.csdn.net/weixin_42724467/article/details/89378526而來。
正文:
可是為了能夠更好的理解“group by”多個列“和”聚合函數(shù)“的應(yīng)用鞋拟,我建議在思考的過程中粘都,由表1到表2的過程中,增加一個虛構(gòu)的中間表:虛擬表3姆泻。下面說說如何來思考上面SQL語句執(zhí)行情況:
1.FROM test:該句執(zhí)行后,應(yīng)該結(jié)果和表1一樣,就是原來的表利花。
2.FROM test Group BY name:該句執(zhí)行后,我們想象生成了虛擬表3盒揉,如下所圖所示晋被,生成過程是這樣的:group by name,那么找name那一列刚盈,具有相同name值的行羡洛,合并成一行,如對于name值為aa的藕漱,那么<1 aa 2>與<2 aa 3>兩行合并成1行欲侮,所有的id值和number值寫到一個單元格里面。
3.接下來就要針對虛擬表3執(zhí)行Select語句了:
(1)如果執(zhí)行select *的話肋联,那么返回的結(jié)果應(yīng)該是虛擬表3威蕉,可是id和number中有的單元格里面的內(nèi)容是多個值的,而關(guān)系數(shù)據(jù)庫就是基于關(guān)系的橄仍,單元格中是不允許有多個值的韧涨,所以你看,執(zhí)行select * 語句就報錯了侮繁。
(2)我們再看name列虑粥,每個單元格只有一個數(shù)據(jù),所以我們select name的話宪哩,就沒有問題了娩贷。為什么name列每個單元格只有一個值呢,因為我們就是用name列來group by的锁孟。
(3)那么對于id和number里面的單元格有多個數(shù)據(jù)的情況怎么辦呢彬祖?答案就是用聚合函數(shù)茁瘦,聚合函數(shù)就用來輸入多個數(shù)據(jù),輸出一個數(shù)據(jù)的储笑。如cout(id)甜熔,sum(number),而每個聚合函數(shù)的輸入就是每一個多數(shù)據(jù)的單元格南蓬。
(4)例如我們執(zhí)行select name,sum(number) from test group by name纺非,那么sum就對虛擬表3的number列的每個單元格進(jìn)行sum操作,例如對name為aa的那一行的number列執(zhí)行sum操作赘方,即2+3烧颖,返回5,最后執(zhí)行結(jié)果如下:
(5)group by 多個字段該怎么理解呢:如group by name,number窄陡,我們可以把name和number 看成一個整體字段炕淮,以他們整體來進(jìn)行分組的。如下圖
其實(shí)就是先對name進(jìn)行分組跳夭,相同的聚在同一單元格涂圆,之后再對number進(jìn)行分組!1姨尽H笄浮!
(6)接下來就可以配合select和聚合函數(shù)進(jìn)行操作了颈抚。如執(zhí)行select name,sum(id) from test group by name,number踩衩,結(jié)果如下圖