not exists、left join/is null、not in 行为

测试数据

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值