在 mysql 中,group by 关键字可以根据一个或多个字段对查询结果进行分组。
使用 group by 关键字的语法格式如下:
group by <字段名>
其中,“字段名”表示需要分组的字段名称,多个字段时用逗号隔开。
group by单独使用
单独使用 group by 关键字时,查询结果会只显示每个分组的第一条记录。
例 1
下面根据 tb_students_info 表中的 sex 字段进行分组查询,sql 语句和运行结果如下:
mysql> select `name`,`sex` from tb_students_info -> group by sex; +-------+------+ | name | sex | +-------+------+ | henry | 女 | | dany | 男 | +-------+------+ 2 rows in set (0.01 sec)
结果中只显示了两条记录,这两条记录的 sex 字段的值分别为“女”和“男”。
group by 与 group_concat()
group by 关键字可以和 group_concat() 函数一起使用。group_concat() 函数会把每个分组的字段值都显示出来。
例 2
下面根据 tb_students_info 表中的 sex 字段进行分组查询,使用 group_concat() 函数将每个分组的 name 字段的值都显示出来。sql 语句和运行结果如下:
mysql> select `sex`, group_concat(name) from tb_students_info -> group by sex; +------+----------------------------+ | sex | group_concat(name) | +------+----------------------------+ | 女 | henry,jim,john,thomas,tom | | 男 | dany,green,jane,lily,susan | +------+----------------------------+ 2 rows in set (0.00 sec)
由结果可以看到,查询结果分为两组,sex 字段值为“女”的是一组,值为“男”的是一组,且每组的学生姓名都显示出来了。
例 3
下面根据 tb_students_info 表中的 age 和 sex 字段进行分组查询。sql 语句和运行结果如下:
mysql> select age,sex,group_concat(name) from tb_students_info -> group by age,sex; +------+------+--------------------+ | age | sex | group_concat(name) | +------+------+--------------------+ | 21 | 女 | john | | 22 | 女 | thomas | | 22 | 男 | jane,lily | | 23 | 女 | henry,tom | | 23 | 男 | green,susan | | 24 | 女 | jim | | 25 | 男 | dany | +------+------+--------------------+ 7 rows in set (0.00 sec)
上面实例在分组过程中,先按照 age 字段进行分组,当 age 字段值相等时,再把 age 字段值相等的记录按照 sex 字段进行分组。
多个字段分组查询时,会先按照第一个字段进行分组。如果第一个字段中有相同的值,mysql 才会按照第二个字段进行分组。如果第一个字段中的数据都是唯一的,那么 mysql 将不再对第二个字段进行分组。
group by 与聚合函数
在数据统计时,group by 关键字经常和聚合函数一起使用。
聚合函数包括 count(),sum(),avg(),max() 和 min()。其中,count() 用来统计记录的条数;sum() 用来计算字段值的总和;avg() 用来计算字段值的平均值;max() 用来查询字段的最大值;min() 用来查询字段的最小值。
例 4
下面根据 tb_students_info 表的 sex 字段进行分组查询,使用 count() 函数计算每一组的记录数。sql 语句和运行结果如下:
mysql> select sex,count(sex) from tb_students_info -> group by sex; +------+------------+ | sex | count(sex) | +------+------------+ | 女 | 5 | | 男 | 5 | +------+------------+ 2 rows in set (0.00 sec)
结果显示,sex 字段值为“女”的记录是一组,有 5 条记录;sex 字段值为“男”的记录是一组,有 5 条记录。
group by 与 with rollup
with pollup 关键字用来在所有记录的最后加上一条记录,这条记录是上面所有记录的总和,即统计记录数量。
例 5
下面根据 tb_students_info 表中的 sex 字段进行分组查询,并使用 with rollup 显示记录的总和。
mysql> select sex,group_concat(name) from tb_students_info ->group by sex with rollup; +------+------------------------------------------------------+ | sex | group_concat(name) | +------+------------------------------------------------------+ | 女 | henry,jim,john,thomas,tom | | 男 | dany,green,jane,lily,susan | | null | henry,jim,john,thomas,tom,dany,green,jane,lily,susan | +------+------------------------------------------------------+ 3 rows in set (0.00 sec)
查询结果显示,group_concat(name) 显示了每个分组的 name 字段值。同时,最后一条记录的 group_concat(name) 字段的值刚好是上面分组 name 字段值的总和。
到此这篇关于mysql使用group by分组查询的文章就介绍到这了,更多相关mysql group by分组查询内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论