在上篇练习题中,有一道题目是这样
查询不存在" 01 "课程但存在" 02 "课程的情况
这里来总结下有多重解法的思路。
数据表还是用上篇的四张表来,先建好几张表。
--1.学生表 Student(SId,Sname,Sage,Ssex)
--SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别
--2.课程表 Course(CId,Cname,TId) --CId --课程编号,Cname 课程名称,TId 教师编号
--3.教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名
--4.成绩表 SC(SId,CId,score) --SId 学生编号,CId 课程编号,score 分数
方法一、使用not in
"查询不存在" 01 "课程但存在" 02 "课程的情况"
select * from sc
where sc.sid not in (select sid from sc where cid='01') and sc.cid ='02';
这种方法比较容易理解,但是效率慢,在查询时会进行全表扫描。
方法二、使用left join 或者 right join
可以用下面一张表来解释:
图例.png
select * from
(select sid,cid,score from sc where cid ='01') t1 right join (select sid,cid,score from sc where cid='02') t2
on t1.sid=t2.sid where t1.cid is null;
第二种方法也比较容易理解,平时使用较多。
方法三、逻辑比较复杂,但是效率最快
select * from
(select sid,cid,score from sc where cid='02') t2
where (select count(1) as num from (select sid,cid,score from sc where cid ='01') t1 where t1.sid=t2.sid)=0;
第三种解法已经希望可以得到大家一起来讨论
网友评论