MySQL——高级查询(3)分组查询

        在对表中数据进行统计时,也可能需要按照一定的类别进行统计,比如,分别统计 student 表中 gender 字段值为 “ 男 ” 、“ 女 ” 和 “ NULL ” 的学生成绩 (grade字段) 之和。在 MySQL中,可以使用 GROUP BY 按某个字段或者多个字段中的值进行分组,字段中值同的为一组,其语法格式如下所示:

SEIECT 字段名 1,字段名 2,…
FROM 表名
GROUP BY 字段名 1,字段名 2,…[HAVING 条件表达式];

        在上面的语法格式中,指定的字段名1、字段名2 等是对查询结果分组的依据 HAVING 关键字指定条件表达式对分组后的内容进行过滤。需要特别注意的是 GROUP BY 一般和聚合函数一起使用,如果查询的字段出现在 GROUP BY 后,却没有自含在聚合函数中,该字段显示的是分组后的第一条记录的值,这样有可能会导致查询果不符合我们的预期。

        由于分组查询比较复杂,接下来将分几种情况对分组查询进行讲解。

1.单独使用 GROUP BY 分组

        单独使用 GROUP BY关键字,查询的是每个分组中的一条记录,例如,查询 student 表中的记录,按照 gender 字段值进行分组,SQL 语句如下所示:

SELECT * FROM student GROUP BY gender;

        执行结果如下所示:

mysql> SSELECT * FROM student GROUP BY gender;
+----+------------+-------+--------+
| id | name       | grade | gender |
+----+------------+-------+--------+
|  8 | yanging    |    90 | NULL   |
|  4 | husanniang |    88 | 女     |
|  1 | songjiang  |    40 | 男     |
+----+------------+-------+--------+
3 rows in set (0.00 sec)

        从查询结果可以看到返回了三条记录,这三条记录中 gender 字段的值分别为 “ NULL ” “ 男 ” 、“ 女 ”,这说明了查询结果是按照 gender 字段中不同的值进行分类。然而这样的查询结果只显示每个分组中的一条记录,意义并不大,一般情况下 GROUP BY 都和聚合函数一起使用。

2.GROUP BY 和聚合函数一起使用

        GROUP BY 和聚合函数一起使用,可以统计出某个或者某些字段在一个分组中的最大值、最小值、平均值等。
        例如,将 student 表按照 gender 字段值进行分组查询,计算出每个分组中各有多少名学生,SQL语句如下所示:

SELECT COUNT(*),gender FROM student GROUP BY gender;

        执行结果如下所示:

mysql> SELECT COUNT(*),gender FROM student GROUP BY gender;
+----------+--------+
| COUNT(*) | gender |
+----------+--------+
|        1 | NULL   |
|        2 | 女     |
|        3 | 男     |
+----------+--------+
3 rows in set (0.00 sec)

        从查询结果可以看到,GROUP BY 对 student 表按照 gender 字段中的不同值进行了分组,并通过 COUNT() 函数统计出 gender 字段值为 “ NULL”的学生有一个,gender 字段值为 “ 男 ” 的学生有 5 个,gender 字段值为 “ 女 ” 的学生有两个。

3.GROUP BY 和 HAVING 关键字一起使用

        HAVING 关键字和 WHERE 关键字的作用相同,都用于设置条件表达式对查询结果进行过滤,两者的区别在于,AVING 关键字后可以跟聚合函数,而 WHERE 关键字不能,通常情况下 HAVING 关键字都和 GROUP BY 一起使用,用于对分组后的结果进行过滤。

        例如,将 student 表按照 gender 字段进行分组查询,查询出 grade 字段值之和小于 300 的分组,SQL 语句如下所示:

SELECT sum(grade),gender FROM student GROUP By gender HAVING SUM(grade)<300;

        执行结果如下所示:

mysql> SELECT sum(grade),gender FROM student GROUP By gender HAVING SUM(grade)<300;
+------------+--------+
| sum(grade) | gender |
+------------+--------+
|         90 | NULL   |
|        154 | 女     |
+------------+--------+
2 rows in set (0.00 sec)

        从查询结果可以看到,只有 gender 值为 “ NULL ” 和 “ 女 ” 的分组其 grade 字段值之和小于300。为了验证查询结果的正确性,下面对 gender 值为 “ 男 ” 的所有学生其 grade 字段值之和进行查询,执行结果如下所示:

mysql> SELECT SUM(grade),gender FROM student WHERE gender='男';
+------------+--------+
| SUM(grade) | gender |
+------------+--------+
|        408 | 男     |
+------------+--------+
1 row in set (0.01 sec)

        从查询结果可以看到,gender 字段值为 “ 男 ” 的所有学生其 grade 字段值之和为 408,可以说明上面分组查询结果的正确性。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code repairman

你的鼓励将是我创作的最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值