【发布时间】: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