我应该在T-SQL中使用!=或<>表示不相等吗?


800

我已经看到了SQL同时使用!=,并<>不等于。首选语法是什么,为什么?

我喜欢!=,因为<>让我想起Visual Basic



代码的可移植性。如果ANSI SQL可以轻松满足您的要求,那么最好使用它。您可以在所有数据库中使用相同的代码。例如。想要使用示例代码来说明基本SQL的SQL书作者。
2013年

1
我想添加一个示例,其中只有ANSI SQL代码可能会出现问题-标准SQL支持NULLS FIRST和NULLS LAST选项来控制NULL的排序方式,但T-SQL不支持此选项。
Steam

无需重新打开。标记的问题是重复的问题,只是再扩展了一个选项NOT (A = B)
TLama

@Steam,您应该指定您确切指的是哪个年份的ansi sql。其中一些版本甚至要求您指定电平兼容性或标准的确切部分。他们中的哪个介绍了NULLS FIRST和NULLS LAST?
盖尔曼2015年

Answers:


539

从技术上讲,如果您使用的是SQL Server AKA T-SQL,它们的功能相同。如果您在存储过程中使用它,则没有性能上的理由要使用另一个。然后归结为个人喜好。我更喜欢使用<>,因为它符合ANSI。

您可以在...找到指向各种ANSI标准的链接。

http://en.wikipedia.org/wiki/SQL


41
我一直首选使用!=它,因为它在我使用过的每种受C影响的语言中都存在,并且因为Python文档说:“形式<>!=等价物;为了与C一致,!=是首选;!=下面提到<>的地方也被接受。该<>拼写被认为是过时的“。但是SQL不是Python!
伊恩·塞缪尔·麦克莱恩

24
我喜欢使用<>,因为它使我想起了XML。但是SQL不是XML!
罗伯·格兰特

32
是; 微软自己的建议使用<>!=专门为ANSI合规性,例如,在微软出版社培训套件70-461考试,“查询的Microsoft SQL Server”,他们说:“至于何时选择标准形式的例子,T-SQL支持两个“不等于“运算符:<>和!=。前者是标准的,而后者则不是。这种情况应该很简单:选择标准的!”
马特·吉布森

10
我喜欢<>,因为它更容易输入。
user2023861

731

大多数数据库都支持!=(流行的编程语言)和<>(ANSI)。

同时支持!=和的数据库<>

支持ANSI标准算,数据库独家

  • IBM DB2 UDB 9.5: <>
  • Microsoft Access 2010: <>

Django ORM查询映射到NOT (a = b)而不是(a <> b)(a != b)。内部是否相同?
用户

7
@buffer,它们在逻辑上是相同的,也就是说,它将匹配或排除相同的行集。但是特定的RDBMS品牌是否对其进行相同的优化取决于实现。话虽如此,如果数据库品牌之间存在差异,我会感到惊讶。
比尔·卡文

旁注:C#中的LINQ必须使用!=
Tom Stickel,2016年

!=受IBM DB2 LUW 10.5+的支持
Cristi

10
C#中的@TomStickel LINQ不是SQL。
Craig

109

'<>'来自SQL-92标准,并且'!='专有的 T-SQL运算符。它在其他数据库中也可用,但是由于它不是标准的,因此您必须视具体情况而定。

在大多数情况下,您会知道要连接到哪个数据库,因此这并不是真正的问题。最糟糕的是,您可能必须搜索并替换SQL。


我已经看到MySQL的SQL中使用它,以及
鲍勃看门人

3
我们可以继续将这种对标准语言的广泛扩展称为专有语言吗?在这一点上,似乎应该将标准更新为要求,或者至少允许两种语法。
JohanBoulé'17

3
@JohanBoule很好,有一个针对SQL的书面标准,据我所知!=,它不是其中的一部分。即使出于所有实际目的,它都是事实上的标准,我们也不应混淆什么是标准功能,哪些不是标准功能。
亚当·拉瑟克



24

那是SQL Server特有的。当然,他询问了有关SQL Server的问题,但是您可以找到ANSI规范参考,以确保对于那些想知道这类事情的人来说,它是否可以保证可移植吗?
Joel Coehoorn

6
@Joel Coehoorn,如果您非常移植T-SQL代码“ <>”和“!=“,那么您的担心就最少了!!
KM。

1
移植不是问题,而是作为开发人员的时候,您需要在环境之间来回切换。一致性很好。
Mark Ransom

20

看来微软自己更喜欢<>!=证明其表约束。我个人更喜欢使用,!=因为我清楚地将其读为“不等于”,但是如果您[field1 != field2]将其输入并另存为要素,则下次查询时,它将显示为[field1 <> field2]。这告诉我,正确的方法是<>


15

!=尽管不是非ANSI,但更符合SQL作为可读语言的真正精神。它尖叫不相等。 <>说这对我来说(小于,大于)很奇怪。我知道它的意图是小于或大于因此不相等,但这是说一个很简单的事情的一种非常复杂的方式。

我只是不得不进行一些长时间的SQL查询,并将它们精心地放置到XML文件中,这是出于一系列我不愿讨论的愚蠢的原因。

可以说XML完全没有问题<>,我不得不将它们更改为XML !=并检查自己,然后才进行严格的破坏。


6
为什么不只是CDATA呢?当查询包含XML时会发生什么?
Janus Troelsen

12

您可以在T-SQL中使用任何您喜欢的东西。该文档说,它们的功能相同。我更喜欢!=,因为它在我(基于C / C ++ / C#的)思想上读作“不相等”,但是数据库专家似乎更喜欢<>


10

据我了解,由于C语言语法!=是Unix的传统,因此SQL Server 中使用C语法(早在Sybase SQL Server时代,在Microsoft SQL Server 6.5之前)。


7

一种替代方法是使用NULLIF运算符,<>或者!=如果两个参数在Microsoft Docs中等于NULLIF,则返回NULL 。所以我相信WHERE子句可以修改<>!=如下:

NULLIF(arg1, arg2) IS NOT NULL

正如我发现的那样,在某些情况下使用<>!=不适用于日期。因此,使用上面的表达式确实很有必要。


6
我不确定该函数是否<>在所有极端情况下都可以正常使用索引。此外,可读性肯定会差很多……
Lukas Eder 2014年

正如我在答案中提到的那样,这对我在2014年的日期字段很有用。不知道该条款/条件是什么限制了其他答案,但查看一些支持意见,这似乎也在帮助其他人。
jitendrapurohit


-6

它们都在T-SQL中被接受。但是,似乎使用<>的速度比快得多!=。我只是运行了一个使用的复杂查询,!=平均大约需要16秒才能运行。我将其更改为<>,查询现在平均需要大约4秒钟才能运行。这是一个巨大的进步!


20
如果在SQL Server中一个接一个地运行两个类似的查询,则它很可能已将数据缓存在内存中并针对类似的查询进行了优化。如果以相反的顺序进行操作,则可能会发现相反的结果!
codemonkey 2014年

2
这也是错误的,他们不会有两个功能完全相同的运算符,而一个运算符的“原因”则较慢。关于同一查询为何会产生不同执行时间的因素很多。
Elliot Chance

-11

尽管它们的功能相同,但!=表示“不等于”,而<>表示大于和小于存储的值。

考虑>=<=,当将您的索引纳入查询条件时,这将很有意义...<>在某些情况下(具有正确的索引)运行速度会更快,但在其他情况下(无索引),它们将运行相同。

这也取决于您的数据库系统如何读取值!=<>。数据库提供程序可能只是对其进行快捷方式设置并使它们的功能相同,所以这两种方式都没有任何好处。如上面显示的那样阅读。


3
您的陈述是否有任何支持参考?在PostgreSQLOracleMySQL中,这两个运算符似乎完全相同。
GhostGambler 2014年

8
这是完全错误的,当您将这些字符组合在一起时,您看起来可能像“大于或小于存储的值”,但对于词法分析器而言,这只是表示令牌的另一种方式。
Elliot Chance

缺少相关资源!
mostafa8026
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.