SQL中Groupby和聚合函数
本⽂转载于
为什么不能够select * from Table group by id,为什么⼀定不能是*,⽽是某⼀个列或者某个列的聚合函数,group by 多个字段可以怎么去很好的理解呢?不过最后还是转过来了,简单写写吧,⼤⽜们直接略过吧。
先来看表1:
                表1
执⾏如下SQL语句:
SELECT name FROM test GROUP BY name
你应该很容易知道运⾏的结果,没错,就是下表2:
      表2
可是为了能够更好的理解“group by”多个列“和”聚合函数“的应⽤,我建议在思考的过程中,由表1到表2的过程中,增加⼀个虚构的中间表:虚拟表3。下⾯说说如何来思考上⾯SQL语句执⾏情况:groupby是什么函数
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,结果如下图:
后续说明:
1: sum(id)是把Group分类的ID进⾏相加,如果是字符串的话,则可以使⽤GROUP_CONCAT(id) 进⾏字符串的拼接,默认拼接字符为‘,’号,如果需要更改则使⽤
GROUP_CONCAT(id SEPARATOR ';') 进⾏修改。
2: GROUP_CONCAT拼接的时候最⼤输出字符串为1024个字符串,如果要增加,则需要使⽤如下两个命令进⾏设置。-1为设置为最⼤。最⼤为4294967295。按照需要设置。也可以通过数据库的配置进⾏调整,数据库配置⽂件中group_concat_max_len是设置后的值。
SET GLOBAL group_concat_max_len=-1;
SET SESSION group_concat_max_len=-1;
我已经对我⾃⼰对如此简单的问题有如此天马⾏空的想法所折服,洗洗睡觉

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。