关于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 |
+----+-------------+---------+-------+
下面针对一个字段的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 |
+----+-------------+---------+-------+