GROUP BY关键字能够将查询结果按照某个字段或多个字段进行分组。字段中值相等的为一组。基本的语法格式以下:函数
GROUP BY 属性名 [HAVING 条件表达式] [WITH ROLLUP]
GROUP BY关键字能够和GROUP_CONCAT()函数一块儿使用。GROUP_CONCAT()函数会把每一个分组中指定的字段值都显示出来。.net
同时,GROUP BY关键字一般与集合函数一块儿使用。集合函数包括COUNT()函数、SUM()函数、AVG()函数、MAX()函数和MIN()函数等。get
若是GROUP BY不与上述函数一块儿使用,那么查询结果就是字段取值的分组状况。字段中取值相同的记录为一组,可是只显示该组的第一条记录。it
若是单独使用GROUP BY关键字,查询结果只显示一个分组的一条记录。class
实例:将employee表的sex字段进行分组查询,将查询结果与分组前的结果进行对比。操做步骤以下:语法
1. 首先执行不带GROUP BY关键字的SELECT语句。以下图所示:im
上图中代码执行的结果显示的是employee表中原始的记录状况。统计
2. 执行带有GROUP BY关键字的SELECT语句。代码以下:数据
SELECT * FROM employee GROUP BY sex;
在DOS提示符窗口中查看执行带有GROUP BY关键字的SELECT语句的操做效果。以下图所示:查询
上图中代码执行的结果只显示了两条记录。这两条记录的sex字段的值分别为“女”和“男”。
查询结果进行比较,GROUP BY关键字只显示每一个分组的一条记录。这说明,GROUP BY关键字单独使用时,只能查询出每一个分组的一条记录,这样作的意义不大。所以,通常在使用集合函数时才使用GROUP BY关键字。
GROUP BY关键字与GROUP_CONCAT()函数一块儿使用时,每一个分组中指定的字段值会所有显示出来。
实例:将employee表按照sex字段进行分组查询。使用GROUP_CONCAT()函数将每一个分组的name字段的值显示出来。
SELECT语句的代码以下:
SELECT sex,GROUP_CONCAT(name) FROM employee GROUP BY sex;
在DOS提示符窗口中查看代码的执行效果。以下图所示:
上图中代码执行的结果显示,查询结果分为两组。sex字段取值为“女”的记录是一组,取值为“男”的记录是一组。每一组中全部人的名字都被查询出来了。
该实例说明,使用GROUP_CONCAT()函数能够很好的把分组状况表示出来。
GROUP BY关键字与集合函数一块儿使用时,能够经过集合函数计算分组中的总记录、最大值、最小值等。
实例:将employee表的sex字段进行分组查询。sex字段取值相同的为一组。而后对每一组使用集合函数COUNT()函数进行计算,求出每一组的记录数。
SELECT语句的代码以下:
SELECT sex,COUNT(sex) FROM employee GROUP BY sex;
在DOS提示符窗口中查看GROUP BY关键字与集合函数一块儿使用的操做效果。以下图所示:
上图中代码执行的结果显示,查询结果按sex字段的取值进行分组。取值为“女”的记录为一组,取值为“男”的记录为一组。COUNT(sex)计算出了sex字段不一样分组的记录数。第一组共有2条记录,第二组共有3条记录。
一般状况下,GROUP BY关键字与集合函数一块儿使用,先使用GROUP BY关键字将记录分组,而后每组都使用集合函数进行计算。在统计时常常须要使用GROUP BY关键字和集合函数。
使用GROUP BY关键字时,若是加上“HAVING 条件表达式”,则能够限制输出的结果。只有符合条件表达式的结果才会显示。
实例:将employee表的sex字段进行分组查询。而后显示记录数大于等于3的分组。
SELECT语句的代码以下:
SELECT sex,COUNT(sex) FROM employee GROUP BY sex HAVING COUNT(sex)>=3;
在DOS提示符窗口中查看GROUP BY关键字与HAVING一块儿使用的操做效果。以下图所示:
上图中代码执行的结果只显示了取值为“男”的记录的状况。由于,该分组的记录数为3,恰好符合HAVING COUNT(sex)>=3的条件。
该实例说明,“HAVING 条件表达式”能够限制查询结果的显示状况。
“HAVING 条件表达式”与“WHERE 条件表达式”都是用于限制显示的。可是,二者起做用的地方不同。
在MySQL中,还能够按照多个字段进行分组。例如,employee表按照d_id字段和sex字段进行分组。分组过程当中,先按照d_id字段进行分组,遇到d_id字段的值相等的状况时,再把d_id值相等的记录按照sex字段进行分组。
实例:将employee表按照d_id字段和sex字段进行分组。
SELECT语句的代码以下:
SELECT * FROM employee GROUP BY d_id,sex;
在DOS提示符窗口中查看按照多个字段进行分组的操做效果。以下图所示:
上图中代码执行的结果显示,记录先按照d_id字段进行分组,由于分别有两条记录的d_id的值为1001和1004,因此这4条记录再次按照sex字段的取值进行了分组。
使用WITH ROLLUP时,将会在全部记录的最后加上一条记录。这条记录是上面全部记录的总和。
实例:将employee表的sex字段进行分组查询。使用COUNT()函数计算每组的记录数,而且加上WITH ROLLUP。
SELECT语句的代码以下:
SELECT sex,COUNT(sex) FROM employee GROUP BY sex WITH ROLLUP;
在DOS提示符窗口中查看GROUP BY关键字与WITH ROLLUP一块儿使用的操做效果。以下图所示:
上图中代码执行的结果显示,计算出了各个分组的记录数,而且,在记录的最后加上了一条新的记录。该记录的COUNT(sex)列的值正好是上面分组的值的总和。
实例:将employee表的sex字段进行分组查询。使用GROUP_CONCAT()函数查看每组的name字段的值,而且加上WITH ROLLUP。
SELECT语句的代码以下:
SELECT sex,GROUP_CONCAT(name) FROM employee GROUP BY sex WITH ROLLUP;
在DOS提示符窗口中查看SELECT语句WITH ROLLUP参数的操做效果。以下图所示:
上图中代码执行的结果显示,GROUP_CONCAT(name)显示了每一个分组的name字段的值。同时,最后一条记录的GROUP_CONCAT(name)列的值正好是上面分组name取值的总和。