首页
学习
活动
专区
工具
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,avgsum)的聚合时,由于无可以聚合,数据库引擎不能确定这些聚合函数的返回,因此,数据库引擎返回NULL

1.2K30

MySQL NULL特性

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

2.7K10
  • 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的区别?

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

    2.5K10

    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.1K30

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

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

    1.2K61

    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中ARRAY JOIN子句JOIN子句的使用

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

    1.2K71

    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 操作符。

    73120

    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.8K30

    删除列中的 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.8K30

    selectwhere子句优化

    ,平衡可移植性性能 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 BYGROUP BY子句中的所有列都来自同一个表,则在连接时首选该表 14.如果order by子句group

    1.6K30

    用于 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.7K30
    领券