这个运算符<=>在MySQL中是什么?

zzl*_*ani 154 mysql sql operators spaceship-operator

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

WHERE p.name <=> NULL
Run Code Online (Sandbox Code Playgroud)

<=>这个查询意味着什么?它等于=什么?或者是语法错误?

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

Ja͢*_*͢ck 223

=运营商的相似性

与常规=运算符一样,比较两个值,结果是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 <=> ? ...
Run Code Online (Sandbox Code Playgroud)

这里,占位符可以是标量值,也可以NULL不必更改查询的任何内容.

相关运营商

此外<=>还有可以用来比较其他两家运营商NULL,分别是IS NULLIS NOT NULL; 它们是ANSI标准的一部分,因此支持其他数据库,这与<=>MySQL特定的不同.

您可以将它们视为MySQL的特殊化<=>:

'a' IS NULL     ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
Run Code Online (Sandbox Code Playgroud)

基于此,您的特定查询(片段)可以转换为更可移植的:

WHERE p.name IS NULL
Run Code Online (Sandbox Code Playgroud)

  • @zzlalani一点也不; `<=>`需要两个操作数,而`IS(NOT)NULL`只需要一个;**大**差异......在这方面它和`=`本身一样有用. (15认同)
  • @zzlalani`IS NULL`和`IS NOT NULL`在SQL标准中.`<=>`是MySQL特定的扩展. (12认同)
  • 所以,就像``不同于'运算符一样.很想知道MySQL是否可以使用索引... (5认同)
  • @Pacerier否,`a &lt;=&gt; b`的倒数是`NOT(a &lt;=&gt; b)`。 (3认同)
  • 所以这意味着没有区别?这个`<=>`有点无用吗?对? (2认同)
  • @zzlalani,太空船操作员**实际上非常有用**。在“常规”编程语言和数学中,它与`=`一样有用。“ a = b”要么是“ true”,要么是“ false”,除了在SQL领域,他们设法洗刷了[population](http://goo.gl/mzihcp)那里的人也可以是“ null”,并且其他所有人都没有任何意义。的确,如果`null == null`给你除了`true`以外的东西,那么Java,C#,Javascript,PHP等整个领域都会反抗。甚至[像Javascript一样错误](http://goo.gl/rM6e0f)都知道`undefined == undefined` =`true`。 (2认同)

Dri*_*eña 55

<=> NULL-safe equal to operator

此运算符执行与=运算符类似的相等比较,但如果两个操作数均为NULL,则返回1而不是NULL;如果一个操作数为NULL,则返回0而不是NULL.

请参阅此处获取文档

样品:

你应该使用IS NOT NULL.(比较运算符=和<>都在表达式的任一侧为UNKNOWN提供NULL.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

也可以否定null安全等式运算符,但这不是标准SQL.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);
Run Code Online (Sandbox Code Playgroud)

  • 更正:`&lt;=&gt;` 应该被称为 [equals operator](http://stackoverflow.com/questions/21927117/what-is-this-operator-in-mysql#comment47483870_21928508) 并且 `=` 是 `NULL ` 不安全等于运算符。 (2认同)

Rah*_*thi 24

它是NULL安全等于运算符

<=>运算符用于将NULL值与字段进行比较.如果normal =(equals)如果其中一个比较值为NULL,则运算符返回NULL.使用<=>运算符返回true或false.<=>运算符与IS NULL相同.

从手册: -

<=> 执行与=运算符相等的相等比较,但如果两个操作数均为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
Run Code Online (Sandbox Code Playgroud)

编辑: - (虽然很晚添加一个重要侧面说明一提不<=>以及)

在旁注: -

不是<=>

还有一点NOT <=>用于将NULL值与字段进行比较.如果正常!=或<>(不等于)如果其中一个比较值为NULL,则运算符返回NULL.如果未应用于<=>运算符,则返回true或false.不适用于<=>运算符与IS NOT NULL相同.

例:-

SELECT NULL != NULL,         //--Result is NULL
   NOT NULL <=> NULL,        //--Result is 0
   NULL IS NOT NULL;         //--Result is 0
Run Code Online (Sandbox Code Playgroud)


eli*_*ide 18

<=>是MySQL的零安全"等于"运算符. 从手册:

NULL安全相等.此运算符执行与=运算符类似的相等比较,但如果两个操作数均为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
Run Code Online (Sandbox Code Playgroud)


Dim*_*rab 11

NULL安全相等.此运算符执行与=运算符类似的相等比较,但如果两个操作数均为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
Run Code Online (Sandbox Code Playgroud)

它的意义:

将NULL值与非NULL值进行比较时,您将获得NULL.如果要检查值是否为null.

Equality运算符(<=>)将NULL视为正常值,因此如果两个值都为NULL,则返回1(非NULL),如果其中一个值为NULL,则返回0(非NULL):

例如

 SELECT NULL <=> NULL -- 1
 SELECT TRUE <=> TRUE -- 1
 SELECT col1 <=> col2 FROM myTable
Run Code Online (Sandbox Code Playgroud)


Sal*_*n A 10

<=>NULL安全的等于运算符.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
Run Code Online (Sandbox Code Playgroud)

抱歉,我找不到使用此运算符的一个很好的理由而不是AND/OR IS (NOT) NULL.例如,您的示例WHERE p.name <=> NULLWHERE p.name IS NULL.


Joj*_*dmo 9

MySQL文档:

NULL安全相等.此运算符执行与=运算符类似的相等比较,但如果两个操作数均为NULL,则返回1而不是NULL;如果一个操作数为NULL,则返回0而不是NULL.

使用<=>运算符的示例是:

SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
Run Code Online (Sandbox Code Playgroud)

哪个会回归:

1, 1, 0
Run Code Online (Sandbox Code Playgroud)

常规=运营商的一个例子是:

SELECT 1 = 1, NULL = NULL, 1 = NULL;
Run Code Online (Sandbox Code Playgroud)

哪个会回归:

1, NULL, NULL
Run Code Online (Sandbox Code Playgroud)

<=>操作是非常相似的=操作,除了<=>将永远不会返回NULL


Mus*_*irl 5

它是NULL - 安全等于运算符.检查说明.