"之间的区别是什么?" AND"< => NULL"

时间:2014-05-29 08:02:17

标签: mysql sql null isnull

is null<=> NULL之间有什么区别?

mysql> SELECT * FROM param WHERE num is null;
+-----+------+
| id  | num  |
+-----+------+
|   8 | NULL |
| 225 | NULL |
+-----+------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM param WHERE num<>NULL;
Empty set (0.00 sec)

mysql> SELECT * FROM param WHERE num<=>NULL;
+-----+------+
| id  | num  |
+-----+------+
|   8 | NULL |
| 225 | NULL |
+-----+------+

标准版本的差异?如果参数<=>is null

,我看不到它的实际用途

4 个答案:

答案 0 :(得分:9)

从不使用foo = nullfoo <> nullfoo != null

检查空值
mysql> SELECT 1 <> NULL;
        -> NULL

Not even NULL等于NULL!

mysql> SELECT NULL = NULL;
        -> NULL

而是使用以下运算符之一


<=>Null-Safe Operator

  

NULL -safe相等。此运算符执行与 = 运算符相等的比较,但如果两个操作数均 NULL ,则返回1而不是 NULL ,并且{如果一个操作数为 NULL ,则为{1}}而不是 NULL

0

另一方面,IS NULL更直接

  

测试值是否为 NULL

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

重要提示:阅读IS NULL documentation,了解mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL; -> 0, 0, 1 设置如何影响此运营商。

另请参阅: IS NOT NULL以测试值而非等于NULL。


您可能也对COALESCE感兴趣。

答案 1 :(得分:4)

理论差异

<=>运营商

<=>是一个安全的空比较运算符。这意味着您可以使用它,如果您要与NULL进行比较,请不要担心 - 它会表现正常。为了说明,这是一个简单的查询:

mysql> SELECT v, v<=>NULL, v<=>1, v<=>0 FROM test;
+------+----------+-------+-------+
| v    | v<=>NULL | v<=>1 | v<=>0 |
+------+----------+-------+-------+
|    1 |        0 |     1 |     0 |
| NULL |        1 |     0 |     0 |
+------+----------+-------+-------+
2 rows in set (0.00 sec)

那么<=>的作用是正常的比较,注意是一个或两个比较的操作数是NULL

<强> IS NULL

另一方面,IS NULL非常相似。它将检查检查参数是否为NULL。但是 - 不,它与使用<=>不完全相同 - 至少,因为IS NULL将返回布尔值:

mysql> SELECT v, v IS NULL FROM test;
+------+-----------+
| v    | v IS NULL |
+------+-----------+
|    1 |         0 |
| NULL |         1 |
+------+-----------+
2 rows in set (0.00 sec)

如何等效

但是 - ,我们可以使用IF<=>替换为IS NULL。这将完成:

mysql> SELECT v, IF(v IS NULL, 1, 0) AS `v<=>NULL`, IF(v IS NULL, 0, v=1) AS `v<=>1`, IF(v IS NULL, 0, v=0) AS `v<=>0` FROM test;
+------+----------+-------+-------+
| v    | v<=>NULL | v<=>1 | v<=>0 |
+------+----------+-------+-------+
|    1 |        0 |     1 |     0 |
| NULL |        1 |     0 |     0 |
+------+----------+-------+-------+
2 rows in set (0.00 sec)

因此,<=>相当于IFIS NULL和简单比较的组合。

实际差异

我已经说过,<=>可以替换为IS NULLIF - 但<=>实际上有一个很大的好处。它可以在prepared statements中安全使用。想象一下,我们想用输入值检查一些条件。使用<=>我们可以使用预准备语句来执行此操作:

mysql> PREPARE stmt FROM 'SELECT * FROM test WHERE v<=>?';
Query OK, 0 rows affected (0.00 sec)
Statement prepared

现在我们可以不关心我们是否会通过NULL - 它会正常工作:

mysql> SET @x:=1;
Query OK, 0 rows affected (0.03 sec)

mysql> EXECUTE stmt USING @x;
+------+
| v    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

NULL

mysql> SET @x:=NULL;
Query OK, 0 rows affected (0.00 sec)

mysql> EXECUTE stmt USING @x;
+------+
| v    |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

当然,对于依赖预备语句(例如PDO for PHP)的所有驱动程序,这都是相同的。

好。我们可以IS NULL替换它 - 但<=>在这种情况下是一件很棒的事情,所以我们可以让我们准备好的语句简洁明了。

答案 2 :(得分:2)

在实践中,它们在逻辑上是相同的,因此以下两者都会产生相同的结果......

SELECT NULL <=> NULL, 1 <=> NULL;
SELECT NULL IS NULL, 1 IS NULL;

但是在下列情况下,一个人会抛出一个错误而另一个人不会......

SELECT 1 <=> 1;
SELECT 1 IS 1;

因此,'IS NULL'只能用于测试'nullness'。除了与'NULL'结合使用外,不能使用'IS'。 “&LT; =&gt;” 中可以在更广泛的环境中使用(在我看来)非常有用。

答案 3 :(得分:0)

什么是逻辑?

mysql> SELECT NULL AND false;
+----------------+
| NULL AND false |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)

mysql> SELECT NULL AND TRUE;
+---------------+
| NULL AND TRUE |
+---------------+
|          NULL |
+---------------+
1 row in set (0.00 sec)

mysql>