MySQL数据库练习1.1-1.3

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 |
+------+------+-------+

以上

猜你喜欢

转载自www.cnblogs.com/lattesea/p/12159365.html