那些年我们踩过的坑,SQL 中的空值陷阱! | 您所在的位置:网站首页 › sql不等于字符串 › 那些年我们踩过的坑,SQL 中的空值陷阱! |
文章目录NULL 即是空三值逻辑空值比较NOT IN 与空值函数与空值DISTINCT、GROUP BY、UNION 与空值ORDER BY 与空值空值处理函数字段约束与空值
![]() 今天我们就来说说 SQL 中的空值陷阱和避坑方法,涉及的数据库包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。还是老规矩,结论先行: NULL 特性 MySQL Oracle SQL Server PostgreSQL SQLite 三值逻辑 ✔️ ✔️ ✔️ ✔️ ✔️ 空值比较 IS [NOT] NULL expr NULL IS [NOT] NULL '' IS NULL IS [NOT] NULL IS [NOT] NULL IS [NOT] DISTINCT FROM NULL IS [NOT] NULL NOT IN (NULL) 不返回结果 不返回结果 不返回结果 不返回结果 不返回结果 函数/表达式 NULL 参数 结果为 NULL 结果为 NULL CONCAT 函数和 || 例外 结果为 NULL CONCAT 函数例外 结果为 NULL CONCAT 函数例外 结果为 NULL 聚合函数 忽略 NULL 数据 COUNT(*) 除外 忽略 NULL 数据 COUNT(*) 除外 忽略 NULL 数据 COUNT(*) 除外 忽略 NULL 数据 COUNT(*) 除外 忽略 NULL 数据 COUNT(*) 除外 DISTINCT GROUP BY PARTITION BY UNION 所有空值分为一组 所有空值分为一组 所有空值分为一组 所有空值分为一组 所有空值分为一组 ORDER BY 默认空值最小 默认空值最大 支持 NULLS FIRST | LAST 默认空值最小 默认空值最大 支持 NULLS FIRST | LAST 默认空值最小 支持 NULLS FIRST | LAST COALESCE 函数 NULLIF 函数 ✔️ IFNULL(expr1, expr2) IF(expr1, expr2, expr3) ✔️ NVL(expr1, expr2) NVL2(expr1, expr2, expr3) ✔️ ISNULL(expr1, expr2) ✔️ ✔️ 唯一约束允许多个空值 ✔️ ✔️ ❌ ✔️ ✔️ 检查约束允许插入空值 ✔️ ✔️ ✔️ ✔️ ✔️本文使用的示例数据可以点击链接《SQL 入门教程》示例数据库下载。 NULL 即是空在数据库中,空值(NULL)是一个特殊的值,通常用于表示缺失值或者不适用的值。比如,填写问卷时不愿意透露某些信息会导致录入项的缺失,在公司的组织结构中总会有一个人(董事长/总经理)没有上级领导。 首先一点,空值与数字 0 并不相同。假如我问你:你的钱包里有多少钱?如果你知道里面没有钱,可以说是零;如果你不确定,那么就是未知,但不能说没有。当我们需要创建一个表来存储这个信息的时候,应该是 NULL;除非我们能够确定钱包里面没有钱或者有多少钱。 另外,空值与空字符串('')也不相同,原因和上面类似。但是 Oracle 是一个例外,我们会在下文具体讨论。 在大多数编程语言中,访问 null 值通常会导致错误;但是 SQL 不会出错,只是会影响到运算的结果而已。 三值逻辑在大多数编程语言中,逻辑运算的结果只有两种情况,不是真(True)就是假(False)。但是对于 SQL 而言,逻辑运算还可能是未知(Unknown):
对于 AND 运算符而言,真和未知的与运算有可能是真,也有可能是假;因此,最终的结果是未知。 ?SQL 中的 WHERE、HAVING 以及 CASE WHEN 子句只返回逻辑运算结果为真的数据,不返回结果为假或未知的数据。 空值比较当我们使用比较运算符(=、、 等)与 NULL 进行比较时,结果既不是真也不是假,而是未知;因为 NULL 表示未知,也就意味着可能是任何值。以下运算的结果都是未知: NULL = 0 NULL 0 NULL |
CopyRight 2018-2019 实验室设备网 版权所有 |