博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
not exists、left join/is null、not in 行为
阅读量:6003 次
发布时间:2019-06-20

本文共 1660 字,大约阅读时间需要 5 分钟。

测试数据

20:25:52[test](;)> select * from t; +------+------+ | id   | b    | +------+------+ |    1 | NULL | |    2 |    1 | |    3 |    4 | +------+------+ 3 rows in set (0.00 sec)

实现查询t表中id 的值不存在b中的id记录,有三种实现方式,分别为left join、not exists、not in

其中前两种对null值的处理机制相同

20:37:02[test](;)> select t.id,t.b from t left join t tmp on t.id=tmp.b where tmp.b is null; +------+------+| id   | b    |+------+------+|    2 |    1 ||    3 |    4 |+------+------+2 rows in set (0.00 sec)20:37:11[test](;)> select id,b from t tmp where not exists(select 1 from t where tmp.id=t.b);+------+------+| id   | b    |+------+------+|    2 |    1 ||    3 |    4 |+------+------+2 rows in set (0.01 sec)

但是对于not in 结果不尽相同

20:38:11[test](;)> select id,b from t where id not in (select b from t);              Empty set (0.01 sec)

子查询中的结果集中如果包含null则返回null,无值返回,可以过滤掉null值达到预期的效果

20:38:37[test](;)> select id,b from t where id not in (select b from t where t.b is not null); +------+------+ | id   | b    | +------+------+ |    2 |    1 | |    3 |    4 | +------+------+ 2 rows in set (0.00 sec)

关于in如果条件字段和子查询中查询的字段对应都是null值,则返回null,如

21:47:51[test](;)> select * from t;+------+------+| id   | b    |+------+------+|    1 | NULL ||    2 |    1 ||    3 |    4 || NULL | NULL |+------+------+4 rows in set (0.00 sec)21:47:52[test](;)> select id,b from t where id in (select b from t);+------+------+| id   | b    |+------+------+|    1 | NULL |+------+------+1 row in set (0.00 sec)

无法匹配出id为null的记录

对于执行的效率,left join比not exists稍快,not in效率最低,是最应该避免的

参考文献:https://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/

 

转载于:https://www.cnblogs.com/Bccd/p/7858083.html

你可能感兴趣的文章
编译器介绍--OpenWatCOM
查看>>
spring4配置文件详解
查看>>
Xcode中Info.plist文件各个键的作用说明
查看>>
grub2的mbr分析
查看>>
Python网络通信TCP服务端
查看>>
java对象的强引用,软引用,弱引用和虚引用
查看>>
管理布局-EasyUI-2
查看>>
FreeMarker学习(二):数值和类型
查看>>
mysql数据库Limit分页使用
查看>>
autoresizingMask
查看>>
jenkins构建历史丰富插件
查看>>
ES6 箭头操作符简单例子
查看>>
Magento安装时数据库不支持InnoDB存储引擎问题的解决
查看>>
【原创】抓包分析RabbitMQ的帧数据构成
查看>>
【原创】具有path autovivification和conversion功能的JSON库
查看>>
想编写出优秀技术文档,先学学这四招
查看>>
mongodb分页优化
查看>>
qml定时
查看>>
Spring-Boot结合Spring-Kafka接收Kafka消息
查看>>
Android GLSurface 除绘制物体外,其余为透明
查看>>