解决从集合运算到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的记录的!
经过了解,发现
又发现了一个细节知识~
补充注意mysql的not in查询值中存在null值时返回的查询结果会一直为空
现在有数据库表是
当我们使用这样的查询语句时
select from user where username not in ( select username from user where id != 2 )
这时子查询的结果包含了null值,所以结果会一直返回空查询,而不会返回预期的id为2这一行
我们可以稍微修改一下查询形式
select from user where username not in ( select username from user where id != 2 and username is not null )
这时排除了username为空的列,就可以得到预期的结果了
以上为个人经验,希望能给大家一个参考,也希望大家多多支持狼蚁SEO。如有错误或未考虑完全的地方,望不吝赐教。
编程语言
- 甘肃哪有关键词排名优化购买方式有哪些
- 甘肃SEO如何做网站优化
- 河南seo关键词优化怎么做电话营销
- 北京SEO优化如何做QQ群营销
- 来宾百度关键词排名:提升您网站曝光率的关键
- 卢龙关键词优化:提升您网站排名的策略与技巧
- 山东网站优化的注意事项有哪些
- 四川整站优化怎样提升在搜索引擎中的排名
- 疏附整站优化:提升网站性能与用户体验的全新
- 海南seo主要做什么工作售后服务要做到哪些
- 荣昌百度网站优化:提升您网站的搜索引擎排名
- 河北seo网站排名关键词优化如何做SEO
- 江西优化关键词排名推广售后保障一般有哪些
- 古浪SEO优化:提升你的网站可见性
- 西藏网站排名优化怎么把网站排名在百度首页
- 如何提升阳东百度快照排名:详尽指南