介绍 :
GROUP BY
是 SQL 中用于对数据进行分组汇总的子句,通常与聚合函数一起使用。它允许将数据行按照一个或多个列的值进行分组,并对每个组应用聚合函数,从而生成汇总统计信息。
基本语法:
SELECT column1, column2, aggregate_function(column3)
FROM table_name
GROUP BY column1, column2;
column1
, column2
:这些是按其值对数据行进行分组的列。可以指定一个或多个列。
aggregate_function(column3)
:这是用于对每个分组应用聚合函数的列。聚合函数可以是 COUNT
, SUM
, AVG
, MAX
, MIN
等,用于对分组内的数据进行汇总计算。
table_name
:这是从中选择数据的表。
工作原理:
首先,数据行按照 GROUP BY
子句中指定的列的值进行分组。每个不同的组将拥有相同值的列。
然后,对于每个组,应用在 SELECT
子句中定义的聚合函数(如 COUNT
, SUM
, AVG
等)来计算分组内的值。这将生成一个结果行,其中包括分组的列值和聚合函数的计算结果。
最后,结果集将包括每个组的一个行,其中包括分组列的值和相应的聚合计算结果。
对比示例:
表emp20211150047如下图所示:
执行代码1
SELECT SAL, COUNT(*) FROM emp2021150047 GROUP BY SAL;
代码1结果如下
执行代码2
SELECT SAL, COUNT(*) FROM emp2021150047 GROUP BY ENAME;
代码2结果如下
通过对比是否看出一些差别?看不太明白也没关系,再加一列ENAME就清楚了。
执行代码1 plus
SELECT ENAME,SAL, COUNT(*) FROM emp2021150047 GROUP BY SAL;
代码1 plus结果如下
执行代码2 plus
SELECT ENAME,SAL, COUNT(*) FROM emp2021150047 GROUP BY ENAME;
代码2 plus结果如下
现在我们可以很明显的看出来,GROUP BY某一列,则那一列的值不会重复。比如GROUP BY ENAME ,那么不会有两个ALLEN。
而SELECT ENAME,SAL其实就是把,GROUP BY某一列后得到的表,再从中截取而已,如代码1 plus就是在下表中截取的。
和原表进行对比可以发现,SAL为18500的数据有三条,而GROUP BY只会取第一条,其他的只会在COUNT(*)进行+1而不会再次纳入表中。
(by 归忆)