关于使用Not Exists ,Not In 查找两表找出不同数据

今天在做一个数据查询时遇到一个问题,就是在两张表有关联字段,但是数据并非完全关联,现在需要查出不同的数据,开始还想着用!=去写入sql中,,,脑子秀逗了。后来使用not exists解决的问题,确实有些这种方法(我就姑且叫方法了或语法?)少用到,但是真的很容易解决问题,为了写这文章记录一下,我就新建表a,表b说明一下好了,小白阶段需要积累...

在表a和表b中有三条记录相同,,(我只是想说关联id相同,其他的无所谓)

在查询a与b关联的数据时

select a.*  from a, b,where a.aid=b.bid;

在需要查询a中在b没有关联的数据时,则使用到not exists了

select * from a where not exists (select * from b where a.aid=b.bid);

同样,在b中查未被a关联的反过来即可,这个就是将主查询中的数据在子查询中做一个条件判断,再在主查询中查出exists 或not exists 的数据。

其实查找关联数据还有使用exists的写法,就是把上面的not去掉即可(像不像高数里的集合??)

 

发现很多东西容易忘记,好记性不如烂笔头。。做个小记录

 

 

 

好吧,,突然想起来in好像有同样的功能

试了一下

 select * from a where a.aid not in (select bid from b where a.aid=b.bid);

结果:

。。。。。有点傻兮兮了,那么就来看两种方式有什么不同呢?

查看的网上一些大牛的博客资料:

https://www.cnblogs.com/liyasong/p/sql_in_exists.html

https://www.cnblogs.com/clarke157/p/7912871.html

其中都总结的很清楚,具体内容请点击上述连接观看。我借取其中一部分(听过一种小表驱动大表的思想):

区别及应用场景             

in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

    in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。

not in 和not exists

    如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值