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

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

作者: TechTalker | 来源:发表于2019-07-10 10:31 被阅读0次

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

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/juhxkctx.html