当前位置:数据库 > > 正文

mysql有数据但筛选值为空(解决从集合运算到mysql的not like找不出NULL的问题)

时间:2022-01-16 00:43:54类别:数据库

mysql有数据但筛选值为空

解决从集合运算到mysql的not like找不出NULL的问题

记一次有趣的发现:

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

  • ?
  • 1
  • 2
  • 3
  • 4
  • #查询语句1
  • #找出表中id中含有‘A'或‘B'或‘C'的字段
  • select * from table1 where id like '%A%' or id like '%B%' or id like '%C%' ;
  • #成功查出300条
  • 嗯查询正常,有300条记录呢。

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

  • ?
  • 1
  • 2
  • 3
  • 4
  • #查询语句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条呢?

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

    于是换一条查询语句:

  • ?
  • 1
  • 2
  • 3
  • 4
  • #查询语句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的记录的!

    经过了解,发现:

    mysql有数据但筛选值为空(解决从集合运算到mysql的not like找不出NULL的问题)

    又发现了一个细节知识~

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

    现在有数据库表是

    mysql有数据但筛选值为空(解决从集合运算到mysql的not like找不出NULL的问题)

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

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • select * from user
  • where username not in
  • (
  • select username
  • from user
  • where id != 2
  • )
  • 这时子查询的结果包含了null值,所以结果会一直返回空查询,而不会返回预期的id为2这一行

    mysql有数据但筛选值为空(解决从集合运算到mysql的not like找不出NULL的问题)

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

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • select * from user
  • where username not in
  • (
  • select username
  • from user
  • where id != 2 and username is not null
  • )
  • 这时排除了username为空的列,就可以得到预期的结果了

    mysql有数据但筛选值为空(解决从集合运算到mysql的not like找不出NULL的问题)

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

    原文链接:https://blog.csdn.net/IKnowNothinglee/article/details/99972632

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐