Widziałem, SQL
że używa obu !=
i <>
dla nie równych . Jaka jest preferowana składnia i dlaczego?
Lubię !=
, bo <>
mi przypomina Visual Basic
.
NOT (A = B)
.
Widziałem, SQL
że używa obu !=
i <>
dla nie równych . Jaka jest preferowana składnia i dlaczego?
Lubię !=
, bo <>
mi przypomina Visual Basic
.
NOT (A = B)
.
Odpowiedzi:
Technicznie działają one tak samo, jeśli używasz SQL Server AKA T-SQL. Jeśli używasz go w procedurach przechowywanych, nie ma powodu do wydajności, aby używać jednego nad drugim. Sprowadza się to do osobistych preferencji. Wolę używać <>, ponieważ jest zgodny z ANSI.
Linki do różnych standardów ANSI można znaleźć w ...
!=
ze względu na jego istnienie w każdym używanym przeze mnie języku, a dokumentacja Pythona mówi: „Formy <>
i !=
są równoważne; !=
preferowana jest spójność z C ; tam, gdzie !=
wspomniano poniżej, <>
jest również akceptowane. <>
pisownia jest uważane za przestarzałe.” Ale SQL to nie Python!
<>
w !=
celu zachowania zgodności z ANSI, np. W zestawie szkoleniowym Microsoft Press do egzaminu 70-461 „Zapytanie o Microsoft SQL Server”, mówią „Jako przykład kiedy wybrać standardowy formularz, T-SQL obsługuje dwa„ nie równa się operatorom: <> i! =. Pierwszy jest standardowy, a drugi nie. W tym przypadku powinien być nobrainer: wybierz standardowy!
Większość baz danych obsługuje !=
(popularne języki programowania) i <>
(ANSI).
Bazy danych, które obsługują zarówno !=
a <>
:
!=
i<>
!=
i<>
!=
i<>
!=
i<>
!=
oraz<>
!=
i<>
!=
i<>
!=
i<>
!=
i<>
Bazy danych obsługujące standardowego operatora ANSI, wyłącznie :
NOT (a = b)
zamiast (a <> b)
lub (a != b)
. Czy to samo wewnętrznie?
'<>'
jest z SQL-92 i '!='
jest zastrzeżonym operatorem T-SQL. Jest on dostępny również w innych bazach danych, ale ponieważ nie jest to standard, musisz brać go indywidualnie.
W większości przypadków będziesz wiedział, z którą bazą danych się łączysz, więc to nie jest tak naprawdę problem. W najgorszym wypadku może być konieczne wyszukiwanie i zamiana kodu SQL.
!=
nie jest jego częścią. Chociaż dla wszystkich praktycznych celów jest to standard defacto, nie powinniśmy mylić, jakie są i nie są standardowymi funkcjami.
Standard ANSI SQL definiuje <>
jako operator „nie równy”,
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ( 5.2 <token> and <separator>
)
Nie ma !=
operatora zgodnie ze standardem ANSI / SQL 92.
<>
jest poprawnym SQL zgodnie ze standardem SQL-92.
http://msdn.microsoft.com/en-us/library/aa276846(SQL.80).aspx
Oba są ważne i takie same w odniesieniu do SQL Server ,
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/not-equal-to-transact-sql-exclamation
Wydaje się, że Microsoft sami wolą <>
się !=
czym świadczy w swoich ograniczeń tabeli. Osobiście wolę używać, !=
ponieważ wyraźnie czytam to jako „nie równe”, ale jeśli wprowadzisz [field1 != field2]
i zapiszesz jako constrait, przy następnym zapytaniu pojawi się jako [field1 <> field2]
. To mówi mi, że poprawny sposób to zrobić <>
.
!=
, mimo że nie jest ANSI, jest bardziej w prawdziwym duchu SQL jako czytelnego języka. Wrzaski nie są równe.
<>
mówi, że to dla mnie (mniej niż, więcej niż), co jest po prostu dziwne. Wiem, że intencją jest, aby była mniejsza lub większa niż odtąd nie równa, ale to naprawdę skomplikowany sposób powiedzenia czegoś naprawdę prostego.
Właśnie musiałem wziąć kilka długich zapytań SQL i umieścić je z miłością w pliku XML z wielu głupich powodów, dla których nie będę wchodził.
Wystarczy powiedzieć, że XML wcale nie działa <>
i musiałem je zmienić !=
i sprawdzić się, zanim sfałszowałem się.
W T-SQL możesz używać dowolnych opcji. Dokumentacja mówi, że oba działają w ten sam sposób. Wolę !=
, ponieważ czyta „nie równe” mojemu umysłowi (opartemu na C / C ++ / C #), ale guru bazy danych wydają się preferować <>
.
Jedną alternatywą byłoby użycie operatora NULLIF innego niż <>
lub !=
zwracającego NULL, jeśli dwa argumenty są równe NULLIF w Dokumentach Microsoft . Więc wierzę WHERE mogą być modyfikowane dla <>
i !=
, co następuje:
NULLIF(arg1, arg2) IS NOT NULL
Jak się przekonałem, w niektórych przypadkach używanie <>
i !=
nie działa w przypadku daty. Dlatego użycie powyższego wyrażenia robi to, co potrzebne.
<>
w odniesieniu do użycia indeksu we wszystkich przypadkach narożnych. Poza tym czytelność jest zdecydowanie gorsza ...
Wolałem używać !=
zamiast, <>
ponieważ czasami używam <s></s>
składni do pisania poleceń SQL. Użycie !=
jest bardziej przydatne, aby uniknąć błędów składniowych w tym przypadku.
Oba są akceptowane w T-SQL. Wydaje się jednak, że korzystanie <>
działa znacznie szybciej niż!=
. Właśnie uruchomiłem złożone zapytanie, którego !=
uruchomienie zajęło mi średnio około 16 sekund. Zmieniłem je na, <>
a uruchomienie zapytania zajmuje teraz średnio około 4 sekund. To ogromna poprawa!
Chociaż działają w ten sam sposób, !=
oznaczają dokładnie „nie równy”, a <>
oznaczają większą i mniejszą niż przechowywana wartość.
Zastanów się >=
lub <=
, a to będzie miało sens, gdy uwzględnisz swoje indeksy w zapytaniach ...<>
w niektórych przypadkach będzie działać szybciej (z odpowiednim indeksem), ale w niektórych innych przypadkach (bez indeksu) będą działać tak samo.
Zależy to również od tego, jak system baz danych odczytuje wartości !=
i <>
. Dostawca bazy danych może po prostu skrócić go i sprawić, by działały tak samo, więc nie ma żadnej korzyści w żaden sposób.PostgreSQL i SQL Server nie skracają tego; jest czytany tak, jak pokazano powyżej.