资讯专栏INFORMATION COLUMN

not in 和not exist

2501207950 / 2162人阅读

摘要:今天写了一个简单的语句,结果跟预期大相径庭,百度之发现深坑一个,遂录之。问题出现了,在中,,,,与比较的结果都是与值比较的时候必须用。最后还是通过解决了问题,我还没打算解释这个为什么可以,因为我看到一个巨绕的文章,正在研究,待议

今天写了一个简单的NOT IN语句,结果跟预期大相径庭,百度之发现深坑一个,遂录之。
登陆账户表logins
code name status
a admin N
b guest N
c member N
联系人表contacts
code name logins_code
d zhangsan a
e lisi b
f wangwu (null)

contacts表的logins_code连接logins表的code,联系人可以绑定一个登陆用户,也可以不绑定,我们需要查logins获得没有绑定的账户,sql语句:

SELECT * FROM logins WHERE code NOT IN(SELECT logins_code FROM contacts);

预期应该是获得 c|member|N 的记录,但结果是Empty set.

SELECT logins_code FROM contacts;

返回的结果是(a,b,null),继续前推:

SELECT * FROM logins WHERE code NOT IN ("a","b",NULL);
等同于
SELECT * FROM logins WHERE code<>"a" AND code<>"b" AND code<>NULL;

PS:MySQL的IN并不完全等同于多个OR条件子句,MySQL是将IN()列表中的数据先排序后二分查找。

问题出现了,在SQL中 =,!=,~=,^=,<>NULL 比较的结果都是FALSE,与NULL值比较的时候必须用IS NULL ,IS NOT NULL。如果你数据库中的字段都是默认为NULL,那你就要小心了,如果对查询做了一个判断,例如我上面code 为f的记录

SELECT * FROM contacts where logins_code="";

还是什么都查不到,应该是logins_code IS NULL

所以如果你表字段默认为NULL在进行判断的时候一定要长点心了,NOT IN的坑算是对这个判断做了个包装。

最后还是通过EXISTS解决了问题,

SELECT * FROM logins t1 WHERE NOT EXISTS (SELECT * FROM contacts t2 WHERE t1.code=t2.logins_code);

我还没打算解释这个为什么可以,因为我看到一个巨绕的文章,正在研究,待议~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/46903.html

相关文章

  • inexists以及not in not exists有什么不同?(笔记)

    摘要:一个标量子查询是一个非关联子查询,返回唯一记录。如果子查询中只有少量的记录,则非关联子查询会比关联子查询执行得更快。使用子句的关联子查询条件对于相关条件来说,该子查询只能返回一个记录。 exists 和 in 1.原理 通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项, 这就节省了时间。Oracle在执行IN子查询时,首先执行子查询...

    刘明 评论0 收藏0
  • msyql笔记 - 子查询

    摘要:因为后面这条是相关子查询,每一次执行子查询都需要跟外表中的数据去关联。 msyql笔记 - 子查询 子查询比较好理解 子查询是比较容易出问题的写法 5.6以前子查询的性能不好 子查询的写法,通常来说只会用IN子查询,ANY,SOME,ALL几乎不用,只在某些场景下会用 operand comparison_operator ANY (subquery) operand IN (...

    taoszu 评论0 收藏0
  • 写一个“特殊”的查询构造器 - (四、条件查询:复杂条件)

    摘要:复杂的条件在的条件查询中,不只有这些基本的子句,还有等复杂一些的子句。这篇我们就来讲一下查询构造器如何构造这些复杂的查询语句。 复杂的条件 在 SQL 的条件查询中,不只有 where、or where 这些基本的子句,还有 where in、where exists、where between 等复杂一些的子句。而且即使是 where 这种基础的子句,也有多个条件的多种逻辑组合。这篇...

    baoxl 评论0 收藏0
  • Mysql优化原则_小表驱动大表INEXISTS的合理利用

    摘要:但是对于数据库而言,并不是这样了,我们尽量选择第个循环,也就是小表驱动大表。小表驱动大表即小的数据集驱动大的数据集。这里假设表代表员工表,表代表部门表。当表的数据集必须小于表的数据集时,用优于。要注意的是表与表的字段应该建立索引。 //假设一个for循环 for($i = 0; $i < 10000; $i++) { for ($j = 0; $i < 50; $j++) ...

    Tikitoo 评论0 收藏0
  • Linux_《Linux命令行与shell脚本编程大全》第十二章学习总结

    摘要:语句格式语句说明先执行,返回状态码为时,执行,从到之间的命令则跳过。当返回状态码不为时,则执行,的返回状态码为,则执行不为,则执行。 时间:2017年08月31日星期四说明:本文部分内容均摘取自书籍《Linux命令行与shell脚本编程大全》,版权归原作者所有。《Linux命令行与shell脚本编程大全》(第三版)第十二章学习总结 第十二章:使用结构化命令 本章内容 使用if-then...

    wapeyang 评论0 收藏1

发表评论

0条评论

2501207950

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<