SQL五十道经典题型——(七)查询学过编号为“01”的课程并且也学过编号为“02”的课程的学生的学号、姓名(重点)

查询学过编号为“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_ids_id,可以通过查询soure表中的c_id=01c_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版权协议,转载请附上原文出处链接和本声明。