今天同事遇到一个问题:
select 'true ' from dual where (1,2) not in ((2,3),(2,null));
select 'true ' from dual where (2,1) not in ((2,3),(2,null));
以上两个例子的结果居然不同
select 'true ' from dual where (2,1) not in ((2,3),(2,null));
以上两个例子的结果居然不同
in/not in在判断NULL时用的与=/ <> 一样的方式,即必须用is null来判断,否则始终为失败。
语句
select 'true ' from dual where (1,2) not in ((2,3),(2,null));
成功的原因在于判断二元值时首先判断其中一个非null元素,该元素成功或者失败会“短路”另一个个。由于上述第一个元素就使not in成功了,因此第二个元素就不再处理。
语句
select 'true ' from dual where (2,1) not in ((2,3),(2,null));
的第一个元素没有造成“短路”,因此引起了null判断,从而结果始终为失败。
请再实验语句
select 'true ' from dual where (2,1) not in ((2,3),(null,3));
其结果为true,原因是第二个元素短路了第一个元素。
语句
select 'true ' from dual where (1,2) not in ((2,3),(2,null));
成功的原因在于判断二元值时首先判断其中一个非null元素,该元素成功或者失败会“短路”另一个个。由于上述第一个元素就使not in成功了,因此第二个元素就不再处理。
语句
select 'true ' from dual where (2,1) not in ((2,3),(2,null));
的第一个元素没有造成“短路”,因此引起了null判断,从而结果始终为失败。
请再实验语句
select 'true ' from dual where (2,1) not in ((2,3),(null,3));
其结果为true,原因是第二个元素短路了第一个元素。
相关推荐
在SQL查询语言中,`NOT EXISTS`、`NOT IN` 和 `NOT NULL` 是三种用于排除特定条件的数据记录的方法。然而,在实际应用中,这三种语法有着不同的应用场景和执行逻辑,有时初学者可能会误以为它们是等效的,但实际上...
在使用Elasticsearch时,我们需要实现一个需求:过滤一部分id,查询时不需要查出来。这时我们需要使用到termQuery和BoolQuery。 BoolQuery是Elasticsearch中的一种查询方式,使用must、should、must_not三个关键词来...
本文将深入探讨 SQL 中 `EXISTS`, `NOT EXISTS`, `IN`, `NOT IN` 的使用场景及效率问题。 #### 一、Exists 和 Not Exists 的效率说明 **Exists** 和 **Not Exists** 子句通常用于检查子查询是否返回任何行,它们...
MySQL中的`NOT IN`, `LEFT JOIN`, `IS NULL`, 和 `NOT EXISTS` 是四种不同的SQL查询方式,它们在特定情况下可以实现相似的功能,但实际执行效率可能会有很大差异。本文主要探讨这四种方法在处理大数据量时的性能表现...
IN、EXISTS、NOT EXISTS、NOT IN 在 SQL 语句中的应用和区别 IN 语句和 EXISTS 语句都是 SQL 语句中用来判断是否存在某个值的语句,但是它们的实现机制和应用场景是不同的。 IN 语句是通过 hash 连接来实现的,它...
在MySQL数据库操作中,我们经常会遇到使用`IN`或`NOT IN`子句来筛选满足特定条件的数据。然而,当涉及到`NULL`值时,这些子句的行为可能会出乎意料,导致查询结果不符合预期。本文将深入探讨这个问题,并提供解决...
CREATE TEMPORARY TABLE userlist(UserID int NOT NULL DEFAULT 0); INSERT INTO userlist(UserID) VALUES (166); -- 关联查询,如果users表中有166则返回1 SELECT COUNT(ul.UserID) FROM userlist AS ul ...
SELECT COUNT(DISTINCT student_id), SUM(CASE WHEN score IS NOT NULL THEN 1 ELSE 0 END) FROM grade WHERE course_id = '0003'; ``` - 查询`student_info`的姓名和出生日期,按出生日期降序排列: ```sql ...
B.1 使用Aqua Data Studio.. 157 B.2 使用DB2.. 158 B.3 使用Macromedia ColdFusion.. 159 B.4 使用Microsoft Access.. 159 B.5 使用Microsoft ASP... 160 B.6 使用Microsoft ASP.NET... 161 B.7 使用Microsoft ...
EJB3.0实例教程PDF 黎活名著 1.2 联系作者....................................................................................................................................................................
3. **NULL值处理**:“IN”不考虑NULL值,如果你需要包含NULL值,可以使用“IS NULL”或“NOT IN”。 4. **性能优化**:当“IN”操作符与大量值或子查询结合时,优化查询计划很重要,可能需要考虑创建索引或者优化...
例如,如果你想知道`col1`列中是否有非空值,使用`WHERE col1 IS NOT NULL`会得到准确的结果,而`WHERE col1 <> ''`则会排除空字符串但不包括`NULL`值。 在使用`COUNT()`函数时,`NULL`值会被忽略,但空字符串会被...
该查询使用了 NOT IN 运算符来排除 ACCOUNT 部门。 知识点:NOT IN 运算符的使用、关联查询的写法 2. 分组查询 Oracle 基础查询关联查询练习题中第二部分是分组查询。分组查询是指将数据分组,并对每个组进行...
特别是当主查询中的某个字段值为 NULL 时,`NOT IN` 会排除这些行,因为 NULL 不在任何集合(包括包含 NULL 的集合)中。而 `NOT EXISTS` 则不会受到 NULL 影响,它只关心是否存在匹配的行。 以一个简单的例子来...
6. **集合查询**:IN和NOT IN操作符用于判断某个值是否在给定的集合中。查询信息系、数学系和计算机系的学生姓名和性别: ```sql SELECT SN, SEX FROM S WHERE DEPT IN ('信息系', '数学系', '计算机系') ``` ...
2. 查询教师所有的单位即不重复的 Depart 列: ```sql select distinct depart from teacher ``` 3. 查询 Student 表的所有记录: ```sql select * from student ``` 4. 查询 Score 表中成绩在 60 到 80 之间的...
2. NOT IN运算的嵌套查询:排除IN中的结果,如`SELECT * FROM table WHERE column NOT IN (SELECT column FROM another_table)`。 3. 关系运算的嵌套查询:比较子查询结果,如`SELECT * FROM table WHERE column = ...
SELECT 学号, SUM(CASE WHEN 成绩 IS NOT NULL THEN 1 ELSE 0 END) AS 选课门数, SUM(成绩) AS 总成绩 FROM XS_KC GROUP BY 学号 ) SELECT 学号, 选课门数, 总成绩 FROM CTE ORDER BY 选课门数 DESC ```...