Mysql关键字之Group By(二)
原文地址,优先更新https://hhe0.github.io
- 我们在上一节简单介绍了
 Mysql中group 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(二)的更多相关文章
- Mysql关键字之Group By(一)
		
原文地址,优先更新https://hhe0.github.io group by 是一个我们在日常工作学习过程中经常遇到的一个Mysql关键字.现总结其用法如下,内容会不断补充,出现错误欢迎批评指正. ...
 - {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析
		
MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...
 - 百万年薪python之路  --  MySQL数据库之  MySQL行(记录)的操作(二) -- 多表查询
		
MySQL行(记录)的操作(二) -- 多表查询 数据的准备 #建表 create table department( id int, name varchar(20) ); create table ...
 - MySQL关键字
		
MySQL关键字 ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE BETWEEN BIGINT BINARY BLOB BOTH BY CALL ...
 - mysql 关键字于数据库字段于关键字冲突的问题
		
如果数据库存储字段 为MySQL关键字,那么在查询或者其他操作时会出错.那么我们应该怎么办, 可能有些人会说,换个字段不就好了啊.当然这样也是可以的,完全没问题. 然而,如果是在无法对数据库进行修改和 ...
 - Oracle和MySQL分组查询GROUP BY
		
Oracle和MySQL分组查询GROUP BY 真题1.Oracle和MySQL中的分组(GROUP BY)有什么区别? 答案:Oracle对于GROUP BY是严格的,所有要SELECT出来的字段 ...
 - MySQL组提交(group commit)
		
MySQL组提交(group commit) 前提: 以下讨论的前提 是设置MySQL的crash safe相关参数为双1: sync_binlog=1 innodb_flush_log_at_trx ...
 - MySQL字段命名不能使用的MySQL关键字
		
#今天遇到一个问题,把某一字段重新命名为condition时报错,于是联想到可能是MySQL的关键字,用``引起来后,问题解决. #在MySQL数据库中,Table字段不能使用MySQL关键字: #[ ...
 - 我的MYSQL学习心得(十二) 触发器
		
我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...
 
随机推荐
- 【Java】《Java程序设计基础教程》第二章学习
			
一.标识符 Java 中标识符的使用有如下规定:(1)标识符由字母.数字.美元符号”$”和下划线”_”组成,除此之外的任何其他符号是不能作为标识符使用的.(2)标识符中的第一个字符不能为数字. (3 ...
 - HDU - 6125: Free from square (状压DP+分组背包)
			
problem:给定N,K.表示你有数1到N,让你最多选择K个数,问有多少种方案,使得选择的数的乘积无平方因子数.N,K<500: solution:显然可以状压DP做,但是500以内的素数还是 ...
 - C# 4.0 新特性(.NET Framework 4.0 与 Visual Studio 2010 )
			
一.dynamic binding:动态绑定 在通过 dynamic 类型实现的操作中,该类型的作用是不在编译时类型检查,而是在运行时解析这些操作.dynamic 类型简化了对 COM API(例如 ...
 - 三种Timer
			
一.基于 Windows 的标准计时器(System.Windows.Forms.Timer) 首先注意一点就是:Windows 计时器是为单线程环境设计的.它直接继承自Componet.Timer控 ...
 - RMQ--树状数组,ST表,线段树
			
RMQ Range Minimum/Maximum Query 区间最值问题 树状数组 https://www.cnblogs.com/xenny/p/9739600.html lowbit(x) x ...
 - postgresql 修改用户密码
			
本文链接:https://blog.csdn.net/pg_hgdb/article/details/79202912如果客户端认证方式为密码验证,那么必然会涉及到修改密码 如何安全地修改密码: ...
 - HDP 企业级大数据平台
			
一 前言 阅读本文前需要掌握的知识: Linux基本原理和命令 Hadoop生态系统(包括HDFS,Spark的原理和安装命令) 由于Hadoop生态系统组件众多,导致大数据平台多节点的部署,监控极其 ...
 - .net文件夹上传下载组件
			
ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现. 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压. ASP.NE ...
 - learning java AWT BoxLayout布局管理器
			
import javax.swing.*; import java.awt.*; public class BoxSpaceTest { private Frame f = new Frame(&qu ...
 - GitHub上的一些使用技巧
			
1.搜索 转:掌握 3 个搜索技巧,在 GitHub 上快速找到实用软件资源 例如 查找位于深圳的C#开发者 2.查看文件历史提交记录 定位至需要查看的文件 修改地址栏github.com 为 git ...