1.1 查询同时存在" 01 "课程和" 02 "课程的情况
分析:刚开始看到这道题是懵逼的,因为 !!!看不懂!!! 之后看了一下sc表,发现并不是每个同学都有01和02课程的成绩(可能是缺考了),那么这道题的意思应该是在sc表中筛选出同时又01和02成绩的学生.既然理清题干了,那接下来就容易了,我可以提取sc中有01成绩的项,成立新表t1,同样提取sc中有02成绩的项,成立新表t1,然后筛选t1和t2中具有相同SId的项
提取带01成绩的项
select * from sc where sc.CId = '01';
表t1:
+------+------+-------+ | SId | CId | score | +------+------+-------+ | 01 | 01 | 80.0 | | 02 | 01 | 70.0 | | 03 | 01 | 80.0 | | 04 | 01 | 50.0 | | 05 | 01 | 76.0 | | 06 | 01 | 31.0 | +------+------+-------+
提取带02成绩的项
select * from sc where sc.CId = '02';
表t2:
+------+------+-------+ | SId | CId | score | +------+------+-------+ | 01 | 02 | 90.0 | | 02 | 02 | 60.0 | | 03 | 02 | 80.0 | | 04 | 02 | 30.0 | | 05 | 02 | 87.0 | | 07 | 02 | 89.0 | +------+------+-------+
筛选t1和t2中相同SId的项
select * from (select * from sc where sc.CId = '01') as t1, (select * from sc where sc.CId = '02') as t2 where t1.SId = t2.SId;
最终查询结果:
+------+------+-------+------+------+-------+ | SId | CId | score | SId | CId | score | +------+------+-------+------+------+-------+ | 01 | 01 | 80.0 | 01 | 02 | 90.0 | | 02 | 01 | 70.0 | 02 | 02 | 60.0 | | 03 | 01 | 80.0 | 03 | 02 | 80.0 | | 04 | 01 | 50.0 | 04 | 02 | 30.0 | | 05 | 01 | 76.0 | 05 | 02 | 87.0 | +------+------+-------+------+------+-------+
1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
分析:这道题主要考察的是join的应用,因为02可能不存在,这里用right join,把t1接在t2的右侧
select * from (select * from sc where sc.CId = '02') as t2 right join (select * from sc where sc.CId = '01') as t1 on t1.SId = t2.SId;
结果:
+------+------+-------+------+------+-------+ | SId | CId | score | SId | CId | score | +------+------+-------+------+------+-------+ | 01 | 02 | 90.0 | 01 | 01 | 80.0 | | 02 | 02 | 60.0 | 02 | 01 | 70.0 | | 03 | 02 | 80.0 | 03 | 01 | 80.0 | | 04 | 02 | 30.0 | 04 | 01 | 50.0 | | 05 | 02 | 87.0 | 05 | 01 | 76.0 | | NULL | NULL | NULL | 06 | 01 | 31.0 | +------+------+-------+------+------+-------+
1.3 查询不存在" 01 "课程但存在" 02 "课程的情况
分析:这里我们可以先查询sc中有01成绩的SId,然后去掉这部分,剩下的就是有03,02成绩的SId,再从里面选出02成绩的项就行
select * from sc where sc.SId not in ( select SId from sc where sc.CId = '01' ) AND sc.CId= '02';
查询结果:
+------+------+-------+ | SId | CId | score | +------+------+-------+ | 07 | 02 | 89.0 | +------+------+-------+
以上