我正在研究由前一位开发人员编写的代码,并在查询中说明,
WHERE p.name <=> NULL
<=>
在此查询中的含义是什么?它是否等于=
?或者是语法错误?
但它没有显示任何错误或例外。我已经知道MySQL中的<>
= !=
。
答案 0 :(得分:211)
=
运算符与常规=
运算符一样,会比较两个值,结果为0
(不等于)或1
(等于);换句话说:'a' <=> 'b'
会产生0
,'a' <=> 'a'
会产生1
。
=
运算符与常规=
运算符不同,NULL
的值没有特殊含义,因此它永远不会产生NULL
作为可能的结果;所以:'a' <=> NULL
产生0
,NULL <=> NULL
产生1
。
与=
相反,'a' = NULL
产生NULL
甚至NULL = NULL
产生NULL
;顺便说一下,MySQL中的几乎所有运算符和函数都以这种方式工作,因为与NULL
的比较基本上是未定义的。
当两个操作数都包含NULL
且两列之间需要一致的比较结果时,这非常有用。
另一个用例是使用预准备语句,例如:
... WHERE col_a <=> ? ...
此处,占位符可以是标量值,也可以是NULL
,而无需更改查询的任何内容。
除了<=>
之外,还有另外两个可用于与NULL
进行比较的运算符,即IS NULL
和IS NOT NULL
;它们是ANSI标准的一部分,因此支持其他数据库,而不像<=>
,这是特定于MySQL的。
您可以将它们视为MySQL的<=>
:
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
基于此,您的特定查询(片段)可以转换为更具可移植性:
WHERE p.name IS NULL
答案 1 :(得分:54)
是&lt; =&gt; NULL-safe equal to operator
此运算符执行与=运算符类似的相等比较,但如果两个操作数均为NULL,则返回1而不是NULL;如果一个操作数为NULL,则返回0而不是NULL。
请参阅此处查看documentation
示例:
你应该使用IS NOT NULL。 (比较运算符=和&lt;&gt;都在表达式的任一侧为UNKNOWN提供NULL。)
SELECT *
FROM table
WHERE YourColumn IS NOT NULL;
也可以否定null安全等式运算符,但这不是标准SQL。
SELECT *
FROM table
WHERE NOT (YourColumn <=> NULL);
答案 2 :(得分:23)
&LT; =&GT;运算符用于将NULL值与字段进行比较。如果normal =(equals)如果其中一个比较值为NULL,则运算符返回NULL。使用&lt; =&gt; operator返回true或false。 &LT; =&GT;运算符与IS NULL相同。
从手册: -
<=>
执行与=运算符相等的等式比较,但返回 如果两个操作数均为NULL,则为1而不是NULL,而不是NULL 如果一个操作数为NULL。
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
编辑: - (虽然添加一个重要的附注,但提及 NOT&lt; =&gt; 以及)已经很晚了
旁注: -
还有一个点 NOT&lt; =&gt; ,用于将NULL值与字段进行比较。如果正常!=或&lt;&gt; (不等于)如果其中一个比较值为NULL,则运算符返回NULL。未应用于&lt; =&gt; operator返回true或false。不适用于&lt; =&gt;运算符与IS NOT NULL相同。
示例: - 强>
SELECT NULL != NULL, //--Result is NULL
NOT NULL <=> NULL, //--Result is 0
NULL IS NOT NULL; //--Result is 0
答案 3 :(得分:18)
<=>
是MySQL的零安全“等于”运算符。 From the manual:
NULL-safe相等。此运算符执行与=运算符相等的比较,但如果两个操作数均为NULL,则返回1而不是NULL;如果一个操作数为NULL,则返回0而不是NULL。
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
答案 4 :(得分:11)
NULL-safe相等。此运算符执行与=运算符相等的比较,但如果两个操作数均为NULL,则返回1而不是NULL;如果一个操作数为NULL,则返回0而不是NULL。
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
意义重大:
当您将NULL值与非NULL值进行比较时,您将获得NULL。如果要检查值是否为空。
Equality运算符(&lt; =&gt;)将NULL视为正常值,因此如果两个值都为NULL,则返回1(非NULL),如果其中一个值为NULL,则返回0(非NULL): / p>
<强>例如强>
SELECT NULL <=> NULL -- 1
SELECT TRUE <=> TRUE -- 1
SELECT col1 <=> col2 FROM myTable
答案 5 :(得分:10)
<=>
是NULL-safe equal operator。 a <=> b
与写作相同:
CASE
WHEN a IS NULL AND b IS NULL THEN 1 -- both operands null then 1
WHEN a IS NULL OR b IS NULL THEN 0 -- one operand is null then 0
ELSE a = b -- else behave like normal = operator
END
很抱歉,我找不到使用此运算符而不是AND/OR IS (NOT) NULL
的充分理由。例如,您的示例 WHERE p.name <=> NULL
与 WHERE p.name IS NULL
相同。
答案 6 :(得分:9)
NULL-safe相等。此运算符执行与=运算符相等的比较,但如果两个操作数均为NULL,则返回1而不是NULL;如果一个操作数为NULL,则返回0而不是NULL。
使用<=>
运算符的示例如下:
SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
哪会回来:
1, 1, 0
常规=
运算符的一个示例是:
SELECT 1 = 1, NULL = NULL, 1 = NULL;
哪会回来:
1, NULL, NULL
<=>
运算符与=
运算符非常相似,但<=>
永远不会返回NULL
答案 7 :(得分:5)
它是NULL - 安全等于运算符。检查description。
答案 8 :(得分:1)
store_dir