查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数
分析: 题目中可以看出涉及到课程成绩,学生信息,因此只需要从Student学生表和SC成绩表入手.这道题的难点在于,学生的成绩表上包含了01,02,03等课程的成绩,在同一张表上面怎么比较?当然是把它们拆出来,我们可以把SC表中学生的01课程信息全部拿出来,放在一个新表t1,t1中有字段SId和新字段class1,这里的class1是学生01课程的成绩;然后跟上一步一样提取SC中的02课程信息组成新表t2,t2中字段是SId和class2.之后select两张新表01课程成绩大于02课程成绩的人,最后接在Student表右边.
Student表
+------+--------+---------------------+------+ | SId | Sname | Sage | Ssex | +------+--------+---------------------+------+ | 01 | 赵雷 | 1990-01-01 00:00:00 | 男 | | 02 | 钱电 | 1990-12-21 00:00:00 | 男 | | 03 | 孙风 | 1990-12-20 00:00:00 | 男 | | 04 | 李云 | 1990-12-06 00:00:00 | 男 | | 05 | 周梅 | 1991-12-01 00:00:00 | 女 | | 06 | 吴兰 | 1992-01-01 00:00:00 | 女 | | 07 | 郑竹 | 1989-01-01 00:00:00 | 女 | | 09 | 张三 | 2017-12-20 00:00:00 | 女 | | 10 | 李四 | 2017-12-25 00:00:00 | 女 | | 11 | 李四 | 2012-06-06 00:00:00 | 女 | | 12 | 赵六 | 2013-06-13 00:00:00 | 女 | | 13 | 孙七 | 2014-06-01 00:00:00 | 女 | +------+--------+---------------------+------+
sc表
+------+------+-------+ | SId | CId | score | +------+------+-------+ | 01 | 01 | 80.0 | | 01 | 02 | 90.0 | | 01 | 03 | 99.0 | | 02 | 01 | 70.0 | | 02 | 02 | 60.0 | | 02 | 03 | 80.0 | | 03 | 01 | 80.0 | | 03 | 02 | 80.0 | | 03 | 03 | 80.0 | | 04 | 01 | 50.0 | | 04 | 02 | 30.0 | | 04 | 03 | 20.0 | | 05 | 01 | 76.0 | | 05 | 02 | 87.0 | | 06 | 01 | 31.0 | | 06 | 03 | 34.0 | | 07 | 02 | 89.0 | | 07 | 03 | 98.0 | +------+------+-------+
构建新表t1
select SId,score as class1 from sc where sc.CId='01';
t1的查询结果:
+------+--------+ | SId | class1 | +------+--------+ | 01 | 80.0 | | 02 | 70.0 | | 03 | 80.0 | | 04 | 50.0 | | 05 | 76.0 | | 06 | 31.0 | +------+--------+
构建新表t2
select SId,score as class2 from sc where sc.CId='02';
t2查询结果:
+------+--------+ | SId | class2 | +------+--------+ | 01 | 90.0 | | 02 | 60.0 | | 03 | 80.0 | | 04 | 30.0 | | 05 | 87.0 | | 07 | 89.0 | +------+--------+
筛选01课程成绩大于02课程成绩的学生
select t1.SId, class1, class2 from (select SId, score as class1 from sc where sc.CId = '01')as t1, (select SId, score as class2 from sc where sc.CId = '02')as t2 where t1.SId = t2.SId AND t1.class1 > t2.class2;
查询结果:
+------+--------+--------+ | SId | class1 | class2 | +------+--------+--------+ | 02 | 70.0 | 60.0 | | 04 | 50.0 | 30.0 | +------+--------+--------+
那接下来就简单了,直接查询Student表02,04学生的学生信息,然后把class1和class2接在后边就行,我们可以把上一步查询的结果命名为r表
select * from Student RIGHT JOIN ( select t1.SId, class1, class2 from (select SId, score as class1 from sc where sc.CId = '01')as t1, (select SId, score as class2 from sc where sc.CId = '02')as t2 where t1.SId = t2.SId AND t1.class1 > t2.class2 )r on Student.SId = r.SId;
最终结果:
+------+--------+---------------------+------+------+--------+--------+ | SId | Sname | Sage | Ssex | SId | class1 | class2 | +------+--------+---------------------+------+------+--------+--------+ | 02 | 钱电 | 1990-12-21 00:00:00 | 男 | 02 | 70.0 | 60.0 | | 04 | 李云 | 1990-12-06 00:00:00 | 男 | 04 | 50.0 | 30.0 | +------+--------+---------------------+------+------+--------+--------+
以上