9. 查询和“01”号同学学习的课程完全相同的其他同学的信息
关键词: “学生信息、课程、完全相同”
直接查不太好查,所以逆向思维,这里的“完全相同”有2
层含义:
- 没有学习
“01”
号同学学习课程以外的其他课程 - 与
“01”
同学学习课程数量完全相等
第一步: 锁定表,学生表、成绩表
第二步: 找出学了“01”
号同学学习课程以外其他课程的同学
SELECT Sid FROM sc WHERE Cid NOT IN (SELECT DISTINCT Cid FROM sc WHERE Sid = 01);
结果为空,因为01
号同学学了所有课程,所以学了其以外课程的同学是空
第三步: 从所有学生中排除第二步找到的同学以及“01”
号同学自身
SELECT Sid FROM Sc
WHERE Sid NOT IN
(SELECT Sid FROM sc WHERE Cid NOT IN (SELECT DISTINCT Cid FROM sc WHERE Sid = 01))
AND Sid <> 01;
第四步: 筛选出与“01”
号同学所学课程数量相等的同学
SELECT Sid FROM Sc
WHERE Sid NOT IN
(SELECT Sid FROM sc WHERE Cid NOT IN (SELECT DISTINCT Cid FROM sc WHERE Sid = 01))
AND Sid <> 01
GROUP BY Sid
HAVING COUNT(Cid) = (SELECT COUNT(DISTINCT Cid) FROM sc WHERE Sid = 01);
第五步: 关联学生表,获取学生信息
SELECT * FROM student WHERE Sid IN
(SELECT Sid FROM Sc
WHERE Sid NOT IN
(SELECT Sid FROM sc WHERE Cid NOT IN (SELECT DISTINCT Cid FROM sc WHERE Sid = 01))
AND Sid <> 01
GROUP BY Sid
HAVING COUNT(Cid) = (SELECT COUNT(DISTINCT Cid) FROM sc WHERE Sid = 01));