Ich habe gesehen, SQL
dass beide !=
und <>
für nicht gleich verwendet . Was ist die bevorzugte Syntax und warum?
Ich mag !=
, weil <>
mich daran erinnert Visual Basic
.
NOT (A = B)
.
Ich habe gesehen, SQL
dass beide !=
und <>
für nicht gleich verwendet . Was ist die bevorzugte Syntax und warum?
Ich mag !=
, weil <>
mich daran erinnert Visual Basic
.
NOT (A = B)
.
Antworten:
Technisch funktionieren sie gleich, wenn Sie SQL Server AKA T-SQL verwenden. Wenn Sie es in gespeicherten Prozeduren verwenden, gibt es keinen Leistungsgrund, es übereinander zu verwenden. Es kommt dann auf die persönlichen Vorlieben an. Ich bevorzuge die Verwendung von <>, da es ANSI-kompatibel ist.
Links zu den verschiedenen ANSI-Standards finden Sie unter ...
!=
weil es in jeder von mir verwendeten C-beeinflussten Sprache vorhanden ist und weil in der Python-Dokumentation Folgendes steht : "Die Formen <>
und !=
sind gleichwertig; aus Gründen der Konsistenz mit C !=
wird dies bevorzugt; wo !=
unten erwähnt, <>
wird dies ebenfalls akzeptiert." Die <>
Schreibweise gilt als veraltet. " Aber SQL ist nicht Python!
<>
over !=
speziell für die ANSI-Konformität, z. B. im Microsoft Press-Schulungskit für die Prüfung 70-461 "Abfragen von Microsoft SQL Server". "Als Beispiel für die Auswahl des Standardformulars unterstützt T-SQL zwei" nicht gleich "Operatoren: <> und! =. Ersteres ist Standard und letzteres nicht. Dieser Fall sollte ein Nobrainer sein: Entscheide dich für den Standard!"
Die meisten Datenbanken unterstützen !=
(beliebte Programmiersprachen) und <>
(ANSI).
Datenbanken, die sowohl Folgendes unterstützen !=
als auch <>
:
!=
und<>
!=
und<>
!=
und<>
!=
und<>
!=
und<>
!=
und<>
!=
und<>
!=
und<>
!=
und<>
Datenbanken, die ausschließlich den ANSI-Standardoperator unterstützen :
NOT (a = b)
anstelle von (a <> b)
oder zugeordnet (a != b)
. Ist es intern dasselbe?
'<>'
stammt aus dem SQL-92-Standard und '!='
ist ein proprietärer T-SQL-Operator. Es ist auch in anderen Datenbanken verfügbar, aber da es nicht Standard ist, müssen Sie es von Fall zu Fall prüfen.
In den meisten Fällen wissen Sie, mit welcher Datenbank Sie eine Verbindung herstellen, sodass dies kein wirkliches Problem darstellt. Im schlimmsten Fall müssen Sie möglicherweise in Ihrem SQL suchen und ersetzen.
!=
ist dies kein Teil davon. Obwohl es sich für alle praktischen Zwecke um einen Defacto-Standard handelt, sollten wir nicht verwechseln, was Standardfunktionen sind und was nicht.
Der ANSI SQL Standard definiert <>
als den Operator "ungleich".
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ( 5.2 <token> and <separator>
)
Es gibt keinen !=
Operator gemäß dem ANSI / SQL 92-Standard.
<>
ist das gültige SQL gemäß dem SQL-92-Standard.
http://msdn.microsoft.com/en-us/library/aa276846(SQL.80).aspx
Sie sind beide gültig und in Bezug auf SQL Server gleich .
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/not-equal-to-transact-sql-exclamation
Es scheint, dass Microsoft es vorzieht <>
, dies !=
in seinen Tabelleneinschränkungen zu belegen. Ich persönlich bevorzuge die Verwendung, !=
da ich dies eindeutig als "nicht gleich" gelesen habe. Wenn Sie [field1 != field2]
es jedoch als Einschränkung eingeben und speichern, wird es beim nächsten Abfragen als angezeigt [field1 <> field2]
. Dies sagt mir, dass der richtige Weg, es zu tun, ist <>
.
!=
Obwohl es sich nicht um ANSI handelt, entspricht es eher dem wahren Geist von SQL als lesbarer Sprache. Es schreit nicht gleich.
<>
sagt, es ist für mich (kleiner als, größer als), was einfach komisch ist. Ich weiß, die Absicht ist, dass es entweder kleiner oder größer als daher nicht gleich ist, aber das ist eine wirklich komplizierte Art, etwas wirklich Einfaches zu sagen.
Ich musste nur einige lange SQL-Abfragen nehmen und sie aus einer ganzen Reihe dummer Gründe, auf die ich nicht eingehen werde, liebevoll in eine XML-Datei einfügen.
Es genügt zu sagen, dass XML überhaupt nicht funktioniert <>
und ich musste sie ändern !=
und mich selbst überprüfen, bevor ich mich selbst ruinierte.
Sie können in T-SQL beliebig verwenden. Die Dokumentation besagt, dass beide gleich funktionieren. Ich bevorzuge !=
, weil es "nicht gleich" für meinen (C / C ++ / C # -basierten) Verstand lautet, aber Datenbank-Gurus scheinen es zu bevorzugen <>
.
Eine Alternative wäre, den anderen NULLIF-Operator als <>
oder zu verwenden, !=
der NULL zurückgibt, wenn die beiden Argumente in Microsoft Docs gleich NULLIF sind . Also ich glaube , WHERE - Klausel kann modifiziert werden <>
und !=
wie folgt dar :
NULLIF(arg1, arg2) IS NOT NULL
Wie ich festgestellt habe, funktioniert <>
und !=
funktioniert in einigen Fällen nicht für das Datum. Daher ist die Verwendung des obigen Ausdrucks notwendig.
<>
in allen Eckfällen genauso gut funktioniert wie in Bezug auf die Indexnutzung. Außerdem ist die Lesbarkeit sicherlich viel schlechter ...
Ich habe es vorgezogen, !=
anstatt zu verwenden, <>
weil ich manchmal die <s></s>
Syntax zum Schreiben von SQL-Befehlen verwende. Die Verwendung !=
ist in diesem Fall praktischer, um Syntaxfehler zu vermeiden.
Sie werden beide in T-SQL akzeptiert. Es scheint jedoch, dass die Verwendung <>
viel schneller funktioniert als!=
. Ich habe gerade eine komplexe Abfrage ausgeführt, die verwendet wurde !=
, und die Ausführung dauerte durchschnittlich 16 Sekunden. Ich habe diese geändert <>
und die Abfrage dauert jetzt durchschnittlich 4 Sekunden. Das ist eine enorme Verbesserung!
Obwohl sie auf die gleiche Weise funktionieren, !=
bedeutet dies genau "ungleich", während sie <>
größer und kleiner als der gespeicherte Wert sind.
Überlegen Sie >=
oder <=
, und dies ist sinnvoll, wenn Sie Ihre Indizes für Abfragen berücksichtigen ... <>
wird in einigen Fällen (mit dem richtigen Index) schneller ausgeführt, in anderen Fällen (indexfrei) werden sie jedoch genauso ausgeführt.
Dies hängt auch davon ab, wie Ihr Datenbanksystem die Werte !=
und liest <>
. Der Datenbankanbieter kann es einfach verknüpfen und dafür sorgen, dass sie gleich funktionieren, sodass es in keiner Weise Vorteile gibt. PostgreSQL und SQL Server verknüpfen dies nicht. es wird so gelesen, wie es oben erscheint.