我应该在T-SQL中使用!=还是<>不等于?
我看到SQL使用!=
和<>
不等于 。 什么是首选语法,为什么?
我喜欢!=
,因为<>
让我想起了Visual Basic。
从技术上讲,如果您使用SQL Server AKA T-SQL,则它们的function相同。 如果你在存储过程中使用它,没有性能的理由使用它。 然后归结为个人偏好。 我更喜欢使用<>,因为它符合ANSI标准。
你可以find各种ANSI标准的链接…
大多数数据库支持!=
(stream行编程语言)和<>
(ANSI)。
支持!=
和<>
:
- MySQL 5.1:
!=
和<>
- PostgreSQL 8.3:
!=
和<>
- SQLite:
!=
和<>
- Oracle 10g:
!=
和<>
- Microsoft SQL Server 2000/2005/2008/2012/2016:
!=
和<>
- IBM Informix Dynamic Server 10:
!=
和<>
- InterBase / Firebird:
!=
和<>
- Apache Derby 10.6:
!=
和<>
- Sybase Adaptive Server Enterprise 11.0:
!=
和<>
仅支持ANSI标准操作符的数据库:
- IBM DB2 UDB 9.5:
<>
- Microsoft Access 2010:
<>
'<>'
来自SQL-92标准 , '!='
是专有的 T-SQL操作符。 它也可以在其他数据库中使用,但是由于它不是标准的,所以你必须逐个考虑。
在大多数情况下,你会知道你连接的数据库,所以这不是一个真正的问题。 在最糟糕的情况下,你可能不得不在你的SQL中进行search和replace。
ANSI SQL标准将<>
定义为“不等于”运算符,
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt(5.2 5.2 <token> and <separator>
)
根据ANSI / SQL 92标准没有!=
运算符。
<>
是根据SQL-92标准的有效SQL。
http://msdn.microsoft.com/en-us/library/aa276846(SQL.80).aspx
它们对于SQL Server来说都是有效的,
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/not-equal-to-transact-sql-exclamation
看起来,微软自己喜欢<>
以!=
来certificate他们的表约束。 我个人更喜欢使用!=
因为我清楚地读到“不等于”,但是如果input[field1 != field2]
并保存为constrait,那么下次查询时,它会显示为[field1 <> field2]
。 这对我说,正确的做法是<>
。
你可以在T-SQL中使用你喜欢的任何一个。 文件说,他们都function相同的方式。 我更喜欢!=
,因为它读取“不等于”我(基于C / C ++ / C#)的头脑,但数据库大师似乎更喜欢<>
。
!=
尽pipe不是ANSI,但更像SQL这种可读性语言的精神。 它尖叫不平等。 <>
对我说(小于,大于),这是奇怪的。 我知道它的意图是说要么小于或者大于因此不是平等的,但是说一些非常简单的东西真的很复杂。
我只是需要一些长时间的SQL查询,并把它们深深地放在一个XML文件中,这是因为我不会去做一些愚蠢的事情。
我只想说XML并没有完全解决问题,我不得不将它们改成!=
并在我自己破坏之前检查自己。
我知道C语法!=
在SQL Server中是由于它的Unix遗产(早在Microsoft SQL Server 6.5之前的Sybase SQL Server日子里)。
一种替代方法是使用<>
或!=
以外的NULLIF运算符,如果两个参数在Microsoft Docs中相同, 则返回NULL。 所以我相信WHERE子句可以修改为<>
和!=
,如下所示:
NULLIF(arg1, arg2) IS NOT NULL
正如我发现的那样,在某些情况下,使用<>
和!=
在date中不起作用。 因此,使用上述expression式是必要的。
我更喜欢使用!=
而不是<>
因为有时我使用<s></s>
语法来编写SQL命令。 在这种情况下,使用!=
更方便避免语法错误。
他们都在T-SQL中被接受。 不过,使用<>
似乎比!=
快得多 。 我刚刚运行了一个使用!=
的复杂查询,平均运行时间大约为16秒。 我将它们更改为<>
,现在查询平均需要大约4秒钟才能运行。 这是一个巨大的改善!
虽然它们的function相同,但!=
意味着“不等于”,而<>
意味着大于和小于存储的值。
考虑>=
或者<=
,这在将索引分解为查询时有意义… <>
在某些情况下(使用正确的索引)将运行得更快,但是在其他一些情况下(索引为空)一样。
这也取决于你的数据库系统如何读取值!=
和<>
。 数据库提供者可能只是简单的使它们的function一样,所以没有任何好处。 PostgreSQL和SQL Server不会缩短这个; 它会像上面显示的那样被读取。