练习6:多表关联查询、嵌套子查询

6. 查询学过「张三」老师授课的同学的信息

关键词分析: 学过、张三老师、同学信息

第一步: 锁定表,我们发现需要查询所有的四张表,各表使用的地方分别在后续步骤中一一说明。
在这里插入图片描述
第二步:teacher表查出张三老师对应的TId,即第一步图中的1

SELECT TId FROM teacher WHERE Tname = '张三';

在这里插入图片描述

第三步: 根据TId我们便可以从course表中查出张三老师教过哪些课的课程CId,即第一步中的图2注意这里用的in而不是=,因为名字叫张三的老师可能有多个

SELECT CId FROM course WHERE TId IN (SELECT TId FROM teacher WHERE Tname = '张三');

在这里插入图片描述

第四步: 我们认为上过课就会在sc表中记录成绩,即不缺考,所以可以根据CIdsc表中查出哪些学生获得了该课的学分,从而得到学生SId,即第一步中的图3

SELECT 
  SId 
FROM
  sc 
WHERE cid IN (SELECT CId FROM course WHERE TId IN (SELECT TId FROM teacher WHERE Tname = '张三')) ;

在这里插入图片描述

第五步: 有了SId,便可以从student表中查询对应的学生信息了,即第一步中的图4

SELECT 
  * 
FROM
  student 
WHERE sid IN 
(SELECT  SId FROM sc 
  WHERE cid IN 
    (SELECT CId FROM course 
    WHERE TId IN  (SELECT TId  FROM teacher 
      WHERE Tname = '张三'))) ;

在这里插入图片描述
看上去很复杂,语句很长,其实就是多套了几个子查询而已,一步一步分析清楚,然后嵌套起来就可以写出来了。

当然,直接用关联查询也是可以的,将四张表的相关信息都放在同一行记录中,然后选出我们想要的字段即可,如下

SELECT st.* FROM student st
JOIN sc ON st.`SId` = sc.`SId`
JOIN course c ON sc.`CId` = c.`CId`
JOIN teacher t ON c.`TId` = t.`TId` AND t.`Tname` = '张三';
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值