mysql有数据但筛选值为空(解决从集合运算到mysql的not like找不出NULL的问题)
mysql有数据但筛选值为空
解决从集合运算到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为空的列,就可以得到预期的结果了
以上为个人经验,希望能给大家一个参考,也希望大家多多支持开心学习网。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/IKnowNothinglee/article/details/99972632
- mysql与oracle如何直接连接(Oracle更换为MySQL遇到的问题及解决)
- mysql快速添加百万条记录(Mysql快速插入千万条数据的实战教程)
- mysql随机获取数据
- mysqlbinlog怎么分析(MySQL中使用binlog时格式该如何选择)
- mysql用户登录命令(mysql的登陆和退出命令格式)
- docker中mysql连接命令(docker 如何修改mysql的root密码)
- mysqlnull所占空间(详解mysql三值逻辑与NULL)
- mysql8.0.25安装及配置超详细教程(MySQL8.0.21安装步骤及出现问题解决方案)
- mysql删除数据库的命令(MySQL 线上数据库清理数据的方法)
- mysql多表连接优化(浅谈Mysql多表连接查询的执行细节)
- mysql 日期和时间处理函数(MySQL日期与时间函数的使用汇总)
- mysql的存储方法(MySQL中的binary类型使用操作)
- mysql mvcc 隔离级别(详解MySQL事务的隔离级别与MVCC)
- mysql8.0安装教程win10(Windows10下mysql 8.0.22 安装配置方法图文教程)
- mysql索引原理及调优(MySQL索引机制程序员必知)
- mysql详细笔记(MySQL的内存表的基础学习教程)
- 得这个 难治病 的人太多了,300个人赶到杭州商量怎么办(得这个难治病的人太多了)
- 经度,世界时间腕表的灵魂(世界时间腕表的灵魂)
- 阿里最新财报公布 三季度营收增长3 ,将增加150亿美元回购额度 在美股价小涨(阿里最新财报公布)
- 赵薇时胖时瘦 最近变美少女 原因在这里 躺着就变瘦(赵薇时胖时瘦最近变美)
- 学会这26种姿势,你就可以和兵哥哥切磋了(你就可以和兵哥哥切磋了)
- 吴彦祖陈冠希 恩怨 ,失去曾让他流泪的女友,终遇走过18年真爱(吴彦祖陈冠希恩怨)
热门推荐
- dockermysql实例(docker 连接宿主Mysql操作)
- 如何获取gridview隐藏列的值
- formdata上传图片参数(data:image data url 文件转为Blob上传后端的方法)
- docker容器默认内存大小(Docker 修改docker存储位置 修改容器镜像大小限制操作)
- ASP.NET获取网页中的图片
- 在mysql中如何授权(MySQL 角色role功能介绍)
- kubernetes 虚拟机安装(VirtualBox+Ubuntu16搭建Kubernetes集群的实现)
- html转ppt(HTML里显示pdf、word、xls、ppt的方法示例)
- 哪些行为会让面试失败
- laravel后台管理(关于laravel后台模板laravel-admin select框的使用详解)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9