那些年我们踩过的坑,SQL 中的空值陷阱! 您所在的位置:网站首页 sql不等于字符串 那些年我们踩过的坑,SQL 中的空值陷阱!

那些年我们踩过的坑,SQL 中的空值陷阱!

2023-12-29 22:38| 来源: 网络整理| 查看: 265

文章目录NULL 即是空三值逻辑空值比较NOT IN 与空值函数与空值DISTINCT、GROUP BY、UNION 与空值ORDER BY 与空值空值处理函数字段约束与空值 null SQL 是一种声明式的语言,我们只需要描述想要的结果(WHAT),而不关心数据库如何实现(HOW);虽然 SQL 比较容易学习,但是仍然有一些容易混淆和出错的概念。

今天我们就来说说 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):

trheevalue 引入三值逻辑主要是为了支持 NULL,因为 NULL 代表的是未知数据。因此,SQL 中的逻辑运算与(AND)、或(OR)以及非(NOT)的结果如下:

AND 真 假 未知 真 真 假 未知 假 假 假 假 未知 未知 假 未知 OR 真 假 未知 真 真 真 真 假 真 假 未知 未知 真 未知 未知 NOT 结果 真 假 假 真 未知 未知

对于 AND 运算符而言,真和未知的与运算有可能是真,也有可能是假;因此,最终的结果是未知。

?SQL 中的 WHERE、HAVING 以及 CASE WHEN 子句只返回逻辑运算结果为真的数据,不返回结果为假或未知的数据。

空值比较

当我们使用比较运算符(=、、 等)与 NULL 进行比较时,结果既不是真也不是假,而是未知;因为 NULL 表示未知,也就意味着可能是任何值。以下运算的结果都是未知:

NULL = 0 NULL 0 NULL


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有