SQL 训练题目

一. 查询 "01" 课程比 "02" 课程成绩高的学生的信息及课程分数

解题思路:要查询的是两个课程的成绩,而且还要显示学生的信息。所以需要用到两张表,SC,Student 这两张表。
问题拆分:

  1. 怎么查找两个课程的成绩呢?
  2. 如何把课程表和学员信息表连接起来呢?

那么用到哪些知识呢?

  1. 子查询
  2. 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';

img

两个子查询结束了以后,下一步就是使用 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;

img

二. 查询存在 "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;

img

三. 查询同时存在 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;

img

posted @ 2023-07-15 03:08  BNTang  阅读(39)  评论(0)    收藏  举报