一. 查询 “01” 课程比 “02” 课程成绩高的学生的信息及课程分数
解题思路:要查询的是两个课程的成绩,而且还要显示学生的信息。所以需要用到两张表,SC,Student 这两张表。
问题拆分:
- 怎么查找两个课程的成绩呢?
- 如何把课程表和学员信息表连接起来呢?
那么用到哪些知识呢?
- 子查询
- join
语句实现:先找到两门课的成绩
-- 课程1的成绩 SELECT sid, score AS class1 FROM sc WHERE sc.cid = '01'; -- 课程2的成绩 SELECT sid, score AS class2 FROM sc WHERE sc.cid = '02';
两个子查询结束了以后,下一步就是使用 join 把这两个查询的结果连接起来:
SELECT * FROM Student RIGHT JOIN ( SELECT t1.sid, class1, class2 FROM ( SELECT sid, score AS class1 FROM sc WHERE sc.cid = '01' ) t1, ( SELECT sid, score AS class2 FROM sc WHERE sc.cid = '02' ) t2 WHERE t1.sid = t2.sid AND t1.class1 > t2.class2 ) r ON Student.sid = r.sid;
二. 查询存在 “01” 课程但可能不存在 “02” 课程的情况(不存在时显示为 null)
思路:首先要查询所有的学生的选课情况,然后找到选择课程 01 和选择课程 02 的学生
解决方法:使用 join
选择两个分别选择课程 01 和课程 02 的学员表,然后把这两个表 join 起来
SELECT * FROM ( SELECT * FROM sc WHERE sc.cid = '01' ) t1 LEFT JOIN ( SELECT * FROM sc WHERE sc.cid = '02' ) t2 ON t1.sid = t2.sid;
三. 查询同时存在 01 和 02 课程的情况
思路:要求同时选择了 01 和 02 课程的情况,则需要使用 where 链接起来,这一题和上一题相比就是多了一个去除选了 01 但是没有选择 02 课程的这一部分
知识点:子查询,where语句
SELECT * FROM ( SELECT * FROM sc WHERE sc.cid = '01' ) t1, ( SELECT * FROM sc WHERE sc.cid = '02' ) t2 WHERE t1.sid = t2.sid;