解决从集合运算到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为空的列,就可以得到预期的结果了

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

(0)

相关推荐

  • Mysql NULL导致的神坑

    比较运算符中使用NULL mysql> select 1>NULL; +--------+ | 1>NULL | +--------+ | NULL | +--------+ 1 row in set (0.00 sec) mysql> select 1<NULL; +--------+ | 1<NULL | +--------+ | NULL | +--------+ 1 row in set (0.00 sec) mysql> select 1<>

  • MySQL null与not null和null与空值''''的区别详解

    相信很多用了MySQL很久的人,对这两个字段属性的概念还不是很清楚,一般会有以下疑问: 我字段类型是not null,为什么我可以插入空值 为毛not null的效率比null高 判断字段不为空的时候,到底要 select * from table where column <> '' 还是要用 select * from table wherecolumn is not null 呢. 带着上面几个疑问,我们来深入研究一下null 和 not null 到底有什么不一样. 首先,我们要搞清楚

  • 详解mysql不等于null和等于null的写法

    1.表结构 2.表数据 3.查询teacher_name字段不能等于空并且也不能等于空字符 SELECT * FROM sys_teacher WHERE teacher_name IS NOT NULL AND teacher_name <>'' 查询结果: 4.查询teacher_name字段等于null或等于空字符 SELECT * FROM sys_teacher WHERE teacher_name = '' OR teacher_name IS NULL 查询结果: 到此这篇关于详

  • MySQL中可为空的字段设置为NULL还是NOT NULL

    经常用mysql的人可能会遇到下面几种情况: 1.我字段类型是not null,为什么我可以插入空值 2.为什么not null的效率比null高 3.判断字段不为空的时候,到底要用 select * from table where column <> '' 还是要用 select * from table where column is not null 带着上面几个疑问,我们来简单的研究一下null 和 not 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 wh

  • 解决mac使用homebrew安装MySQL无法登陆问题

    如果你电脑是Mac的,使用homebrew安装MySQL是一个非常便捷的方式,但是还是会出现一些问题: 首先保证你已经安装了mysql,如果是通过homebrew安装的,输入mysql.server start 启动服务 如果在输入 mysql -u root 出现这个错误ERROR 1045 (28000): Access denied for user 'zhongchengming'@'localhost' (using password: YES),应该是修改初始密码没有成功 解决步骤

  • numpy排序与集合运算用法示例

    这里有numpy数组的相关介绍http://www.jb51.net/article/130657.htm 排序 numpy与python列表内置的方法类似,也可通过sort方法进行排序. 用法如下: In [1]: import numpy as np In [2]: x = np.random.randn(9) In [3]: x Out[3]: array([-0.4041504 , -0.42198556, 0.92807217, -2.66609196, 1.50915897, 0.3

  • 解决大于5.7版本mysql的分组报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated

    原因: MySQL 5.7.5和up实现了对功能依赖的检测.如果启用了only_full_group_by SQL模式(在默认情况下是这样),那么MySQL就会拒绝选择列表.条件或顺序列表引用的查询,这些查询将引用组中未命名的非聚合列,而不是在功能上依赖于它们.(在5.7.5之前,MySQL没有检测到功能依赖项,only_full_group_by在默认情况下是不启用的.关于前5.7.5行为的描述,请参阅MySQL 5.6参考手册.) 执行以下个命令,可以查看 sql_mode 的内容: mys

  • 一文解决django 2.2与mysql兼容性问题

    Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,视图V和模版T.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件.并于2005年7月在BSD许可证下发布.这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的.2019年12月2日,Django 3. 0发布  . 背景 Django是一个优秀的Python web框架,在使用Django2.2版本配置MySQL数据库时

  • SQL Server中的集合运算: UNION, EXCEPT和INTERSECT示例代码详解

    SQL Server中的集合运算包括UNION(合并),EXCEPT(差集)和INTERSECT(相交)三种. 集合运算的基本使用 1.UNION(合并两个查询结果集,隐式DINSTINCT,删除重复行) --合并两个提取表/派生表(derived table), 返回结果为:[a,b,c,d,e] SELECT FC FROM (VALUES('a'),('b'),('c'),('e')) Table1 (FC) UNION SELECT FC FROM (VALUES('a'),('b'),

  • 快速解决List集合add元素,添加多个对象出现重复的问题

    首先我们在new 一个对象的时候,对象的id是唯一确定的:将对象add入list中时,放入list中的其实是对象的引用 :而每次循环只是简单的set 对象的属性,set新的属性值,而add进list中的对象还是同一个对象id,也就是同一个对象: 所以每次add之后,list发现对象引用和之前元素一样,就覆盖掉了之前add的对象.所以循环之后list中的对象是重复的对象. 想要避免这个问题只要每次add时保证对象引用都是不同的即可,即每循环一次重新new一个对象. 另外如果List集合在循环内ne

  • C# List集合中获取重复值及集合运算详解

    话不多说,直接上实例: 一.获取集合内重复值 public void GetDuplicateValue() { List<string> lisA = new List<string> { "A", "B", "C", "A" }; //方式一 借助字典 Dictionary<string, int> dic = new Dictionary<string, int>(); l

  • 解决mysql使用not in 包含null值的问题

    注意!!! select * from user where uid not in (a,b,c,null); 这个sql不回返回任何结果.要避免not in的list中出现null的情况. 另外: –如果null参与算术运算,则该算术表达式的值为null.(例如:+,-,*,/ 加减乘除) –如果null参与比较运算,则结果可视为false.(例如:>=,<=,<> 大于,小于,不等于) –如果null参与聚集运算,则聚集函数都置为null(使用isnull(字段,0)等方式可以

  • Mysql使用sum()函数返回null的问题详解

    目录 介绍 问题 验证 解决 区别 参考 总结 介绍 SUM()函数用于计算一组值或表达式的总和,SUM()函数的语法如下: SUM(DISTINCT expression) SUM()函数是如何工作的? 如果在没有返回匹配行SELECT语句中使用SUM函数,则SUM函数返回NULL,而不是0. DISTINCT运算符允许计算集合中的不同值. SUM函数忽略计算中的NULL值. 问题 在项目中使用 Mysql 中的 sum() 函数求和时,调试时发现报出下面的错误信息: sql: Scan er

随机推荐