[英]What is the difference between NOT and != operators in SQL?
SQL 中的NOT
和!=
运算符有什么区别? 我无法理解其中的区别。 我猜他们是一样的。
NOT
否定以下条件,因此它可以与各种运算符一起使用。 !=
是<>
运算符的非标准替代方法,表示“不等于”。
例如
NOT (a LIKE 'foo%')
NOT ( (a,b) OVERLAPS (x,y) )
NOT (a BETWEEN x AND y)
NOT (a IS NULL)
除了上面的overlaps
算子还可以写成:
a NOT LIKE 'foo%'
a NOT BETWEEN x AND y
a IS NOT NULL
在某些情况下,否定一个完整的表达式可能更容易理解,而不是将其重写为相反的意思。
但是, NOT
可以与<>
一起使用——但这并没有多大意义: NOT (a <> b)
与a = b
相同。 同样,您可以使用 NOT 来否定等式运算符NOT (a = b)
与a <> b
相同
这个问题实际上比人们认为的要有意义得多。
首先,原始的 SQL 不等于运算符是<>
,据我所知,后来才添加了 C 风格的!=
。 我个人总是使用<>
因为!=
对我来说看起来很奇怪,但我是老派。
其次,当然最初的提问者并不是要比较NOT
与!=
,而是比较NOT a = b
与a != b
之间的区别。 直觉上应该有区别,但据我所知,没有。
为了清楚起见,这是一个在 PostgreSQL 上运行的示例会话(在 Oracle 中,您需要更奇怪的东西,例如SELECT ... FROM DUAL UNION ...
等,为简洁起见,我避免使用这些内容):
db=# with tst(a, b) as ( values (1,2), (2,3), (4, null) ) select * from tst;
a | b
---+---
1 | 2
2 | 3
4 |
(3 rows)
db=# with tst(a, b) as ( values (1,2), (2,3), (4, null) ) select * from tst where b = 2;
a | b
---+---
1 | 2
(1 row)
db=# with tst(a, b) as ( values (1,2), (2,3), (4, null) ) select * from tst where b != 2;
a | b
---+---
2 | 3
(1 row)
db=# with tst(a, b) as ( values (1,2), (2,3), (4, null) ) select * from tst where not b = 2;
a | b
---+---
2 | 3
(1 row)
在这里,我们可能认为最后一个查询也应该返回行 (4, NULL)。 但它没有。 在 PostgreSQL 中,我实际上可以进一步检查,如下所示:
db=# with tst(a, b) as ( values (1,2), (2,3), (4, null) ) select *, b = 2 as beq2 from tst;
a | b | beq2
---+---+------
1 | 2 | t
2 | 3 | f
4 | |
(3 rows)
您会看到布尔表达式 b = 2 在b
为 NULL 的情况下为 NULL。 但是,当布尔表达式为 NULL 时,它被视为false ,或者不是 true 。 当你用NOT
否定它时,表达式的布尔值保持为 NULL,因此仍然不是 true 。
不幸的是,除了明确处理 NULL 情况外,我没有其他方法,所以我必须写:
db=# with tst(a, b) as ( values (1,2), (2,3), (4, null) ) select * from tst where b is null or b = 2;
a | b
---+---
1 | 2
4 |
(2 rows)
因此,与其写NOT <Boolean expression>
,不如写成a IS NULL OR b IS NULL OR ... OR z IS NULL OR f(a, b, ..., z)
其中a
, b
, .. ., z
是给定布尔表达式f(...)
中的变量。
如果不是只有布尔运算符MAYBE
和CANNOT
而不是NOT
,那就容易多了。 因此,您可以编写WHERE MAYBE b = 2
或WHERE CANNOT b = 2
,而不是在实际情况之前编写一堆 IS NULL 测试的复杂 OR 组合。
!=
是一个二元运算符,如果它的两个参数不相等则返回 true。
NOT
是一个一元运算符,它反转它的参数,一个布尔表达式。
例如,这个表达式: a < 10
当a
是任何小于 10 的值时为真。这个条件可以被否定: NOT a < 10
。 否定这个条件使得它在相反的情况下成立,即当 a 不小于 10 时。它与a >= 10
相同。
当a
是任何小于 10 或任何大于 10 的值时,表达式a != 10
为真。这与用NOT
否定的条件完全不同。
NOT 运算符和 != 几乎都有类似的用途。两者都用于 sql 查询的 Where 子句。
NOT 运算符在特定条件不成立时显示记录。 例子:
SELECT * FROM Employees
WHERE NOT Country='Germany'
将为您提供与德国以外国家/地区的所有员工的记录。
!=
运算符类似地检查两个操作数的值是否相等,如果值不相等,则条件为真。
例子:
SELECT * FROM Employees
WHERE Country!='Germany'
将为您提供所有国家/地区列中除德国以外的国家/地区的行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.