原文地址,优先更新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. Spring Task定时任务的配置和使用详解

    spring中使用定时任务 1.基于xml配置文件使用定时任务 首先配置spring开启定时任务 <beans xmlns="http://www.springframework.or ...

  2. Linux安装版本solr-5.3.0

    准备材料:solr-5.3.0.tgz 下载路径:http://mirrors.hust.edu.cn/apache/lucene/solr/ 安装solr 1.解压solr [root@svn-se ...

  3. python - django (创建到运行流程)

    a = 0 """ 1. 创建 Django 操作文件 a. cmd 中选择路径: cd C:\Users\ad\PycharmProjects\index\1\文件名 ...

  4. tensorflow serving 模型部署

    拉去tensorflow srving 镜像 docker pull tensorflow/serving:1.12.0 代码里新增tensorflow 配置代码 # 要指出输入,输出张量 #指定保存 ...

  5. DirectX学习入门笔记(一)

    原文:https://blog.csdn.net/butcher986115/article/details/50595937  什么是DirectX? DirectX是游戏制作者的API(Appli ...

  6. 分布式缓存Redis集群搭建

    redis安装 1.下载tar包至/opt/redis 2.解压tar包 tar -xvf redis-4.0.14.tar.gz 3. cd redis-4.0.14 make一下. 单节点的red ...

  7. centos7磁盘分区、格式化、挂载

    1.分区:a. 查看磁盘分区表: # fdisk -l b. 查看指定磁盘分区表: # fdisk -l /dev/sdb c. 分区命令: fdisk /dev/sdb 常用命令: n:创建新分区 ...

  8. Binder 原理剖析***

    一. 前言 希望更加深入理解 Binder 实现机制的,可以阅读文末的参考资料以及相关源码. 二. Binder 概述 简单介绍下什么是 Binder.Binder 是一种进程间通信机制,基于开源的 ...

  9. Spark(四十七):Spark UI 数据可视化

    导入: 1)Spark Web UI主要依赖于流行的Servlet容器Jetty实现: 2)Spark Web UI(Spark2.3之前)是展示运行状况.资源状态和监控指标的前端,而这些数据都是由度 ...

  10. 常用的web api总结

    1.querySelector 获取指定元素中匹配css选择器的元素. // 作用在document document.querySelector("#nav"); // 获取文档 ...