mysql 事务处理null_解决从集合运算到mysql的not like找不出NULL的问题

记一次有趣的发现:

有一个表,总记录数是1000条,现在有一条查询语句:

#查询语句1

#找出表中id中含有‘A'或‘B'或‘C'的字段

select * from table1 where id like '%A%' or id like '%B%' or id like '%C%' ;

#成功查出300条

嗯查询正常,有300条记录呢。

然后我随便再敲一次查询语句…:

#查询语句2

#找出表中id中不含有‘A'且不含有‘B'且不含有‘C'的字段

select * from table1 where id not like '%A%' and id not like '%B%' and id not like '%C%' ;

#成功查出400条

嗯查出了400条呢…什么?!只有400条??不是应该700条吗!!!

我如雷轰顶——哪里不对了??

按道理,“找出表中id中含有‘A'或‘B'或‘C'的字段” 应该等价于 “找出表中id中不含有‘A'且不含有‘B'且不含有‘C'的字段” 的啊!这是由集合运算决定的啊!

“找出表中id中含有‘A'或‘B'或‘C'的字段”>>看作>> A∪B∪C

“找出表中id中不含有‘A'且不含有‘B'且不含有‘C'的字段”>>看作>> ∁UA∩∁UB∩∁UC

然而我们根据运算规则可知:∁U(A∪B∪C) = ∁UA ∩ ∁UB ∩ ∁UC

那就也是说,两条查询语句查出来的结果,不应该是互补的吗??理论上行数相加应该等于1000的呀,那现在怎么缺了300条呢?

奇了怪了。到底哪里错了呢??

于是换一条查询语句:

#查询语句3

#找出表中id中不含有‘A'或‘B'或‘C'的字段

select * from table1 where id not in (select * from table1 where id like '%A%' or id like '%B%' or id like '%C%' );

#成功查出700条

咦??怎么这样查,才是查询语句1的互补集呢?

我将查询语句2和查询语句3得到的结果一比较,发现:原来缺少的300条记录,是id 为NULL的情况!

也就是说,not like ‘%A%' 是不能查出NULL的记录的!

经过了解,发现:

986c82eba4f651472343fb7911dd30b0.png

又发现了一个细节知识~

补充:注意mysql的not in查询值中存在null值时返回的查询结果会一直为空

现在有数据库表是

22a6dd0f82174285ecb22fdabc2ea306.png

当我们使用这样的查询语句时:

select * from user

where username not in

(

select username

from user

where id != 2

)

这时子查询的结果包含了null值,所以结果会一直返回空查询,而不会返回预期的id为2这一行

1d8f8e488f59af113b693d9bc564b1de.png

我们可以稍微修改一下查询形式:

select * from user

where username not in

(

select username

from user

where id != 2 and username is not null

)

这时排除了username为空的列,就可以得到预期的结果了

fa6a833da806b29856b11b617e78ce1d.png

以上为个人经验,希望能给大家一个参考,也希望大家多多支持免费资源网。如有错误或未考虑完全的地方,望不吝赐教。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值