在 MySQL 中,这个操作符 < = > 是什么?

我正在研究一个前开发人员写的代码,在一个查询中显示,

WHERE p.name <=> NULL

<=>在这个查询中是什么意思? 它是等于 =的东西吗? 还是一个语法错误?

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

64103 次浏览

< = > NULL-safe equal to operator

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

看这里的 文件

样本:

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

SELECT *
FROM table
WHERE YourColumn IS NOT NULL;

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

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

它是 NULL-Safe 等于操作符。请选中 描述

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。如果要检查值是否为空。

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

例句

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

这是 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

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

手册:-

<=>执行与 = 运算符类似的相等比较,但返回 如果两个操作数都是 NULL,则使用1而不是 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。NOT 应用于 < = > 运算符与 IS NOT NULL 相同。

例子:-

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

<=>是 MySQL 的空安全“等于”操作符:

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

DR

NULL保险箱等于接线员。

与常规的 =操作符一样,比较两个值,结果是 0(不相等)或 1(相等) ; 换句话说: 'a' <=> 'b'产生 0'a' <=> 'a'产生 1

与常规的 =操作符不同,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

<=>就是 NULL 安全等于运算符。它等效于标准的 SQLis not distinct from操作符。它的行为最好通过真相表来解释:

B A < = > b
1 0 假的
1 1 没错
1 无效 错误 *
无效 无效 真实 *

* 注意,与其他操作符不同,这个操作符永远不会返回未知(由 null 表示)。

来自 MySQL 文档:

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

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 |

operand1=operand2operand1<=>operand2之间的区别在于,当两个操作数中的任何一个为空时,前者将返回 null。 但是后者返回 10取决于操作数的值,即使为空。

作为对比:

  • 返回 select null = null,返回 null; 但是返回 select null <=> null,返回 1
  • 返回 select null = 'abc',返回 null; 但是返回 select null <=> 'abc',返回 0