原文地址,优先更新https://hhe0.github.iohtml
group by
是一个咱们在平常工做学习过程当中常常遇到的一个Mysql
关键字。现总结其用法以下,内容会不断补充,出现错误欢迎批评指正。mysql
咱们首先建立学生的成绩表courses
:git
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
表中插入记录:github
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
的做用:sql
SELECT * FROM `courses` GROUP BY `class`;
执行的结果是:
微信
score
对记录进行分组:
SELECT * FROM `courses` GROUP BY `score`;
执行的结果是:
学习
group by
:
SELECT * FROM `courses` GROUP BY `class`,`student`;
执行的结果是:
3d
SELECT * FROM `courses` GROUP BY `student`,`class`;
执行的结果是:
code
sql
首先会按照
class
进行分组获得四张中间表,而后输出的时候将每个分组的第一个记录组合在一块儿造成了最终的结果。咱们还能够发现,最终的记录是按照
class
进行排序的。这样的顺序并不可靠,具体造成的缘由恐怕须要在
Mysql
的底层原理中找到答案。
咱们须要学生的成绩表,且每一个学生每科的成绩按照由大到小的顺序排列htm
咱们能够很天然的写出下面的sql
:
SELECT * FROM `courses` GROUP BY `student`,`class` ORDER BY `score` DESC;
然而,执行的结果貌似并非咱们想要的:
sql
是将全部的记录按照
score
由大到小的顺序排列了,为何会出现这样的结果呢?
sql
的执行顺序,真正的执行顺序是
from
...
where
...
group by
...
order by
...
select
,
order by
做用在整个记录,而不是每一个分组上。
sql
实现:
SELECT * FROM `courses` GROUP BY `student`,`class` ORDER BY `student`,`score` DESC;
执行的结果是:
咱们须要获得全部功课平均分达到60分的同窗和他们的均分:
SELECT `student`, AVG(`score`) AS`avg_score` FROM `courses` GROUP BY `student` HAVING AVG(`score`) >= 60 ORDER BY `avg_score` DESC;
执行的结果为:
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;
执行的结果以下:
咱们须要列出均分最高的三门课:
SELECT `class`, AVG(`score`) AS `avg_score` FROM `courses` GROUP By `class` ORDER BY `avg_score` DESC LIMIT 3;
执行的结果以下:
group by
分组的依据,以及
where
过滤条件做用的粒度
group by
关键字的用法,欢迎移步至
Mysql关键字之Group By(二),有点小练习在等着你。。。