今天早上开发又过来说,怎么有个语句一直没有查询出结果,数据是有的呀,并发来了如下的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查询中的一个坑的更多相关文章

  1. mysql线上一些隐患查询sql

    开发写了几个语句,觉得查询结果跟逻辑有点不相符,就拿到这里一起分析了下. 语句如下: select tp.title, tp.amount, ifnull( ) as aInvestAmount, i ...

  2. 本地数据库导入线上服务器的mongodb中

    更改默认端口 sudo vi /etc/mongod.conf 进入conf文件,修改port值为19999保存并退出. 重启mongodb sudo service mongod restart 进 ...

  3. MySQL数据库之单表查询中关键字的执行顺序

    目录 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 2 执行顺序 3 关键字使用语法 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from ...

  4. MySql数据库GROUP BY使用过程中的那些坑

    MySql数据库GROUP BY使用过程中的那些坑 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. 特别注意: group by 有一个原则,就是 select 后面的所有 ...

  5. 记前端状态管理库Akita中的一个坑

    记状态管理库Akita中的一个坑 Akita是什么 Akita是一种基于RxJS的状态管理模式,它采用Flux中的多个数据存储和Redux中的不可变更新的思想,以及流数据的概念,来创建可观察的数据存储 ...

  6. andriod8.1.0源码编译中的一个坑-package com.sun.javadoc does not exist

    这里记录编译过程中的一个坑!!! 编译过程中出现了下面的报错 external/doclava/src/com/google/doclava/ClassInfo.java:20: error: pac ...

  7. 【MySQL 线上 BUG 分析】之 多表同字段异常:Column ‘xxx’ in field list is ambiguous

    一.生产出错! 今天早上11点左右,我在工作休息之余,撸了一下猫.突然,工作群响了,老大在里面说:APP出错了! 妈啊,这太吓人了,因为只是说了出错,但是没说错误的信息.所以我赶紧到APP上看看. 这 ...

  8. Docker + node(koa) + nginx + mysql 线上环境部署

    在上一篇 Docker + node(koa) + nginx + mysql 开发环境搭建,我们进行了本地开发环境搭建 现在我们就来开始线上环境部署 如果本地环境搭建没有什么问题,那么线上部署的配置 ...

  9. ××校招:前端线上笔试题--页面中的一个元素(10px*10px)围绕坐标(200, 300) 做圆周运动

    题目: 请让页面中的一个元素(10px*10px)围绕坐标(200, 300) 做圆周运动:   原理: 1.页面上画一个圆,画一个圆心.在这个圆的圆周上面画一个点,我们就让这个点绕着圆周跑: 2.怎 ...

随机推荐

  1. linux 系统性能指标采样脚本

    以下脚本写于redmine性能排查时,用于定位系统性能瓶颈的采样,源地址为~/performanceLog/collectLog.sh中,计划放入github的代码片段库中. 注: 如果mysql的地 ...

  2. 那些一目了然的3D地质模型 【转】

    http://www.360doc.com/content/16/0830/09/14719766_586950902.shtml

  3. Django 源码小剖: 响应数据 response 的返回

    响应数据的返回 在 WSGIHandler.__call__(self, environ, start_response) 方法调用了 WSGIHandler.get_response() 方法, 由 ...

  4. Xiph基金会成员:Timothy B. Terriberry

    Speex,CELT,Opus的发明人之一 还特意写了高中:Thomas Jefferson High School for Science and Technology Shit 一查,全美第一名的 ...

  5. Mac OSX系统下SVN客户端SCPlugin问题

    装上SCPlugin后,Checkout老是出现这种错误: Server certificate verification failed: certificate issued for a diffe ...

  6. WebApp开发之--"rem"单位(转)

    随着web app的兴起,rem这是个低调的css单位,近一两年开始崭露头角,有许多朋友对于它的评价不一,有的在尝试使用,有的在使用过程中遇到坑就弃用了.但是我认为rem是用来做web app它绝对是 ...

  7. 日暮·第一章·决斗

    日暮 第一章 决斗   泉州府,位于帝国的东南沿海,在数百年前,这里已是帝国最大的通商口岸之一,其一城之繁荣喧哗足以与异邦小国的都城相媲美,无数的人曾经来到这里,追逐财富,梦想,女人以及所有他们认为可 ...

  8. Microsoft.CSharp.CSharpCodeProvider

    Microsoft.CSharp.CSharpCodeProvider MSDN 提供对 C# 代码生成器和代码编译器的实例的访问.类提供可用来检索 C# ICodeGenerator 和 ICode ...

  9. SAP ECC MM 配置文档

    SAP ECC 6.0 Configuration Document Materials Management (MM) Table of Content TOC \o \h \z 1. Genera ...

  10. 用Wireshark简单分析HTTP通信

    我们都学过TCP,HTTP的相关概念,本文借助协议分析工具Wireshark,让大家对一些概念眼见为实,权当温故而知新. 场景: 在Client(10.239.196.211)上通过web brows ...