什么是此运算符< =>在MySQL?

时间:2014-02-21 06:40:17

标签: mysql sql operators spaceship-operator

我正在研究由前一位开发人员编写的代码,并在查询中说明,

WHERE p.name <=> NULL

<=>在此查询中的含义是什么?它是否等于=?或者是语法错误?

但它没有显示任何错误或例外。我已经知道MySQL中的<> = !=

9 个答案:

答案 0 :(得分:211)

=运算符

的相似性

与常规=运算符一样,会比较两个值,结果为0(不等于)或1(等于);换句话说:'a' <=> 'b'会产生0'a' <=> 'a'会产生1

=运算符

的区别

与常规=运算符不同,NULL的值没有特殊含义,因此它永远不会产生NULL作为可能的结果;所以:'a' <=> NULL产生0NULL <=> NULL产生1

=相反,'a' = NULL产生NULL甚至NULL = NULL产生NULL;顺便说一下,MySQL中的几乎所有运算符和函数都以这种方式工作,因为与NULL的比较基本上是未定义的。

有用

当两个操作数都包含NULL且两列之间需要一致的比较结果时,这非常有用。

另一个用例是使用预准备语句,例如:

... WHERE col_a <=> ? ...

此处,占位符可以是标量值,也可以是NULL,而无需更改查询的任何内容。

相关运营商

除了<=>之外,还有另外两个可用于与NULL进行比较的运算符,即IS NULLIS 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)

NULL-safe equal to operator

&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;

还有一个点 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 operatora <=> 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)

来自MySQL documentation

  

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