一直用不好groupby,只記得groupby的時(shí)候不能select其他字段(非groupby的字段)谱邪,但是也看到有些函數(shù)如count()可以和groupby一起用领追。有點(diǎn)理不清寧不過(guò)來(lái)怎么用,今天查找資料學(xué)習(xí)整理了一下唬血,希望可以記住淮阐。:(
定義:
GROUP BY 語(yǔ)句用于結(jié)合聚合函數(shù),根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組刁品。
聚合函數(shù):?
示例:統(tǒng)計(jì)1號(hào)泣特,2號(hào)每個(gè)Customer購(gòu)買的產(chǎn)品總價(jià)。
sql語(yǔ)句實(shí)現(xiàn)為: select sum(ProdctPrice) from table where (OrderDate = '2020/6/1' or OrderDate = '2020/6/2') group by CustomerID
實(shí)現(xiàn)過(guò)程解析:
group by CustomerID挑随,那么找CustomerID那一列状您,將具有相同CustomerID值的行,合并成一行且去重兜挨,只留一個(gè)值膏孟。
對(duì)應(yīng)的其他列的值,會(huì)將其他列的值合并整合到一行里拌汇,不做任何過(guò)濾處理柒桑。
如對(duì)于CustomerID值為A,group by 后噪舀,CustomerID值相同為A的三行合并成一行魁淳,CustomerID值為A,該行對(duì)應(yīng)的其他列的值是其他列所有CustomerID值相同為A的值的匯總,如OrderID的值有三個(gè)与倡。
這就是為什么select的時(shí)候不能加其他字段界逛,但是可以使用聚合函數(shù)了。
1)如果執(zhí)行select *的話纺座,那么返回的結(jié)果就包括灰色隱藏部分的含有多個(gè)值得列息拜,如OrderID和ProductN等中有的內(nèi)容是多個(gè)值的,而關(guān)系數(shù)據(jù)庫(kù)就是基于關(guān)系的,單元格中是不允許有多個(gè)值的少欺,所以你看喳瓣,執(zhí)行select * 語(yǔ)句就報(bào)錯(cuò)了。
2)而CustomerID列赞别,每個(gè)單元格只有一個(gè)數(shù)據(jù)畏陕,所以我們select CustomerID的話,就沒(méi)有問(wèn)題了氯庆。CustomerID列只有一個(gè)值呢蹭秋,是因?yàn)橛肅ustomerID列來(lái)group by的。
3)對(duì)于有多個(gè)數(shù)據(jù)的列依然可以過(guò)濾使用堤撵,就是用聚合函數(shù)仁讨,聚合函數(shù)就用來(lái)輸入多個(gè)數(shù)據(jù),輸出一個(gè)數(shù)據(jù)的实昨。如cout()洞豁,sum(),而每個(gè)聚合函數(shù)的輸入就是每列含有多數(shù)據(jù)的值荒给。
聚合函數(shù)參加上圖丈挟。