Должен ли я использовать! = Или <> для не равных в T-SQL?

801

Я видел, SQLчто использует как !=и <>для не равных . Какой синтаксис предпочтителен и почему?

Мне нравится !=, потому что <>напоминает мне о Visual Basic.

Боб Дворник
источник
5
Смотрите также: stackoverflow.com/questions/7884/…
Дина
Переносимость кода. Если ваши требования легко удовлетворяются с помощью ANSI SQL, то лучше использовать его. Вы можете использовать один и тот же код во всех БД. Например. Автор книги по SQL, который хочет проиллюстрировать базовый SQL с помощью примера кода.
Steam
1
Я хотел бы добавить пример, в котором наличие только кода ANSI SQL может быть проблемой - Стандартный SQL поддерживает параметры NULLS FIRST и NULLS LAST для управления сортировкой NULL, но T-SQL не поддерживает эту опцию.
Steam
Там нет необходимости повторного открытия. Отмеченный вопрос является дубликатом, только что расширенным еще одним вариантом NOT (A = B).
TLama
@Steam, вы должны указать, к какой версии ansi sql вы обращаетесь. Некоторые из этих версий даже требуют указания уровня совместимости или точных частей стандарта. Кто из них ввел NULLS FIRST и NULLS LAST?
Герман

Ответы:

539

Технически они работают одинаково, если вы используете SQL Server AKA T-SQL. Если вы используете его в хранимых процедурах, то нет причин для производительности использовать один над другим. Затем все сводится к личным предпочтениям. Я предпочитаю использовать <>, так как это соответствует ANSI.

Вы можете найти ссылки на различные стандарты ANSI на ...

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

DBAndrew
источник
41
Я всегда предпочитал использовать его !=из-за его существования в каждом языке, на который влиял С, и потому что в документации Python говорится: «Формы <>и !=эквивалентны; для совместимости с С !=предпочтительнее; там, где !=указано ниже <>, также принимается. <>написание считается устаревшим «. Но SQL это не Python!
Иэн Самуэль Маклин, старейшина
24
Мне нравится использовать <>, потому что это напоминает мне XML. Но SQL это не XML!
Роб Грант
32
Да; Сами Microsoft рекомендуют использовать <>более !=специально для соответствия ANSI, например, в учебном наборе Microsoft Press для экзамена 70-461 «Запрос Microsoft SQL Server», они говорят: «В качестве примера выбора стандартной формы T-SQL поддерживает два», а не равно «операторы: <> и! =. Первый является стандартным, а второй нет. Этот случай должен быть nobrainer: перейти на стандартный!"
Мэтт Гибсон
10
Мне нравится <>, потому что это легче печатать.
user2023861
731

Поддержка большинства баз данных !=(популярные языки программирования) и <>(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: <>
Билл Карвин
источник
Запрос Django ORM отображается NOT (a = b)вместо (a <> b)или (a != b). Это то же самое внутри?
пользователь
7
@buffer, они логически одинаковы, то есть соответствуют или исключают один и тот же набор строк. Но то, оптимизирует ли это конкретный бренд СУБД, зависит от реализации. Тем не менее, я был бы удивлен, если бы были какие-либо различия между брендами базы данных.
Билл Карвин
примечание: LINQ в C # вы должны использовать! =
Tom Stickel
! = поддерживается IBM DB2 LUW 10.5+
Кристи С.
10
@TomStickel LINQ в C # не является SQL.
Крейг
109

'<>'это от стандарта SQL-92 и '!='является собственностью оператора T-SQL. Он доступен и в других базах данных, но, поскольку он не является стандартным, вы должны использовать его в каждом конкретном случае.

В большинстве случаев вы будете знать, к какой базе данных вы подключаетесь, поэтому это не проблема. В худшем случае вам может потребоваться выполнить поиск и замену в вашем SQL.

Адам Лассек
источник
Я видел, как MySQL SQL использует его также
Боб The Janitor
3
Можем ли мы продолжать называть такое широко распространенное расширение стандартного языка проприетарным ? На данный момент кажется, что стандарт должен быть обновлен, чтобы требовать или, по крайней мере, разрешить оба синтаксиса.
Йохан Буле
3
@JohanBoule хорошо, есть письменный стандарт для SQL, и, насколько мне известно !=, не является его частью. Несмотря на то, что для всех практических целей это стандарт де-факто, мы не должны путать то, что является и не является стандартными функциями.
Адам Лассек
24

Они оба действительны и одинаковы по отношению к SQL Server ,

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/not-equal-to-transact-sql-exclamation

madcolor
источник
Это специфично для SQL Server. Конечно, он спрашивает о SQL Server, но можете ли вы найти ссылку на спецификацию ANSI, чтобы убедиться, что она будет переносимой для тех из нас, кому нравится знать подобные вещи?
Джоэл Коухорн
6
@Joel Coehoorn, если вы портируете свой код T-SQL на «<>» и «! =», Вы будете меньше всего беспокоиться !!
КМ.
1
Портирование не является проблемой - это когда вы, как разработчик, должны переходить от одной среды к другой. Последовательность это хорошо.
Марк Рэнсом
20

Похоже , что Microsoft сами предпочитают , <>чтобы о !=чем свидетельствует их ограничений таблицы. Лично я предпочитаю использовать, !=потому что я чётко читаю это как «не равное», но если вы введете [field1 != field2]и сохраните его как ограничение, при следующем запросе оно будет отображаться как [field1 <> field2]. Это говорит мне, что правильный способ сделать это <>.

рукав моря
источник
15

!=Несмотря на то, что он не является ANSI, он больше соответствует истинному духу SQL как читаемого языка. Это крики не равны. <>говорит, что это для меня (меньше, больше, чем), что просто странно. Я знаю, что намерение состоит в том, что оно меньше или больше, чем, следовательно, не равно, но это действительно сложный способ сказать что-то действительно простое.

Мне просто нужно было взять несколько длинных SQL-запросов и с любовью поместить их в XML-файл по целой куче глупых причин, в которые я не буду вдаваться.

Достаточно сказать, что с XML не <>все в порядке, и мне пришлось поменять их !=и проверить себя, прежде чем я сломал себя.

Толстый Альберт
источник
6
почему не просто CDATA это? что происходит, когда ваш запрос содержит XML?
Янус Троелсен
12

Вы можете использовать то, что вам нравится в T-SQL. Документация говорит, что они оба функционируют одинаково. Я предпочитаю !=, потому что он читает «не равно» моему (на основе C / C ++ / C #), но гуру баз данных, похоже, предпочитают <>.

Стив
источник
10

Я понимаю, что синтаксис C !=находится в SQL Server из-за его наследия Unix (еще во времена Sybase SQL Server, до Microsoft SQL Server 6.5).

Карл
источник
7

Одной из альтернатив будет использование оператора NULLIF, отличного от <>или !=возвращающего NULL, если два аргумента равны NULLIF в документах Microsoft . Поэтому я считаю, что предложение WHERE может быть изменено для <>и !=следующим образом:

NULLIF(arg1, arg2) IS NOT NULL

Как я обнаружил, использование <>и !=не работает для даты в некоторых случаях. Следовательно, использование приведенного выше выражения делает необходимым.

jitendrapurohit
источник
6
Я не уверен, что эта функция будет работать так же хорошо, как <>использование индекса во всех ключевых случаях. Кроме того, читаемость, безусловно, намного хуже ...
Лукас Эдер
Как я упоминал в ответе, это сработало для меня в полях дат в 2014 году. Не уверен, каково было условие / условие, которое ограничивало другие ответы, но, глядя на некоторые возражения, это, похоже, помогает и другим.
jitendrapurohit
1

Я предпочел использовать !=вместо, <>потому что иногда я использую <s></s>синтаксис для написания команд SQL. Использование !=более удобно, чтобы избежать синтаксических ошибок в этом случае.

Андреа Антонангели
источник
-6

Они оба приняты в T-SQL. Тем не менее, кажется, что использование <>работает намного быстрее, чем!= . Я только что запустил сложный запрос, который использовался !=, и мне потребовалось в среднем около 16 секунд. Я изменил их на, <>и теперь выполнение запроса в среднем занимает около 4 секунд. Это огромное улучшение!

Гамлет Хавьер
источник
20
Если вы выполняете два одинаковых запроса один за другим в SQL Server, он, вероятно, кэширует данные в памяти и оптимизируется для похожих запросов. Если вы сделали это в обратном порядке, вы можете найти противоположный результат!
codemonkey
2
Это также неправильно, у них не было бы двух операторов, которые функционировали бы точно так же, и один был медленнее «просто потому что». Есть много факторов, объясняющих, почему один и тот же запрос будет производить разное время выполнения.
Эллиот Шанс
-11

Хотя они функционируют одинаково, !=означает точно «не равно», а <>значит больше и меньше сохраненного значения.

Примите во внимание >=или <=, и это будет иметь смысл, когда факторинг ваших индексов для запросов ... <>будет выполняться быстрее в некоторых случаях (с правильным индексом), но в некоторых других случаях (без индекса) они будут выполняться точно так же.

Это также зависит от того, как ваша система баз данных считывает значения !=и <>. Поставщик базы данных может просто сократить его и заставить их функционировать одинаково, так что в любом случае это не принесет никакой пользы. PostgreSQL и SQL Server не сокращают это; это читается так, как кажется выше.

Кевин Кинчен
источник
3
Есть ли у вас какие-либо вспомогательные ссылки для вашего заявления? Кажется, что оба оператора одинаковы в PostgreSQL , Oracle и MySQL .
GhostGambler
8
Это совершенно неправильно, для вас это может выглядеть как «больше и меньше, чем сохраненное значение», когда вы комбинируете эти символы в своем уме, но для лексера это просто еще один способ представления токена.
Эллиот Шанс
Отсутствие соответствующего ресурса!
mostafa8026