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.怎 ...
随机推荐
- 用eclipse建立servlet工程
1.打开eclipse,选择[文件]|[新建]|[项目] 2.选择[Tomcat Project]后单击下一步,输入项目名[TestTomcat],选择下一步,将[Can update contex ...
- 【Vegas原创】EXCEL光标所在的行自动变色
方法: 1,excel中,按Alt+F11,打开VBA编辑界面,双击需要改的工作表名称,将下面代码粘贴到右边框中,即可. 2,代码: Private Sub Worksheet_Selection ...
- 自定义Property属性动画
同步发表于 http://avenwu.net/customlayout/2015/04/06/custom_property_animation/ 代码获取 git clone https://gi ...
- ubuntu 13.10 Ralink RT3290 无线与蓝牙4.0的驱动安装
我的本是hp envy15, 蓝牙与无线的型号是Ralink RT3290, 装了Ubuntu 13.10 64bit后,蓝牙无法使用,无线几秒钟就会断开,查知,是因为驱动问题. ## 准备工作 首先 ...
- Python: 如何继承str/string?
想搞一个对象继承自str,然后存一些额外信息用来标识这个字符串,然后理所当然地重写了__init__发现跪了: class newstring(str): def __init__(self, val ...
- MT写的对URL操作的两个方法
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- sudo 使用不了, the permissions on the /etc/sudoers file are changed to something other than 0440
sudo 使用不了,报错: the permissions on the /etc/sudoers file are changed to something other than 0440 how ...
- 修改windows密码后ssrs报错
昨夜修改了windows的登录密码,第二日发现ssrs全部无法访问.显示filenotfound等错误.细想一下,应该是修改了windows的密码导致ssrs权限验证失败. 因此将ssrs的服务帐号修 ...
- android中的提示信息显示方法(toast应用)
android中的提示信息显示方法(toast应用) (2011-10-17 11:02:06) 转载▼ 标签: android toast 杂谈 分类: Android android中toast的 ...
- 关于STM32 CAN回环可用,正常不可用情况分析
1.回环下应该与GPIO无关 2.GPIO是否初始化正确,时钟启用 3.是否复用,AFIO时钟是否启用 4.回环下是否有CAN_Tx应该有输出 5.终端电阻是否有 6.CAN收发器电路电压是否正常 7 ...