MySQL50-4-第6-10题
本文中介绍的是第6-10题,涉及到的主要知识点:
- 模糊匹配和通配符使用
- 表的自连接
- in/not in
- 连接查询的条件筛选
题目6
题目需求
查询“李”姓老师的数量
分析过程
使用通配符和like来解决
SQL实现
1 | select count(t_name) from Teacher where t_name like "李%"; -- 通配符 |
这题怕是最简单的吧😭
题目7
题目需求
查询学过张三老师授课的同学的信息
分析过程
1 | 张三老师:Course--->t_name |
SQL实现
1 | -- 方法1:通过张三老师的课程的学生来查找;自己的方法 |
自己的方法:
方法2来实现:
方法3实现:
题目8
题目需求
找出没有学过张三老师课程的学生
分析过程
和上面👆的题目是互补的,考虑取反操作
SQL实现
1 | select * -- 3. 通过学号找出全部学生信息 |
方法2:
题目9
题目需求
查询学过编号为01,并且学过编号为02课程的学生信息
分析过程
- 课程编号:
Score——>c_id
(课程编号) - 学生信息:
Student——>*
(学生信息)
SQL实现
1 | -- 自己的方法:通过自连接实现 |
- 先从Score表中看看哪些人是满足要求的:01-05同学是满足的
通过自连接查询的语句如下:
查询出学号后再匹配出学生信息:
通过where语句实现:
方法3的实现:
题目10
题目需求
查询学过01课程,但是没有学过02课程的学生信息(注意和上面👆题目的区别)
分析过程
使用的表和字段是相同的:
- 课程编号:
Score——>c_id
(课程编号) - 学生信息:
Student——>*
(学生信息)
SQL实现
首先看看哪些同学是满足要求的:只有06号同学是满足的
错误思路1
直接将上面一题的结果全部排出,导致那些没有学过01课程的学生也出现了:07,08
1 | select s1.* |
错误思路2
将上面题目中的02课程直接取反,导致同时修过01,02,03或者只修01,03的同学也会出现
1 | select s1.* |
正确思路
https://www.jianshu.com/p/9abffdd334fa
1 | -- 方法1:根据两种修课情况来判断 |
!!!!!方法2:先把06号学生找出来
1 | select * from Student where s_id in ( |
如何Score中找出06号学生
如何找出06号学生😃
1 | select s_id |