首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NOT IN子句和NULL值

在 SQL 查询中,NOT IN 子句用于过滤出不在指定列表中的行。与 IN 子句相反,NOT IN 子句返回不匹配列表中任何值的行。

例如,假设有一个名为 products 的表,其中包含 product_idproduct_name 列。以下查询将返回 product_id 不在列表 [1, 2, 3] 中的所有行:

代码语言:sql
复制
SELECT * FROM products
WHERE product_id NOT IN (1, 2, 3);

在处理 NULL 值时,NOT IN 子句可能会导致意外的结果。当 NULL 值与任何其他值进行比较时,结果都是 NULL,而不是 TRUEFALSE。因此,在使用 NOT IN 子句时,如果其中一个列表值为 NULL,则整个条件将被视为 NULL,而不是 TRUEFALSE

例如,以下查询将返回 product_id 不等于 1NULL 的所有行:

代码语言:sql
复制
SELECT * FROM products
WHERE product_id NOT IN (1, NULL);

为了避免这种情况,可以使用 NOT IN 子句的替代方法,即使用 NOT EXISTS 子句。以下查询将返回与上面的示例相同的结果,但可以更好地处理 NULL 值:

代码语言:sql
复制
SELECT * FROM products
WHERE NOT EXISTS (
  SELECT 1 FROM (VALUES (1), (NULL)) AS x(value)
  WHERE product_id = x.value
);

总之,NOT IN 子句是一种过滤数据的有效方法,但在处理 NULL 值时需要注意。使用 NOT EXISTS 子句可以避免这些问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

不再迷惑,无值和 NULL 值

在关系型数据库的世界中,无值和NULL值的区别是什么?...无值和不确定值,单从字面意思上来看,两者之间的定义很清楚,一旦深究,这两者之间的关系,有时令人十分迷惑(confused),这是因为,在特定条件下,无值会转换为NULL值。...,是NULL值;对于表变量,临时表和基础表,如果没有插入任何数据,该表没有任何数据,是无值的。...无值和NULL值的转换,居然从不起眼的变量赋值开始。注意,当不返回任何值时,数据库引擎不确定返回值,就把无值转换为NULL值。...当聚合列值都是NULL值时,由于聚合函数忽略NULL值,因此,当计算聚合函数(max,min,avg和sum)的聚合值时,由于无值可以聚合,数据库引擎不能确定这些聚合函数的返回值,因此,数据库引擎返回NULL

1.3K30

PHP 类型判断和NULL,空值检查

PHP是一种宽松类型的编程语言,在函数中对传入的参数值的“类型”以及”值是否为空或者NULL“进行检查是不可缺少的步骤。...isset只有在变量”未显式赋值或者赋值为NULL“的时候返回为false,其他情况,比如值为空字符串,0等情况,它都返回true。 可以使用unset来删除一个已经定义的变量。...但是从语义上来说,一个变量”是否已显示初始化“和”是否为NULL“是不同的概念,在某些场景下使用isset是不合适的,比如检查一个函数的返回值是否为NULL。...此时可以使用"=="和”===“来判断它们是否为NULL。 对于"=="和”===“,它们直接的区别还是很大。对于"==",它认同空字符串,0,false都为NULL。...empty()函数的认识 在判断变量是否为NULL时候,也会把empty这个函数拿来和isset之类的一起讨论。

3.4K20
  • MySQL NULL值特性

    NULL是一种“没有类型”的值,通常表示“无值”,“未知值”,“缺失值”,“超界”,“不在其中”等,我们在日常运用中很容易和NULL字符串混淆,这里大致整理了下NULL值的一些特性,以便能够正确使用NULL...2)NULL字符串可以当作普通字符串进行处理,而NULL值的判断只有is null和 is not null,见第5点 3,插入数据时若不指定值,如果没其它默认值,会用默认值NULL 4,当插入大写...NULL字符时,就很难区别NULL是NULL值还是NULL字符串了,这时需要用到NULL值的判断,NULL值的判断只有is NULL和is not NULL 通过肉眼很难区别,这里通过NULL值的判断...(expr1,expr2)(如果expr1 is null则返回expr2,否则返回expr1) 6,和NULL值的比较运算和算术运算,结果仍为NULL值,但是运算符时,NULLNULL为真...\N(区分大小写)当作NULL值 9,NULL值和空字符’’不一样,查询字段为空字符时,可以用等号,不考虑长度,都显示为空,但是长度不一样 10,空字符和其他字符做算术运算时当作0处理,但是当做分母时运算结果为

    2.7K10

    MySQL 中NULL和空值的区别?

    01 小木的故事 作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值。那你知道它们有什么区别吗? 学不动了,也不想知道它们有什么区别。...面试官:那你能大概说一下Mysql中 NULL值和空值的区别吗? 小木:(思考…)NULL和空值都用过,你要我说它两有啥区别,这个我还真没仔细想过,反正实际开发中会用! 听了小木的这个回答。...02 NULL和空值 NULL也就是在字段中存储NULL值,空值也就是字段中存储空字符(’’)。...1、空值不占空间,NULL值占空间。当字段不为NULL时,也可以插入空值。...6:实际到底是使用NULL值还是空值(’’),根据实际业务来进行区分。个人建议在实际开发中如果没有特殊的业务场景,可以直接使用空值。 以上就是我的对此问题的整理和思考,希望可以在面试中帮助到你。

    2.6K10

    mysql 空值(null)和空字符()的区别

    日常开发中,一般都会涉及到数据库增删改查,那么不可避免会遇到Mysql中的NULL和空字符。...空字符('')和空值(null)表面上看都是空,其实存在一些差异: 定义: 空值(NULL)的长度是NULL,不确定占用了多少存储空间,但是占用存储空间的 空字符串('')的长度是0,是不占用空间的 通俗的讲...和空值(null)查询方式的不同: mysql> select * from test_ab where col_a = ''; +------+-------+-------+ | id | col_a...而且比较字符 ‘=’’>’ ‘’不能用于查询null, 如果需要查询空值(null),需使用is null 和is not null。...在设置字段的时候,可以给字段设置为 not null ,因为 not null 这个概念和默认值是不冲突的。

    3.3K30

    NULL 值与索引(一)

    由于 NULL存在着无数的可能,因此NULL值也不等于NULL值,所以与NULL值相关的操作同样都为NULL值。...正是基于这样一个特性,对于NULL值列上的B 树索引导致了is null/is not null不走索引的情形,下面描述了NULL值与索引以及索引NULL列上的执行计划,如何使得NULL值走索引的情形。...故在基于单列创建B树唯一索引或多列创建B树复合唯一索引的情形下,     当列上允许为null值时         where子句使用了基于is null的情形,其执行计划走全表扫描。         ...where子句使用了基于is not null的情形,其执行计划走索引扫描(索引范围扫描或索引全扫描)。     ...当列上不允许为null值时,存在非null约束         where子句使用了基于is null的情行,其执行计划走索引扫描。

    1.6K20

    ClickHouse中,WHERE、PREWHERE子句和SELECT子句的使用

    图片WHERE、PREWHERE子句在ClickHouse中,WHERE和PREWHERE子句都用于筛选数据,但它们在查询中的使用有一些区别和注意事项。1....WHERE子句:WHERE子句在查询中是最后执行的,它作用于从表中读取的所有数据。WHERE子句可以包含任意条件,并且可以使用各种函数和操作符进行数据筛选。...PREWHERE子句不能使用索引来加速查询。注意事项:在处理大型数据集时,应使用PREWHERE子句来过滤数据源,以减少内存和CPU的使用。通过减少不必要的数据读取和处理,可以显著提升查询性能。...尽管PREWHERE子句不能使用索引,但在某些情况下,其性能仍然超过使用WHERE子句。可以通过在查询中进行测试和比较来确定使用哪个子句可以获得更好的性能。...的值乘以2赋给别名column3。

    1.8K61

    ClickHouse中ARRAY JOIN子句和JOIN子句的使用

    图片ARRAY JOIN子句在ClickHouse中,ARRAY JOIN子句用于查询和展开数组数据。它可以将一个数组字段展开为多个行,以便在查询结果中分别处理每个数组元素。...使用ARRAY JOIN子句查询和展开数组数据。...,而value列的值为数组元素的值。...通过使用ARRAY JOIN子句,您可以以更容易处理的方式查询和展开数组数据。JOIN子句在ClickHouse中,JOIN子句用于在查询中连接两个或多个表,并根据指定的关联条件返回结果。...总之,ClickHouse中的JOIN子句可以帮助用户进行多表关联查询、数据聚合分析和数据合并等操作,具有高性能和灵活的特点,适用于大规模数据处理和分析场景。

    1.6K71

    SQL---NULL值处理(1)

    SQL NULL 值 SQL Date SQL isnull() NULL 值是遗漏的未知数据。 默认地,表的列可以存放 NULL 值。...本章讲解 IS NULL 和 IS NOT NULL 操作符。 SQL NULL 值 如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。...这意味着该字段将以 NULL 值保存。 NULL 值的处理方式与其他值不同。 NULL 用作未知的或不适用的值的占位符。 注释:无法比较 NULL 和 0;它们是不等价的。...这意味着如果在 "Address" 列插入一条不带值的记录,"Address" 列会使用 NULL 值保存。 那么我们如何测试 NULL 值呢?...无法使用比较运算符来测试 NULL 值,比如 =, 。 我们必须使用 IS NULL 和 IS NOT NULL 操作符。

    73820

    SQL中的Null值处理

    在日常的开发中,遇到需要处理 Null 值的场景还是蛮常见的。比如,查询某个字段包含 Null 值的记录、在展示的时候将 Null 值转为其它值、聚合包含 Null 值的列等。...今天就和大家聊聊在 MySQL 中处理 Null 值时需要注意的点,本文包含以下内容: 查找 Null 值 将 Null 值转为实际值 在排序中对 Null 值的处理 计算非 Null 值的数量 聚合...Null 列 1 查找 Null 值 查找 Null 值不能使用 “=”,而应该使用“is Null”。...count(comm) ------------- 4 注意,如果要统计一张表有多少记录时,不要在允许设置为 Null 值的列上做统计,得出来的结果和实际数据有偏差。...注意对比一下使用 count(*) 和 count(comm) 的区别。

    2.9K30

    select和where子句优化

    ,平衡可移植性和性能 4.合适的结构,合适的数据类型;执行频繁更新的应用程序大量表(少列);分析大量数据的应用程序少量表(多列);选择合适的存储引擎和索引; 5.压缩适用于InnoDB表的各种工作负载,...8.优化select语句,这方面技巧同样适用于其他带where的delete语句等,在where子句的列上设置索引;索引对于引用多个列如join和外键尤其重要 select where子句优化: 1.调整查询的结构...5.优化InnoDB表的单查询事务 6.通过阅读EXPLAIN计划并调整索引,WHERE子句,连接子句等来调查特定查询的内部详细信息 7.调整MySQL用于缓存的内存区域的大小和属性。...(*)直接从表信息中查询;当只有一张表时,not null表达式也是这样 11.如果不使用GROUP BY或聚合函数(COUNT(),MIN()等),HAVING将与WHERE合并 12.常量表,只有一行或空表...;where子句作用在primary key或者unique索引上 13.如果ORDER BY和GROUP BY子句中的所有列都来自同一个表,则在连接时首选该表 14.如果order by子句和group

    1.6K30

    删除列中的 NULL 值

    图 2 输出的结果 先来分析图 1 是怎么变成图 2,图1 中的 tag1、tag2、tag3 三个字段都存在 NULL 值,且NULL值无处不在,而图2 里面的NULL只出现在这几个字段的末尾。...这个就类似于 Excel 里面的操作,把 NULL 所在的单元格删了,下方的单元格往上移,如果下方单元格的值仍是 NULL,则继续往下找,直到找到了非 NULL 值来补全这个单元格的内容。...有一个思路:把每一列去掉 NULL 后单独拎出来作为一张独立的表,这个表只有两个字段,一个是序号,另一个是去 NULL 后的值。...具体的实现看下面的 SQL(我偷懒了,直接把原数据通过 SELECT 子句生成了)。...NULL AS tag2, 'ccc5' AS tag3), # 去 NULL 值,列转行 t2 AS (SELECT tag1 AS tag, 'tag1' AS col,

    9.9K30

    用于 SELECT 和 WHERE 子句的函数

    2 3 包含 NULL 的表达式总是得出一个 NULL 值结果,除非表达式中的操作和函数在文档中有另外的说明。 4 5 注意:在一个函数名和跟随它的括号之间必须不存在空格。...如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。...1057 6.3.4 日期和时间函数 1058 1059 对于每个类型的值范围以及日期和时间值有效指定格式,请查看章节 6.2.2 Date 和 Time 类型。...如果你以一个非特殊值(即一个非 NULL 和非 0 的值)更新其它的 AUTO_INCREMENT,它甚至也不会改变。...通过使用 DISTINCT 可以排除重复值。如果希望对结果中的值进行排序,可以使用 ORDER BY 子句。

    4.8K30

    ArrayList并发写出现Null值

    值的结果 10 [null, 1, 3, 4, 5, 6, 7, 8, 9, 10] 或者 10 [null, 2, 3, 4, 5, 6, 7, 8, 9, 10] 或者 10 [null, null...在我看百度看到的所有答案中,关于并发写出现Null值,几乎都是将原因归咎到add方法中的size++上,这里我个人认为这种回答应该是错误的,出现null值的原因应该是扩容所造成的。...大家可以好好想一下这个操作,无论size++多么不安全,因为索引复制两份被保存的操作数栈中,所以不可能在list中出现null值,只会出现覆盖的可能。...如果大家理解了上面的过程,我们思考下为什么null值出现了呢?...这里我们举一个详细的例子: 现在有线程A和B分别要插入元素1和2,当线程A调用add方法时size是0,于是会进行一次扩容,此时线程B调用add方法时size仍然是0,所以也会进行扩容,假设此时线程A比线程

    2.3K50
    领券