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表中记录成绩,即不缺考,所以可以根据CId从sc表中查出哪些学生获得了该课的学分,从而得到学生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` = '张三';
本文详细解析了如何通过嵌套查询从teacher、course、sc和student四张表中找出学过张三老师课程的学生信息,展示了多表关联查询和逐步细化的过程。
654

被折叠的 条评论
为什么被折叠?



