SQL中NOT
和!=
运算符之间有什么区别?我无法理解其中的区别。我猜他们是一样的。
答案 0 :(得分:6)
NOT
否定以下条件,因此可以与各种运算符一起使用。 !=
是<>
运算符的non-standard alternative,表示&#34;不等于&#34;。
e.g。
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)
与{{1}相同}}。类似地,您可以使用NOT来否定相等运算符a = b
与NOT (a = b)
答案 1 :(得分:2)
!=
是一个二元运算符,如果它的两个参数彼此不相等则返回true。
NOT
是一个一元运算符,它反转它的参数,一个布尔表达式。
你觉得这些是一样的吗?
例如,当a < 10
是小于10的任何值时,此表达式a
为真。此条件可以取消:NOT a < 10
。在相反的情况下,即在不小于10的情况下,否定这种情况就是正确的。它与a >= 10
相同。
当a != 10
是小于10的任何值或任何大于10的值时,表达式a
为真。这与使用NOT
否定的条件完全不同。
答案 2 :(得分:0)
这个问题实际上比人们认为的要有意义得多。
首先,原始的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
为NULL的情况,布尔表达式b = 2为NULL。但是,当布尔表达式为NULL时,它将被视为 false 或 not true 。而且,当您使用NOT
取反时,表达式的布尔值保持为NULL,因此仍然 not 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(...)
。
如果布尔运算符NOT
和MAYBE
而不是CANNOT
会容易得多。因此,您可以在实际情况之前编写WHERE MAYBE b = 2
或WHERE CANNOT b = 2
来代替一堆IS NULL测试的复杂OR组合。
答案 3 :(得分:-2)
NOT运算符和!=几乎都有类似的用途。两者都用在sql查询的Where子句中。
NOT运算符在特定条件不为真时显示记录。 例如:
SELECT * FROM Employees
WHERE NOT Country='Germany'
将为您提供除德国以外国家/地区的所有员工的记录。
!=
运算符类似地检查两个操作数的值是否相等,如果值不相等则条件变为真。
示例:
SELECT * FROM Employees
WHERE Country!='Germany'
将为您提供包含德国以外国家/地区的国家/地区列的所有行。