摘要:今天写了一个简单的语句,结果跟预期大相径庭,百度之发现深坑一个,遂录之。问题出现了,在中,,,,与比较的结果都是与值比较的时候必须用。最后还是通过解决了问题,我还没打算解释这个为什么可以,因为我看到一个巨绕的文章,正在研究,待议
今天写了一个简单的NOT IN语句,结果跟预期大相径庭,百度之发现深坑一个,遂录之。登陆账户表logins
code | name | status |
---|---|---|
a | admin | N |
b | guest | N |
c | member | N |
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
摘要:一个标量子查询是一个非关联子查询,返回唯一记录。如果子查询中只有少量的记录,则非关联子查询会比关联子查询执行得更快。使用子句的关联子查询条件对于相关条件来说,该子查询只能返回一个记录。 exists 和 in 1.原理 通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项, 这就节省了时间。Oracle在执行IN子查询时,首先执行子查询...
摘要:因为后面这条是相关子查询,每一次执行子查询都需要跟外表中的数据去关联。 msyql笔记 - 子查询 子查询比较好理解 子查询是比较容易出问题的写法 5.6以前子查询的性能不好 子查询的写法,通常来说只会用IN子查询,ANY,SOME,ALL几乎不用,只在某些场景下会用 operand comparison_operator ANY (subquery) operand IN (...
摘要:复杂的条件在的条件查询中,不只有这些基本的子句,还有等复杂一些的子句。这篇我们就来讲一下查询构造器如何构造这些复杂的查询语句。 复杂的条件 在 SQL 的条件查询中,不只有 where、or where 这些基本的子句,还有 where in、where exists、where between 等复杂一些的子句。而且即使是 where 这种基础的子句,也有多个条件的多种逻辑组合。这篇...
摘要:但是对于数据库而言,并不是这样了,我们尽量选择第个循环,也就是小表驱动大表。小表驱动大表即小的数据集驱动大的数据集。这里假设表代表员工表,表代表部门表。当表的数据集必须小于表的数据集时,用优于。要注意的是表与表的字段应该建立索引。 //假设一个for循环 for($i = 0; $i < 10000; $i++) { for ($j = 0; $i < 50; $j++) ...
摘要:语句格式语句说明先执行,返回状态码为时,执行,从到之间的命令则跳过。当返回状态码不为时,则执行,的返回状态码为,则执行不为,则执行。 时间:2017年08月31日星期四说明:本文部分内容均摘取自书籍《Linux命令行与shell脚本编程大全》,版权归原作者所有。《Linux命令行与shell脚本编程大全》(第三版)第十二章学习总结 第十二章:使用结构化命令 本章内容 使用if-then...
阅读 917·2021-11-24 09:38
阅读 3095·2021-11-19 09:56
阅读 2780·2021-11-18 10:02
阅读 613·2019-08-29 12:50
阅读 2474·2019-08-28 18:30
阅读 755·2019-08-28 18:10
阅读 3465·2019-08-26 11:36
阅读 2549·2019-08-23 18:23