繁体   English   中英

SQL 中的 NOT 和 != 运算符有什么区别?

[英]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 = ba != 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(...)中的变量。

如果不是只有布尔运算符MAYBECANNOT而不是NOT ,那就容易多了。 因此,您可以编写WHERE MAYBE b = 2WHERE CANNOT b = 2 ,而不是在实际情况之前编写一堆 IS NULL 测试的复杂 OR 组合。

!=是一个二元运算符,如果它的两个参数不相等则返回 true。

NOT是一个一元运算符,它反转它的参数,一个布尔表达式。

例如,这个表达式: a < 10a是任何小于 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM