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
答案 0 :(得分:9)
从不使用foo = null
或foo <> null
或foo != null
mysql> SELECT 1 <> NULL;
-> NULL
Not even NULL等于NULL!
mysql> SELECT NULL = NULL;
-> NULL
而是使用以下运算符之一
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)
因此,<=>
相当于IF
,IS NULL
和简单比较的组合。
我已经说过,<=>
可以替换为IS NULL
和IF
- 但<=>
实际上有一个很大的好处。它可以在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>