原文地址,优先更新https://hhe0.github.io

  • 我们在上一节简单介绍了Mysqlgroup by关键字的用法,没有看过的同学点击这里了解一下;
  • 文中提到的courses表和相关记录可以在上一篇文章中自取;
  • 给出的所有sql仅供参考,不一定是效率最高的解法,如果大家有其他的方法,也欢迎提供出来,一起讨论。

练习1 那些年一起修过的课

所有的课程

我们的第一反应是可以使用distinct关键字实现

SELECT DISTINCT(`class`) FROM `courses`;!

执行的结果如下:

![ScreenClip.png-2.5kB][1]

事实上,我们同样可以使用group by来实现

SELECT `class` FROM `courses` GROUP BY `class`;

结果与上面相同。因此,我们可以发现group by的一个重要的作用就是枚举出所有满足group by条件的组合,间接达到了去重的效果。

练习2 我要修什么课

所有的学生对应修读的课程

SELECT `student`,`class`
FROM `courses`
GROUP BY `student`, `class`;

执行的结果如下

![ScreenClip.png-10.8kB][2]

练习3 糟糕的成绩单

每门课程的排名表

对应的sql为:

SELECT `class`, `student`, `score`
FROM `courses`
ORDER BY `class`, `score` DESC;

执行的结果如下:

![ScreenClip.png-11.7kB][3]

练习4 推选课代表

参考每门课的最高分选择课代表

对应的sql

SELECT `c`.`class`, `c`.`student`, `c`.`score`
FROM (
SELECT `class`, MAX(`score`) AS `score`
FROM `courses`
GROUP BY `class`
)`T`
INNER JOIN `courses` `c` ON `T`.`class` = `c`.`class` AND `T`.`score` = `c`.`score`;

执行结果如下

![ScreenClip.png-5kB][4]

练习5 奖学金

为每门课的前三名颁奖

我们容易写出这样的一个sql

SELECT `class`, `student`
FROM `courses`
GROUP BY `class`, `student`
ORDER BY `class`, `score`
LIMIT 3;

很显然,这并不是我们想要的结果,至于为什么结果是这个样子的,大家可以参考上面的order by,这里不再赘述。

正确的sql

SELECT `c1`.`class`, `c1`.`student`, `c1`.`score`
FROM `courses` `c1`
INNER JOIN `courses` `c2` ON `c1`.`class` = `c2`.`class` AND `c1`.`student` <> `c2`.`student` AND `c1`.`score` > `c2`.`score`
GROUP BY `c1`.`class`, `c1`.`student`
ORDER BY `c1`.`class`, `c1`.`score` DESC;

再提供一种通用的解法

SELECT `c1`.`class`, `c1`.`student`, `c1`.`score`
FROM `courses` `c1`
INNER JOIN `courses` `c2` ON `c1`.`class` = `c2`.`class` AND `c1`.`score` <= `c2`.`score`
GROUP BY `c1`.`class`, `c1`.`student`
HAVING COUNT(*) <= 3
ORDER BY `c1`.`class`, `c1`.`score` DESC;

上述两个sql执行的结果均为

![ScreenClip.png-9.3kB][6]

两个sql中为什么一个条件是c1.score>c2.score而另一个是c1.score<=c2.score,以及count(*)<=3而不是count(*)<3,可以细细体会下。

练习6 长板与短板

了解每个学生最擅长的科目和最不擅长的科目

对应的sql

SELECT `T`.`student`, `c`.`class` AS `best_class`, `T`.`max_score` AS `max_score`, `c2`.`class` AS `worst_class`, `T`.`min_score`
FROM (
SELECT `student`, MAX(`score`) AS `max_score`, MIN(`score`) AS `min_score`
FROM `courses`
GROUP BY `student`
) `T`
INNER JOIN `courses` `c` ON `T`.`student` = `c`.`student` AND `c`.`score` = `T`.`max_score`
INNER JOIN `courses` `c2` ON `T`.`student` = `c2`.`student` AND `c2`.`score` = `T`.`min_score`;

执行的结果如下

![ScreenClip.png-9.9kB][7]

练习7 无聊的排序

找到各个分数:Math>Chinese>English>History的同学

对应的sql

SELECT `c1`.`student`, `c1`.`class`, `c1`.`score`, `c2`.`class`, `c2`.`score`, `c3`.`class`, `c3`.`score`, `c4`.`class`, `c4`.`score`
FROM `courses` `c1`
INNER JOIN `courses` `c2` ON `c1`.`student` = `c2`.`student` AND `c2`.`class` = 'Chinese'
INNER JOIN `courses` `c3` ON `c1`.`student` = `c3`.`student` AND `c3`.`class` = 'English'
INNER JOIN `courses` `c4` ON `c1`.`student` = `c4`.`student` AND `c4`.`class` = 'History'
WHERE `c1`.`class` = 'Math' AND `c1`.`score` > `c2`.`score` AND `c2`.`score` > `c3`.`score` AND `c3`.`score` > `c4`.`score`;

执行的结果为

![ScreenClip.png-4.7kB][8]
想到就更新一些有趣的sql~

Mysql关键字之Group By(二)的更多相关文章

  1. Mysql关键字之Group By(一)

    原文地址,优先更新https://hhe0.github.io group by 是一个我们在日常工作学习过程中经常遇到的一个Mysql关键字.现总结其用法如下,内容会不断补充,出现错误欢迎批评指正. ...

  2. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

  3. 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(二) -- 多表查询

    MySQL行(记录)的操作(二) -- 多表查询 数据的准备 #建表 create table department( id int, name varchar(20) ); create table ...

  4. MySQL关键字

    MySQL关键字 ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE BETWEEN BIGINT BINARY BLOB BOTH BY CALL ...

  5. mysql 关键字于数据库字段于关键字冲突的问题

    如果数据库存储字段 为MySQL关键字,那么在查询或者其他操作时会出错.那么我们应该怎么办, 可能有些人会说,换个字段不就好了啊.当然这样也是可以的,完全没问题. 然而,如果是在无法对数据库进行修改和 ...

  6. Oracle和MySQL分组查询GROUP BY

    Oracle和MySQL分组查询GROUP BY 真题1.Oracle和MySQL中的分组(GROUP BY)有什么区别? 答案:Oracle对于GROUP BY是严格的,所有要SELECT出来的字段 ...

  7. MySQL组提交(group commit)

    MySQL组提交(group commit) 前提: 以下讨论的前提 是设置MySQL的crash safe相关参数为双1: sync_binlog=1 innodb_flush_log_at_trx ...

  8. MySQL字段命名不能使用的MySQL关键字

    #今天遇到一个问题,把某一字段重新命名为condition时报错,于是联想到可能是MySQL的关键字,用``引起来后,问题解决. #在MySQL数据库中,Table字段不能使用MySQL关键字: #[ ...

  9. 我的MYSQL学习心得(十二) 触发器

    我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...

随机推荐

  1. java常用关键字(static、final、this、super)

    this关键字 this关键字的作用有 1.调用本类的成员变量 public class Soft{ private int a; public Soft(int a){ this.a=a; } } ...

  2. Django上传文件和修改date格式

    上传大文件的时候: 修改date数据:

  3. Backpack V

    Description Given n items with size nums[i] which an integer array and all positive numbers. An inte ...

  4. SpringBoot官方文档学习(三)配置文件、日志、国际化和JSON

    一.Profiles Spring配置文件提供了一种方法来隔离应用程序配置的各个部分,并使其仅在某些环境中可用.任何@Component.@Configuration或@ConfigurationPr ...

  5. [React] Use the React Effect Hook in Function Components

    Similar to the State Hook, the Effect Hook is “first-class” in React and handy for performing side e ...

  6. RookeyFrame 还原 软删除的数据 怎么硬删除 或者 怎么还原

     列表搜索栏上有个删除图标,可以进入回收站   如图:

  7. Android Studio 和 SDK 下载、安装和环境变量配置

    转Android Studio 和 SDK 下载.安装和环境变量配置https://blog.csdn.net/hahahhahahahha123456/article/details/8065135 ...

  8. 史上最全java pdf精品书籍整理

    算法,多线程,spring,数据库,大数据,面试题等等.喜欢的小伙伴加群获取 QQ群号825199617 (非广告培训技术群,纯java知识交流,请自重)

  9. 【洛谷】P2261 [CQOI2007]余数求和

    题面?? 点我获得题面QAQ 我这个咕儿终于在csp初赛前夕开始学习数论了! 我是绝对不会承认之前不学数学是因为去年刚开始学OI的时候就跟yyq他们学莫比乌斯反演然后自闭的 分析 对于k mod i, ...

  10. mysql 连接服务器报ERROR 1130 ,mysql服务正常运行

    今天办公电脑的mysql罢工了,折腾了半天,记录一下. 错误如下: ERROR 1130 (HY000): Host 'localhost' is not allowed to connect to ...