查询在一张表不在另外一张表的记录

假如要查询在a表中存在,但是在b表中不存在的记录,应该如何查询。为了便于说明,我们假设a表和b表都只有一个字段id,a表中的记录为{1,2,3,4,5},b表中的记录为{2,4},那么我们需要通过一个sql查询得到{1,3,5}这样的结果集。

一般解法(效率低)

看到这个题目,我们首先想到的可能就是not in这样的关键字,具体的查询语句如下:

select ta.* from ta where ta.id not in(select tb.id from tb)

上述查询语句的查询结果集确实是{1,3,5},用navicat执行上述语句,得到如下图所示结果:

效率分析

但是仔细分析我们可以发现,如果b表很长,那么执行上述的查询语句,需要用a表中的字段去匹配b表中的每一个字段,相当于是a表的每一个字段都要遍历一次b表,效率非常低下。(只要a中的字段不在b表中那么肯定要遍历完b表,如果a表中的字段在b表中,那么只要遍历到就退出,进行a表中下一个字段的匹配)

使用连接解决

连接查询使我们平时进行sql查询用到最多的操作之一了,相对于上述not in关键字,我们使用连接查询的效率更高。因为我们需要搜索的是a表中的内容,所以使用a表左连接b表,这样b表中会补null,查询语句如下:

select * from ta left join tb on ta.id=tb.id

上述查询语句的查询结果如下:

因为a、b两表中字段id相同,所以上述b表中的id字段变成了id1。仔细观察由可以发现,我们需要的结果集{1,3,5}所对应的id1字段都是null。这样我们在上述的查询语句中加入条件即可完成对只在a表中,但不在b表中的结果集的插叙,查询语句如下:

select * from ta left join tb on ta.id=tb.id where tb.id is null

查询结果如下图所示:

但是我们又发现上述查询结果有2列,也就是a表和b表的连接查询结果,但是我们只需要a表中的内容,所以对上述查询稍作修改:

select ta.* from ta left join tb on ta.id=tb.id where tb.id is null

查询结果如下图所示:

以上就是我们所要求的查询结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值