SQL 训练题目
一. 查询 "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;


浙公网安备 33010602011771号