摘要
MySQL练习题,一些常用的基础知识点的练习…
MySQL - 简易篇
重复值查找
[题目]
编写一个SQL查询,查找学生表中所有重复的学生名。
1 | # 建表 |
[思路]
- 读题:查找学生表中所有重复的学生名
- 解题:以学生名分组,筛选出各个分组计数大于1的学生名
1 |
|
寻找第N高的数据
[题目]
exercise2 表中,记录了学生选修课程的名称以及成绩
找出语文课中成绩第二高的学生成绩,如果不存在第二高成绩的学生,那么查询应返回 null 。
1 | # 建表 |
[思路]
- 读题:找出语文课中成绩第二高的学生成绩,如果不存在第二高成绩的学生,那么查询应返回 null 。
- 解题
- 找出所有选修了"语文"课的学生成绩
- 进行排序并选择第二高成绩
- 特殊情况:如果不存在第二高的成绩,返回null
1 |
|
1 | # 验证特殊情况 |
多表联接
[题目]
现在有两个表:
- 学生表:记录了学生的基本信息,字段有 “学号”、“姓名”
- 成绩表:记录了学生选修的课程,以及对于课程的成绩,字段对应为 “课程”、“成绩”
- 两张表通过 “学号” 进行关联
现在需要查找出所有的学生的学号、姓名、课程和成绩。
1 | # 建学生表 |
[思路]
- 读题:查找所有学生的学号、姓名、课程和成绩。
- 解题:
- 其中 “学号” & “姓名” 在student_lx3表中,“课程” & “成绩” 则在score_lx3表中
- 需要 多表联结 进行查询,联结条件为 “学号”
- 多表联结:
- 内联结:根据条件取两表的公共数据
- 左外联结:取 join 左表的所有数据,根据条件关联查询 join 右表的数据,不符合条件以null值填充
- 右外联结:取 join 右表的所有数据,根据条件关联查询 join 左表的数据,不符合条件以null值填充
1 | select a.id,a.name,b.course,b.score |
多表联接 - 外联接
[题目]
现在有两个表:
- 学生表:记录了学生的基本信息,字段有 “学号”、“姓名”
- 近视学生表:记录了序号以及学生学号
- 两张表通过学号进行关联
现在需要找出不是近视的学生都有哪些?
1 | #建学生表 |
[思路]
- 读题:不是近视的学生都有谁?
- 解题:
- 学生表信息包含近视学生表的信息,现在要找出不在近视学生表中但在学生表中的数据,使用left join,学生表为左表
- 根据笛卡尔乘积,可将筛选条件设定为left join 后近视学生表序号为空的数据行
1 | select st.id,st.name |
行列转换
[题目]
cook表记录了三个字段,分别是年、月、值
现需要进行行列转换为:年、m1、m2、m3、m4
1 | #创建表 |
[思路]
- 读题:行列转换为:年、m1、m2、m3、m4
- 解题:
- 按照年进行分组,得到年这一列
- 用case when将原先月这列进行赋值转换,值为原先的"值"一列,并生成新的m1、m2、m3、m4列
- 去除为0的项,可以直接使用max函数,前提是原先"值"该列类型为数值
1 | select year, |
MySQL5.7中的排名
MySQL 5.7实现排名(MySQL8.0 中的rank()、row_number())
[题目]
用户访问表中记录了用户的访问信息,字段有:用户编号、用户类型、访问次数
1 | #创建表 |
持续更新中~