mysql 线上not in查询中的一个坑
今天早上开发又过来说,怎么有个语句一直没有查询出结果,数据是有的呀,并发来了如下的sql(为了方法说明,表名及查询均做了修改):
select * from t2 where t2.course not in (select name from t1);
两个表的数据如下:
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | NULL |
| 2 | chen |
| 3 | li |
+----+------+
3 rows in set (0.00 sec) mysql> select * from t2;
+------+--------+
| id | course |
+------+--------+
| 1 | NULL |
| 2 | chen |
| 3 | math |
+------+--------+
3 rows in set (0.00 sec)
所以按照要求来说,理论上应该显示如下的数据才对:
+------+--------+
| id | course |
+------+--------+
| 3 | math |
+------+--------+
1 row in set (0.00 sec) 但实际的返回结果却时empty mysql> select * from t2 where t2.course not in (select name from t1);
Empty set (0.00 sec)
这个可怪有意思了,不过一看到这种表中有null字段的都会先吐槽一下,一般来说字段都可以设置成非null的,而且效率也低,也要占用空间(mysql要记录该条目是否为null)
既然已经这样了,就分析分析:
mysql> select * from t2 join t1 on t1.name=t2.course;
+------+--------+----+------+
| id | course | id | name |
+------+--------+----+------+
| 2 | chen | 2 | chen |
+------+--------+----+------+
1 row in set (0.00 sec)
注意:结果中并没有出现course与name都为null的字段,即在mysql中null与null不相等。
mysql> select * from t2 where t2.course not in (null);
Empty set (0.00 sec) mysql> select * from t2 where t2.course not in (null,'chen');
Empty set (0.00 sec)
注意:not in中包含有null时,结果集一直为Empty set
再看看下面的语句:
mysql> select * from t2 where t2.course not in ('chen');
+------+--------+
| id | course |
+------+--------+
| 3 | math |
+------+--------+
1 row in set (0.00 sec) mysql> select 1 > null;
+----------+
| 1 > null |
+----------+
| NULL |
+----------+
1 row in set (0.00 sec)
注意,id=1,course=null的字段并没有被查询出来,null值与任何非null值比较都为null(非0非1)
如果非要查询出包含null的字段,可以这样:
mysql> select * from t2 where course is null or course not in ('chen');
+------+--------+
| id | course |
+------+--------+
| 1 | NULL |
| 3 | math |
+------+--------+
2 rows in set (0.00 sec)
那么正确的姿势应该是怎么写呢?
用left join的方法,如下:
mysql> select t2.* from t2 left join t1 on t2.course=t1.name where t1.name is null ;
+------+--------+
| id | course |
+------+--------+
| 1 | NULL |
| 3 | math |
+------+--------+
2 rows in set (0.00 sec)
当然如果t2表不包含null时,可以用字查询接条件not null的方法:
mysql> select * from t2 where t2.course not in (select name from t1 where name is not null);
+------+--------+
| id | course |
+------+--------+
| 3 | math |
+------+--------+
1 row in set (0.00 sec)
有允许null的字段查询时要多留个心眼,最好设计之初就不要出现允许null字段的存在。
mysql 线上not in查询中的一个坑的更多相关文章
- mysql线上一些隐患查询sql
开发写了几个语句,觉得查询结果跟逻辑有点不相符,就拿到这里一起分析了下. 语句如下: select tp.title, tp.amount, ifnull( ) as aInvestAmount, i ...
- 本地数据库导入线上服务器的mongodb中
更改默认端口 sudo vi /etc/mongod.conf 进入conf文件,修改port值为19999保存并退出. 重启mongodb sudo service mongod restart 进 ...
- MySQL数据库之单表查询中关键字的执行顺序
目录 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 2 执行顺序 3 关键字使用语法 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from ...
- MySql数据库GROUP BY使用过程中的那些坑
MySql数据库GROUP BY使用过程中的那些坑 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. 特别注意: group by 有一个原则,就是 select 后面的所有 ...
- 记前端状态管理库Akita中的一个坑
记状态管理库Akita中的一个坑 Akita是什么 Akita是一种基于RxJS的状态管理模式,它采用Flux中的多个数据存储和Redux中的不可变更新的思想,以及流数据的概念,来创建可观察的数据存储 ...
- andriod8.1.0源码编译中的一个坑-package com.sun.javadoc does not exist
这里记录编译过程中的一个坑!!! 编译过程中出现了下面的报错 external/doclava/src/com/google/doclava/ClassInfo.java:20: error: pac ...
- 【MySQL 线上 BUG 分析】之 多表同字段异常:Column ‘xxx’ in field list is ambiguous
一.生产出错! 今天早上11点左右,我在工作休息之余,撸了一下猫.突然,工作群响了,老大在里面说:APP出错了! 妈啊,这太吓人了,因为只是说了出错,但是没说错误的信息.所以我赶紧到APP上看看. 这 ...
- Docker + node(koa) + nginx + mysql 线上环境部署
在上一篇 Docker + node(koa) + nginx + mysql 开发环境搭建,我们进行了本地开发环境搭建 现在我们就来开始线上环境部署 如果本地环境搭建没有什么问题,那么线上部署的配置 ...
- ××校招:前端线上笔试题--页面中的一个元素(10px*10px)围绕坐标(200, 300) 做圆周运动
题目: 请让页面中的一个元素(10px*10px)围绕坐标(200, 300) 做圆周运动: 原理: 1.页面上画一个圆,画一个圆心.在这个圆的圆周上面画一个点,我们就让这个点绕着圆周跑: 2.怎 ...
随机推荐
- java知识大全积累篇
原文出自:http://www.importnew.com/14429.html 构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使 ...
- Navi.Soft30.框架.Mobile.开发手册
1概述 1.1应用场景 互联网的发展,使用基于Web的软件异军突起,目前占据着相当大的市场份额,而手机,平板电脑等移动端设备的频繁使用,使移动端的软件快速发展,逐步有超越Web软件的趋势 移动软件中, ...
- console 让 js 调试更简单
浏览器的控制台(console)是最重要的面板,主要作用是显示网页加载过程中产生各类信息. 显示信息 console.log('hello world'); console.debug('debug' ...
- Myeclipse设置JAVA选中高亮显示
1.打开显示功能 选择Windows->Preferences->Java-> Editor-> Mark Occurrences ,勾选选项.这时,当你单击一个元素的时候,代 ...
- [转]LINQ To SQL 语法及实例大全
转载自:http://blog.csdn.net/pan_junbiao/article/details/7015633 LINQ to SQL语句(1)之Where Where操作 适用场景:实现过 ...
- Codeforces 55D Beautiful Number (数位统计)
把数位dp写成记忆化搜索的形式,方法很赞,代码量少了很多. 下面为转载内容: a positive integer number is beautiful if and only if it is ...
- OceanBase RPC机制简要说明
http://note.youdao.com/share/?id=d2163a7ba8ec1ec58e64683a961c5121&type=note RPC是OB一个比较重要的各个组件间进行 ...
- [leetcode]Combine Two Tables
leetcode竟然有sql的题了..两道简单的应该会做 这个题主要就是一个left join... # Write your MySQL query statement below SELECT P ...
- Invalid Image Path - No image found at the path referenced under key "CFBundleIconFile": Icon.png
I got the same error when uploading my app. Moving all icon files to the Asset Catalog works if your ...
- 批量Ping IP
刚刚接触Python 想做点什么 听说Python 在网络方便很厉害 后来总结如下: 第一:发现公司都固定IP 每次新来同事都要猜一个没有人用的IP 很费劲 第二:我们公司有的IP可以上QQ 有的不 ...