我正在研究一个前开发人员写的代码,在一个查询中显示,
WHERE p.name <=> NULL
<=>在这个查询中是什么意思? 它是等于 =的东西吗? 还是一个语法错误?
<=>
=
但它没有显示任何错误或异常。我已经知道 MySQL中的 <> = !=。
<>
!=
是 < = > NULL-safe equal to operator
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 如果一个操作数为空。
编辑:- (虽然很晚才添加一个重要的边注提到 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保险箱等于接线员。
NULL
与常规的 =操作符一样,比较两个值,结果是 0(不相等)或 1(相等) ; 换句话说: 'a' <=> 'b'产生 0,'a' <=> 'a'产生 1。
0
1
'a' <=> 'b'
'a' <=> 'a'
与常规的 =操作符不同,NULL的值没有特殊的含义,因此它永远不会产生 NULL作为可能的结果; 因此: 'a' <=> NULL产生 0,NULL <=> NULL产生 1。
'a' <=> NULL
NULL <=> NULL
当两个操作数都可能包含 NULL并且您需要两列之间的一致比较结果时,这种方法非常有用。
另一个用例是准备好的语句,例如:
... WHERE col_a <=> ? ...
在这里,占位符可以是标量值,也可以是 NULL,而不必更改查询的任何内容。
除了 <=>之外,还有另外两个操作符可以用来与 NULL进行比较,即 IS NULL和 IS NOT NULL; 它们是 ANSI 标准的一部分,因此支持其他数据库,不像 <=>是 MySQL 专用的。
IS NULL
IS NOT NULL
你可以把它们看作是 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操作符。它的行为最好通过真相表来解释:
is not distinct from
* 注意,与其他操作符不同,这个操作符永远不会返回未知(由 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=operand2和 operand1<=>operand2之间的区别在于,当两个操作数中的任何一个为空时,前者将返回 null。 但是后者返回 1或 0取决于操作数的值,即使为空。
operand1=operand2
operand1<=>operand2
null
作为对比:
select null = null
select null <=> null
select null = 'abc'
select null <=> 'abc'