【问题标题】:Is it necessary to do NULL value check before doing comparison on a nullable column in database?在对数据库中的可为空列进行比较之前是否需要进行 NULL 值检查?
【发布时间】:2015-09-04 07:46:42
【问题描述】:

我想知道在数据库中进行比较之前是否有必要或良好的做法是执行空值检查,尤其是在我正在研究这些的 MySQL 和 MSSQL 上。如果执行 null 检查,是否会影响性能?

简而言之,以下 SQL for MySQL 中的版本 1 和版本 2 在产生的结果和性能方面有什么区别?

DROP TABLE IF EXISTS t1;

CREATE TABLE t1 (
    id INT AUTO_INCREMENT PRIMARY KEY,
    intval INT NULL DEFAULT NULL,
    strval VARCHAR(32) NULL DEFAULT NULL,
    KEY idx_intval (intval),
    KEY idx_strval (strval)
);

INSERT INTO t1 (intval, strval) VALUES
    (2, 'B'),
    (1, 'A'),
    (NULL, 'C'),
    (4, NULL);

-- Version 1
SELECT * FROM t1 WHERE intval IS NOT NULL AND intval > 1;
SELECT * FROM t1 WHERE strval IS NOT NULL AND strval IN ('A', 'C');

-- Version 2
SELECT * FROM t1 WHERE intval > 1;
SELECT * FROM t1 WHERE strval IN ('A', 'C');

DROP TABLE t1;

【问题讨论】:

  • 请记住:在标准 SQL 中 NULL != NULL as NULL 是未定义的——就像“我不知道如何比较”。
  • 1) 见执行计划 2) NULL 使用 , >,
  • 第 2 版非常好。在大多数情况下,不需要同时进行 IS NOT NULL 和另一个比较。但请注意,NOT IN 子选择会愚弄许多程序员!
  • col NOT IN (NULL, 1) col <> NULL AND col <> 1 相同,始终为 NULL,简单 The negation of a disjunction is the conjunction of the negations.

标签: mysql sql sql-server database


【解决方案1】:

如果不使用 IS NULL / IS NOT NULL,每次与 NULL 的比较都会失败。

所以:

NULL > 1 失败(==> 没有必要指定 INTVAL IS NOT NULL)

NULL IN ('A', 'C') 失败(==> 没有必要指定 STRVAL IS NOT NULL)

【讨论】:

  • 如果指定了不必要的IS NOT NULL,性能会下降吗?我尝试按照@lad2025 的建议查看 MySQL 和 MSSQL 上的执行计划,但我看不出有任何区别,即使没有 @lad2025 建议的短路评估。
【解决方案2】:

我们无法与null 进行比较,因为null 是一个空字符串。如果你将某个东西与null 比较结果null

【讨论】:

  • NULL 值与空字符串不同。
  • 空值只不过是一个空值
  • 不正确,@Smart003。 NULL 是缺少值的标记。一个空值''等价于另一个空值,但两个null既不相等也不不相等,也没有真正的值等于或不等于 null .
猜你喜欢
  • 1970-01-01
  • 2016-01-05
  • 2011-09-15
  • 2011-02-26
  • 2020-07-06
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多