MySQL中的这个操作符是什么?

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

WHERE p.name <=> NULL 

这个查询中<=>是什么意思? 这是否等于= ? 或者是一个语法错误?

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

=运算符相似

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

=运算符的区别

与regular =运算符不同, 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 

<=> 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 <=> NULLWHERE 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 |