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


163

我正在处理以前的开发人员编写的代码,并在查询中说:

WHERE p.name <=> NULL

是什么 <=>这个查询是意思?等于=吗?还是语法错误?

但是它没有显示任何错误或异常。我已经知道<>= !=MySQL的


19
spaceship运营商
莫哈全能的骆驼

4
@ Mhd.Tahawi,我们需要一个Google,该Google允许我们直接为运营商使用Google。
Pacerier

@Pacerier-我在5年前的Symbolhound.com上发现了这个问题(如果有更好的选择,请问不知道)
Andrew

Answers:


239

TL; DR

这是NULL安全的相等运算符。

像常规=运算符一样,将两个值进行比较,结果为0(不相等)或1(相等);换句话说:'a' <=> 'b'收益率0'a' <=> 'a'收益率1

与常规=运算符不同,of的值NULL没有特殊含义,因此它永远不会产生NULL可能的结果。因此:'a' <=> NULL收益率0NULL <=> NULL收益率1

用处

当两个操作数都可能包含时,这可能会很有用 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

支持

SQL:2003标准为此引入了一个谓词,其谓词与MySQL的<=>运算符完全一样,其形式如下:

IS [NOT] DISTINCT FROM 

普遍支持以下内容,但相对复杂:

CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
     THEN 1
     ELSE 0
END = 1

2
那就意味着没有区别吗?这<=>是一个无用的运算符?对?
zzlalani 2014年

16
@zzlalani一点也不;<=>取两个操作数,而IS (NOT) NULL只取一个;很大的不同... =在这方面,它和它自己一样有用。
杰克

12
@zzlalani IS NULLIS NOT NULL在SQL标准中。<=>是MySQL特定的扩展。
丹尼尔·丹妮斯2014年

5
因此,像is not distinct from操作员一样。想知道MySQL是否可以在该索引上使用索引...
Denis de Bernardy 2014年

3
@Pacerier不,逆a <=> bIS NOT(a <=> b)
杰克

57

<=> NULL-safe equal to operator

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

请参阅此处的文档

样品:

您应该使用IS NOT NULL。(比较运算符=和<>都在表达式的两边都给UNKNOWN带NULL。)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

也可以否定空安全相等运算符,但这不是标准的SQL。

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

1
更正:<=>应该称为equals运算符,并且=NULL不安全的equals运算符。
Pacerier,2015年

26

它是NULL安全等于运算符

<=>运算符用于将NULL值与字段进行比较。如果normal =(等于),如果比较值之一为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

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

附带说明:-

不是<=>

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

例:-

SELECT NULL != NULL,         //--Result is NULL
   NOT NULL <=> NULL,        //--Result is 0
   NULL IS NOT NULL;         //--Result is 0

1
NOT <=>不是运算符,而是NOT应用于的结果op1 <=> op2
杰克

@杰克:-是的,你是正确的。更新了答案!补充一点,以便提出要点:)
Rahul Tripathi 2014年

所以我想这里没有<!=>运算符
Kip

@kip:不,不!
Rahul Tripathi 2014年

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

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

意义:

比较NULL值和非NULL值时,将得到NULL。如果要检查值是否为空。

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

例如

 SELECT NULL <=> NULL -- 1
 SELECT TRUE <=> TRUE -- 1
 SELECT col1 <=> col2 FROM myTable

10

<=>NULL安全的equal运算符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


9

MySQL文档

NULL安全等于。该运算符执行等于运算符的相等比较,但是如果两个操作数均为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



1
mysql> SELECT * FROM t JOIN t2 WHERE t2.ids = t.ids;
+----+------+----+------+
| id | ids  | id | ids  |
+----+------+----+------+
|  1 |    1 |  1 |    1 |
|  2 |    2 |  2 |    2 |
|  5 |    6 |  5 |    6 |
|  6 |    7 |  6 |    7 |
+----+------+----+------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM t JOIN t2 WHERE t2.ids <=> t.ids;
+----+------+----+------+
| id | ids  | id | ids  |
+----+------+----+------+
|  1 |    1 |  1 |    1 |
|  2 |    2 |  2 |    2 |
|  3 | NULL |  3 | NULL |
|  4 | NULL |  3 | NULL |
|  3 | NULL |  4 | NULL |
|  4 | NULL |  4 | NULL |
|  5 |    6 |  5 |    6 |
|  6 |    7 |  6 |    7 |
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.