mysql--group by

本文通过实例演示了MySQL中GROUP BY语句的使用,包括仅使用GROUP BY分组、结合聚合函数以及如何处理分组后数据不匹配的问题,通过关联查询确保数据的准确性。
摘要由CSDN通过智能技术生成
关于group by,按照字面意思,就是对字段进行分组
下面针对一个字段的group by 做了一下实验。


表结构如下:
mysql> select * from course;
+----+-----------+-------------+---------+-------+
| id | studentId | studentName | subject | score |
+----+-----------+-------------+---------+-------+
| 1  | 1         | 李明        | 语文    |    98 |
| 2  | 1         | 李明        | 数学    |    80 |
| 3  | 2         | 小红        | 数学    |    70 |
| 4  | 1         | 李明        | 英语    |    85 |
| 5  | 2         | 小红        | 语文    |    80 |
| 6  | 3         | 王强        | 英语    |    60 |
| 7  | 3         | 王强        | 数学    |   100 |
+----+-----------+-------------+---------+-------+


如果只是group by 一个studentId的话,相当于按照studentId分组,并且每组里有多个数据


+----+-----------+-------------+---------+-------+
| id | studentId | studentName | subject | score |
+----+-----------+-------------+---------+-------+
| 1  |           | 李明        | 语文    |    98 |
| 2  | 1         | 李明        | 数学    |    80 |
| 4  |           | 李明        | 英语    |    85 |
|----|-----------|-------------|---------|-------|
| 3  | 2         | 小红        | 数学    |    70 |
| 5  |           | 小红        | 语文    |    80 |
|----|-----------|-------------|---------|-------|
| 6  | 3         | 王强        | 英语    |    60 |
| 7  |           | 王强        | 数学    |   100 |
+----+-----------+-------------+---------+-------+


但是sql不允许多个数据存在,所以执行sql语句后,显示结构如下:
mysql> select * from course group by studentId;
+----+-----------+-------------+---------+-------+
| id | studentId | studentName | subject | score |
+----+-----------+-------------+---------+-------+
| 1  | 1         | 李明        | 语文    |    98 |
| 3  | 2         | 小红        | 数学    |    70 |
| 6  | 3         | 王强        | 英语    |    60 |
+----+-----------+-------------+---------+-------+
显示了所有数据的第一行。


如果用聚合函数统计这些数据,如max,则聚合函数执行的那一列对数据进行了统计,其他数据还是显示的第一行
执行sql如下:
mysql> select id, studentName, subject ,max(score) as score from course group by studentId;
+----+-------------+---------+-------+
| id | studentName | subject | score |
+----+-------------+---------+-------+
| 1  | 李明        | 语文    |    98 |
| 3  | 小红        | 数学    |    80 |
| 6  | 王强        | 英语    |   100 |
+----+-------------+---------+-------+
score取得是每个数据集合里面最大的分数,但其他的字段仍然取得第一条,导致不匹配。


为了让数据可以匹配,用了关联查询
sql语句如下:
mysql> select id, studentName, subject ,score from course c
    -> left join (select studentId,max(score) as s from course group by studentId) m
    -> on c.studentId = m.studentId
    -> where c.score = m.s;
+----+-------------+---------+-------+
| id | studentName | subject | score |
+----+-------------+---------+-------+
| 1  | 李明        | 语文    |    98 |
| 5  | 小红        | 语文    |    80 |
| 7  | 王强        | 数学    |   100 |
+----+-------------+---------+-------+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值