admin 管理员组

文章数量: 888337

练习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 
FROMsc 
WHERE cid IN (SELECT CId FROM course WHERE TId IN (SELECT TId FROM teacher WHERE Tname = '张三')) ;

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

SELECT * 
FROMstudent 
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` = '张三';

本文标签: 练习6多表关联查询嵌套子查询