MySQL中的这个操作符是什么?
我正在编写由以前的开发人员编写的代码,并在查询中说,
WHERE p.name <=> NULL
这个查询中<=>
是什么意思? 这是否等于=
? 或者是一个语法错误?
但没有显示任何错误或例外。 我已经知道在MySQL中<>
= !=
与=
运算符相似
像常规=
运算符一样,比较两个值,结果为0
(不等于)或1
(等于); 换句话说: 'a' <=> 'b'
产生0
, 'a' <=> 'a'
产生1
。
与=
运算符的区别
与regular =
运算符不同, 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
是<=> NULL-safe equal to operator
该运算符与=运算符执行相等比较,但如果两个操作数都为NULL,则返回1而不是NULL;如果一个操作数为NULL,则返回0而不是NULL。
在这里看到的文件
示例:
你应该使用IS NOT NULL。 (比较运算符=和<>都在expression式的任一侧给出了UNKNOWN NULL)。
SELECT * FROM table WHERE YourColumn IS NOT NULL;
也可以否定null安全等号运算符,但这不是标准的SQL。
SELECT * FROM table WHERE NOT (YourColumn <=> NULL);
它是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
编辑:( 虽然很迟才添加一个重要的旁注,提到NOT <=> )
在旁注: –
不是<=>
还有一点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
<=>
是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
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
<=>
是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
对不起,我找不到一个很好的理由来使用这个运算符,而不是AND/OR IS (NOT) NULL
。 你的例子,例如, WHERE p.name <=> NULL
与WHERE p.name IS NULL
相同。
从MySQL文档 :
NULL安全相等。 该运算符与=运算符执行相等比较,但如果两个操作数都为NULL,则返回1而不是NULL;如果一个操作数为NULL,则返回0而不是NULL。
使用<=>
运算符的例子是:
SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
哪个会返回:
1, 1, 0
regular =
运算符的一个例子是:
SELECT 1 = 1, NULL = NULL, 1 = NULL;
哪个会返回:
1, NULL, NULL
<=>
运算符与=
运算符非常相似,只是<=>
不会返回NULL
它是NULL – 安全等于操作符。 检查描述 。
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 |