查询学过编号为“01”的课程并且也学过编号为“02”的课程的学生的学号、姓名(重点)
解题思路
1、分析题目
这道题 最 最 最 关键的所在,(划重点)就是:把学过编号为“01”课程的同学查询出来,再把学过编号为“02”课程的同学查询出来,然后把两张表合并到一张表中。
2、通过课程表course
查询课程编号为 “01”,“02”的课程
#课程编号为01的数据
SELECT
*
FROM
course
WHERE
c_id = 01;
#课程编号为02的数据
SELECT
*
FROM
course
WHERE
c_id = 02
3、进一步分析
通过观察,发现course
表中的外键只有t_id
,通过t_id
可查询到teacher
表;但是无法获取到学生的信息。
我们只能通过观察其他表的信息,查看其他的表中是否有外键使用到course
表中的c_id
学生表:
Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别
课程表:
Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号
教师表:
Teacher(t_id,t_name) –教师编号,教师姓名
成绩表:
Score(s_id,c_id,s_s_score) –学生编号,课程编号,分数
这个是我们之前所创建的所有的表的信息
发现score
表中存在c_id
与s_id
,可以通过查询soure
表中的c_id=01
和c_id=02
来直接获取s_id
,将数据合并起来。
4、通过score
表来获取相对应的数据
#通过score表,确认学过课程编号为01的学生id
SELECT
s_id
FROM
score
WHERE
c_id = 01
#通过score表,确认学过课程编号为02的学生id
SELECT
s_id
FROM
score
WHERE
c_id = 02
5、将查询到,学过课程编号为“01”的同学id,查询结果作为一个表a 和 将查询到,学过课程编号为“02”的同学id,查询结果作为一个表b,通过内连接的方式合并。
#内连接的查询结构为
SELECT
*
FROM
tableA
INNER JOIN tableB ON tableA.id = tableB.id;
#实际这道题的代码
# 别名为a的这个表就是学过课程编号为“01”的查询结果
# 别名为b的这个表就是学过课程编号为“02”的查询结果
SELECT
*
FROM
( SELECT s_id FROM score WHERE c_id = '01' ) AS a
INNER JOIN ( SELECT s_id FROM score WHERE c_id = '02' ) AS b ON a.s_id = b.s_id;
6、已知s_id
通过student
表获取学生信息。因为最终是一组数据,所以要使用IN
关键字
SELECT
s_id,
s_name,
s_sex,
s_birth
FROM
student
WHERE
s_id IN (
SELECT
a.s_id
FROM
( SELECT s_id FROM score WHERE c_id = '01' ) AS a
INNER JOIN ( SELECT s_id FROM score WHERE c_id = '02' ) AS b ON a.s_id = b.s_id
);
版权声明:本文为weixin_45812336原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。