[2]-SQL查询,id存在A表,不存在B表的三种写法

2019-07-10  本文已影响0人  TechTalker

在上篇练习题中,有一道题目是这样
查询不存在" 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;

第三种解法已经希望可以得到大家一起来讨论

上一篇下一篇

猜你喜欢

热点阅读