15000 字的 MySQL 速查手册 下

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 15000 字的 MySQL 速查手册 下

案例:查询各科成绩前两名的记录

第1步,查出有哪些组

我们可以按课程号分组,查询出有哪些组,对应这个问题里就是有哪些课程号

select 课程号,max(成绩) as 最大成绩
from score 
group by 课程号;

第2步:先使用order by子句按成绩降序排序(desc),然后使用limt子句返回topN(对应这个问题返回的成绩前两名)

-- 课程号'0001' 这一组里成绩前2名
select * 
from score 
where 课程号 = '0001' 
order by 成绩  desc 
limit 2;

同样的,可以写出其他组的(其他课程号)取出成绩前2名的sql,第3步,使用union all 将每组选出的数据合并到一起

-- 左右滑动可以可拿到全部sql
(select * from score where 课程号 = '0001' order by 成绩  desc limit 2)
union all
(select * from score where 课程号 = '0002' order by 成绩  desc limit 2)
union all
(select * from score where 课程号 = '0003' order by 成绩  desc limit 2);

986430decec442818ca2d64c30900f7.jpg

前面我们使用order by子句按某个列降序排序(desc)得到的是每组最大的N个记录。如果想要达到每组最小的N个记录,将order by子句按某个列升序排序(asc)即可。

求topN的问题还可以使用自定义变量来实现,这个在后续再介绍。

如果对多表合并还不了解的,可以看下我讲过的《从零学会SQL》的“多表查询”。

总结

常见面试题:分组取每组最大值、最小值,每组最大的N条(top N)记录。

4.多表查询

0a564e4375fd2b666628b3efa18931e.jpg

查询所有学生的学号、姓名、选课数、总成绩

select a.学号,a.姓名,count(b.课程号) as 选课数,sum(b.成绩) as 总成绩
from student as a left join score as b
on a.学号 = b.学号
group by a.学号;

查询学生的选课情况:学号,姓名,课程号,课程名称

select a.学号, a.姓名, c.课程号,c.课程名称
from student a inner join score b on a.学号=b.学号
inner join course c on b.课程号=c.课程号;

查询出每门课程的及格人数和不及格人数

-- 考察case表达式
select 课程号,
sum(case when 成绩>=60 then 1 
  else 0 
    end) as 及格人数,
sum(case when 成绩 <  60 then 1 
  else 0 
    end) as 不及格人数
from score
group by 课程号;

使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称

-- 考察case表达式
select a.课程号,b.课程名称,
sum(case when 成绩 between 85 and 100 
  then 1 else 0 end) as '[100-85]',
sum(case when 成绩 >=70 and 成绩<85 
  then 1 else 0 end) as '[85-70]',
sum(case when 成绩>=60 and 成绩<70  
  then 1 else 0 end) as '[70-60]',
sum(case when 成绩<60 then 1 else 0 end) as '[<60]'
from score as a right join course as b 
on a.课程号=b.课程号
group by a.课程号,b.课程名称;

查询课程编号为0003且课程成绩在80分以上的学生的学号和姓名|

select a.学号,a.姓名
from student  as a inner join score as b on a.学号=b.学号
where b.课程号='0003' and b.成绩>80;

下面是学生的成绩表(表名score,列名:学号、课程号、成绩)

0460ddf54fc25d7d6fb0f3e000f0d25.jpg

使用sql实现将该表行转列为下面的表结构

b4c6e2f87b158c72b0fdfba5246a458.jpg

【面试题类型总结】这类题目属于行列如何互换,解题思路如下:

【面试题】下面是学生的成绩表(表名score,列名:学号、课程号、成绩)

62c970773afe02f0e90b61e6f228278.jpg

使用sql实现将该表行转列为下面的表结构

e3b5a11363c4c20a084daac238e1599.jpg

【解答】

第1步,使用常量列输出目标表的结构

可以看到查询结果已经和目标表非常接近了

select 学号,'课程号0001','课程号0002','课程号0003'
from score;

aa97f882c9a1b997727592d14bdfc2a.jpg

第2步,使用case表达式,替换常量列为对应的成绩

select 学号,
(case 课程号 when '0001' then 成绩 else 0 end) as '课程号0001',
(case 课程号 when '0002' then 成绩 else 0 end) as  '课程号0002',
(case 课程号 when '0003' then 成绩 else 0 end) as '课程号0003'
from score;

5e47249a1a9752d918283dde313c3d2.jpg

在这个查询结果中,每一行表示了某个学生某一门课程的成绩。比如第一行是'学号0001'选修'课程号00001'的成绩,而其他两列的'课程号0002'和'课程号0003'成绩为0。

每个学生选修某门课程的成绩在下图的每个方块内。我们可以通过分组,取出每门课程的成绩。

87493b77d99a0f77ec28b31546444d8.jpg

第3关,分组

分组,并使用最大值函数max取出上图每个方块里的最大值

select 学号,
max(case 课程号 when '0001' then 成绩 else 0 end) as '课程号0001',
max(case 课程号 when '0002' then 成绩 else 0 end) as '课程号0002',
max(case 课程号 when '0003' then 成绩 else 0 end) as '课程号0003'
from score
group by 学号;

这样我们就得到了目标表(行列互换)

6fcf5b3be6b7d9e19661954fa9d6c86.jpg

作者:sh_c_2450957609
blog.csdn.net/u010565545/article/details/100785261


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
存储 SQL 关系型数据库
Mysql学习手册(第一部分)
【5月更文挑战第17天】Mysql学习手册(第一部分)
74 0
|
7月前
|
存储 SQL 关系型数据库
MySQL学习手册(第一部分)
mysql日常使用记录
150 0
|
关系型数据库 MySQL 数据库
史上最全的MySQL性能手册(优化+SQL+并发+数据库)
史上最全的MySQL性能手册(优化+SQL+并发+数据库)
|
存储 关系型数据库 MySQL
MySQL手册 2
MySQL手册
110 1
|
JSON 安全 关系型数据库
MySQL 8.0 参考手册— 内置函数和运算符参考
MySQL 8.0 参考手册— 内置函数和运算符参考
108 0
|
存储 关系型数据库 MySQL
MySQL手册 3
MySQL手册
|
关系型数据库 MySQL
Github上标星68.5K,阿里巴巴《MySQL成长手册》火了
MySQL为什么能如此火爆? 成本,MySQL是开源的,他可以免费使用。 性能,MySQL快不快大家应该都有体会。 可靠性,超级大厂都在用它来处理重要数据,放心用就行; 简单,安装使用都非常简单
|
存储 SQL 关系型数据库
MD牛!阿里多位资深MySQL专家撰写的437页MySQL技术内幕分享手册
MySQL数据库的体系结构 MySQL由以下几部分组成: 连接池组件 管理服务和工具组件 SQL接口组件 查询分析器组件 优化器组件 缓冲(Cache)组件 插件式存储引擎 物理文件
93 0
|
SQL 存储 关系型数据库
MySQL手册 4
MySQL手册
150 0
|
SQL 关系型数据库 MySQL
MySQL手册 1
MySQL手册
220 0