mysql记录分组关键词是什么_Mysql关键字之GroupBy(⼀)group by 是⼀个我们在⽇常⼯作学习过程中经常遇到的⼀个Mysql关键字。现总结其⽤法如下,内容会不断补充,出现错误欢迎批评指正。
我们先准备⼀张表和⼀些记录
我们⾸先创建学⽣的成绩表courses:
CREATE TABLE `courses` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '⾃增id',
`student` VARCHAR(255) DEFAULT NULL COMMENT '学⽣',
`class` VARCHAR(255) DEFAULT NULL COMMENT '课程',
`score` INT(255) DEFAULT NULL COMMENT '分数',
PRIMARY KEY (`id`),
UNIQUE KEY `course` (`student`, `class`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
该表记录了学⽣某节课的考试分数。
往courses表中插⼊记录:
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('A', 'Math', 90);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('A', 'Chinese', 80);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('A', 'English', 70);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('A', 'History', 80);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('B', 'Math', 73);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('B', 'Chinese', 60);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('B', 'English', 70);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('B', 'History', 90);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('C', 'Math', 70);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('C', 'Chinese', 50);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('C', 'English', 20);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('C', 'History', 10);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('D', 'Math', 53);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('D', 'Chinese', 32);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('D', 'English', 99);
INSERT INTO `courses`(`student`, `class`, `score`) VALUES('D', 'History', 100);
Group By有什么⽤
我们使⽤⼏个简单的例⼦看⼀下group by的作⽤:
SELECT * FROM `courses` GROUP BY `class`;
执⾏的结果是:
!
[企业截图_20180820143057.png-7.3kB][1]
类似地,我们按照`score`对记录进⾏分组:
```sql
SELECT * FROM `courses` GROUP BY `score`;
```
执⾏的结果是:
![ScreenClip.png-13.8kB][2]
我们甚⾄可以对多个字段进⾏`group by`:
```sql
SELECT * FROM `courses` GROUP BY `class`,`student`;
```
执⾏的结果是:
![ScreenClip.png-14.3kB][3]
最后,我们交换字段顺序对记录进⾏分组:
```sql
SELECT * FROM `courses` GROUP BY `student`,`class`;
```
执⾏的结果是:
![ScreenClip.png-17.2kB][4]
这样的结果可能会使⼈困惑,我们以第⼀个sql为例,解释下sql执⾏的过程:
![未命名⽂件.png-62.2kB][5]
该`sql`⾸先会按照`class`进⾏分组得到四张中间表,然后输出的时候将每⼀个分组的第⼀个记录组合
在⼀起形成了最终的结果。我们还可以发现,最终的记录是按照`class`进⾏排序的。这样的顺序并不可靠,具体形成的原因恐怕需要在`Mysql`的底层原理中到答案。
## Group By还能怎么⽤groupby分组
### 与order by结合在⼀起使⽤
> 我们需要学⽣的成绩表,且每个学⽣每科的成绩按照由⼤到⼩的顺序排列
我们可以很⾃然的写出下⾯的sql:
SELECT * FROM `courses` GROUP BY `student`,`class` ORDER BY `score` DESC;
然⽽,执⾏的结果貌似并不是我们想要的:
![ScreenClip.png-16.6kB][6]
通过观察,我们可以发现,事实上,这个`sql`是将所有的记录按照`score`由⼤到⼩的顺序排列了,为什么会出现这样的结果呢?
事实上,这个取决于整个`sql`的执⾏顺序,真正的执⾏顺序是 `from` ... `where` ... `group by` ... `order
by` ... `select`,`order
by` 作⽤在整个记录,⽽不是每个分组上。
那么,怎么样能够得到我们期望的结果呢?这⾥给出我的`sql`实现:
```sql
SELECT * FROM `courses` GROUP BY `student`,`class` ORDER BY `student`,`score` DESC;
```
执⾏的结果是:
![ScreenClip.png-19.8kB][7]
与having结合在⼀起使⽤
我们需要得到所有功课平均分达到60分的同学和他们的均分:
SELECT `student`, AVG(`score`) AS`avg_score`
FROM `courses`
GROUP BY `student`
HAVING AVG(`score`) >= 60
ORDER BY `avg_score` DESC;
执⾏的结果为:
![ScreenClip (8).png-3.8kB][8]
这⾥需要注意⼀个问题:`where` 与 `having`的区别。`where`作⽤于所有的记录,⽽`having`则作⽤于⼀个分组。举例说明:
> 假设我们这⾥需要得到所有功课(除历史课)平均分达到60分的同学和他们的均分:
SELECT `student`, AVG(`score`) AS `avg_score`
FROM `courses`
WHERE `class` <> 'History'
GROUP BY `student`
HAVING AVG(`score`) >= 60
ORDER BY `avg_score` DESC;
执⾏的结果如下:
![ScreenClip.png-3.1kB][9]
### Group By与Limit
> 我们需要列出均分最⾼的三门课:
SELECT `class`, AVG(`score`) AS `avg_score`
FROM `courses`
GROUP By `class`
ORDER BY `avg_score` DESC
LIMIT 3;
执⾏的结果如下:
![ScreenClip.png-3.8kB][10]
我们需要理解的是:`group by`分组的依据,以及`where`过滤条件作⽤的粒度
如果你觉得你已经理解了`group by`关键字的⽤法,欢迎移步⾄Mysql关键字之Group By(⼆),有点⼩练习在等着你。。。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。