点击关注公众号,干货第一时间送达

hello,小伙伴们,
小编我,最近工作上的事,
实在是忙的焦头烂额
这不,一得空,就给诸位带来新的题目。
见谅见谅
很经典的一道SQL查询题目。
一,需求场景
请查询表格中,没有学过"张三"老师的课程的所有学习ID、姓名。
所有学生信息表格如下:

【温馨提示:建表语句及数据导入脚本,请翻看前面的文章:SQL 脚本案例【2】课程1比课程2成绩高的所有学生编号】
二,解决方案
【演示工具:Mysql8 + Navicat for Mysql】
题目的重点其实在两处,
"张三" 老师的课程、 没有学过这些课程的学生。
在SQL查询中,基本的原则就是:小 -> 大
所以,先筛选出符合条件的课程。
(1)先筛选"张三" 老师的课程
select c_id, c_name
from course
where t_id in (
select t_id
from teacher
where t_name = '张三'
)
结果集:

所以,"张三" 老师只有 "数学" 这门课程。
(2)再筛选学过 c_id = ‘2’ 课程的学生(从 score 成绩表筛选)
select s_id
from score
where c_id in (
select c_id
from course
where t_id in (
select t_id
from teacher
where t_name = '张三'
)
)
结果集:

以上就是学过 "张三" 老师的 "数学" 课程的所有学生ID,
用排除法,就可以从 student 学生表中,
筛选出那些没有学过这门课程的学生了。
(3)最后筛选没有学过 c_id = ‘2’ 课程的学生(从 student 表筛选)
select s_id, s_name
from student
where s_id not in (
select s_id
from score
where c_id in (
select c_id
from course
where t_id in (
select t_id
from teacher
where t_name = '张三'
)
)
)
结果集:

上面代码中用到 not in,表示的就是排除。
当然,如果诸位觉得上面的多层嵌套有点麻烦,
也可以用下面的 join 关联代码:
select s_id, s_name
from student
where s_id not in (
select s_id
from score t1
join course t2
on t1.c_id = t2.c_id
join teacher t3
on t2.t_id = t3.t_id
where t3.t_name = '张三'
)
结果是一样的。

文章转载自皮皮克克,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




