暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL脚本案例【4】查询没有学过"张三"老师的课程的学生ID、姓名

皮皮克克 2024-03-23
58

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


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 = '张三'
)

结果是一样的。



结束语:
Ok,就是本篇文章的全部内容了。
如果各位有不懂的地方,欢迎发消息给小编,小编会进行详细地解答。
最后,请屏幕前的各位吴彦祖和刘亦菲们,动动你们的小手,给小编一个

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

评论