Soll ich! = Oder <> für ungleich in T-SQL verwenden?

800

Ich habe gesehen, SQLdass beide !=und <>für nicht gleich verwendet . Was ist die bevorzugte Syntax und warum?

Ich mag !=, weil <>mich daran erinnert Visual Basic.

Bob der Hausmeister
quelle
Portabilität des Codes. Wenn Ihre Anforderungen von ANSI SQL problemlos erfüllt werden, ist es besser, sie zu verwenden. Sie können in allen DBs denselben Code verwenden. Z.B. Ein SQL-Buchautor, der grundlegende SQL mithilfe von Beispielcode veranschaulichen möchte.
Steam
1
Ich möchte ein Beispiel hinzufügen, bei dem es ein Problem sein kann, nur ANSI-SQL-Code zu haben. Standard-SQL unterstützt die Optionen NULLS FIRST und NULLS LAST, um zu steuern, wie NULL-Werte sortiert werden. T-SQL unterstützt diese Option jedoch nicht.
Steam
Eine erneute Öffnung ist nicht erforderlich. Die markierte Frage ist ein Duplikat, das nur um eine weitere Option erweitert wurde NOT (A = B).
TLama
@Steam, Sie sollten angeben, auf welche Jahresversion von ansi sql Sie sich genau beziehen. Bei einigen dieser Versionen müssen Sie sogar die Level-Kompatibilität oder die genauen Teile des Standards angeben. Welcher von ihnen hat NULLS FIRST und NULLS LAST eingeführt?
Gherman

Antworten:

539

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 ...

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

DBAndrew
quelle
41
Ich hatte es immer vorgezogen, es zu verwenden, !=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!
Iain Samuel McLean Elder
24
Ich benutze gerne <>, weil es mich an XML erinnert. Aber SQL ist kein XML!
Rob Grant
32
Ja; Microsoft selbst empfiehlt die Verwendung von <>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!"
Matt Gibson
10
Ich mag <>, weil es einfacher zu tippen ist.
user2023861
731

Die meisten Datenbanken unterstützen !=(beliebte Programmiersprachen) und <>(ANSI).

Datenbanken, die sowohl Folgendes unterstützen !=als auch <>:

Datenbanken, die ausschließlich den ANSI-Standardoperator unterstützen :

  • IBM DB2 UDB 9.5: <>
  • Microsoft Access 2010: <>
Bill Karwin
quelle
Django ORM-Abfrage wird NOT (a = b)anstelle von (a <> b)oder zugeordnet (a != b). Ist es intern dasselbe?
Benutzer
7
@buffer, sie sind logisch gleich, das heißt, sie stimmen mit demselben Satz von Zeilen überein oder schließen ihn aus. Ob eine bestimmte RDBMS-Marke dieselbe optimiert, hängt jedoch von der Implementierung ab. Trotzdem wäre ich überrascht, wenn es Unterschiede zwischen den Datenbankmarken gäbe.
Bill Karwin
Randnotiz: LINQ in C # müssen Sie verwenden! =
Tom Stickel
! = wird von IBM DB2 LUW 10.5+ unterstützt
Cristi S.
10
@ TomStickel LINQ in C # ist kein SQL.
Craig
109

'<>'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.

Adam Lassek
quelle
Ich habe gesehen, dass MySQL SQL es auch verwendet
Bob The Janitor
3
Können wir eine so weit verbreitete Erweiterung der Standardsprache weiterhin als proprietär bezeichnen ? An diesem Punkt scheint es nur so, als ob der Standard aktualisiert werden sollte, um beide Syntaxen zu erfordern oder zumindest zuzulassen.
Johan Boulé
3
@ JohanBoule Nun, es gibt einen schriftlichen Standard für SQL und meines Wissens !=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.
Adam Lassek
24

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

Madcolor
quelle
Das ist SQL Server-spezifisch. Zugegeben, er fragt nach SQL Server, aber können Sie eine ANSI-Spezifikationsreferenz finden, um zu sehen, ob sie für diejenigen von uns, die so etwas wissen möchten, garantiert portabel ist?
Joel Coehoorn
6
@ Joel Coehoorn, wenn Sie Ihren T-SQL-Code sehr portieren, werden "<>" und "! =" Die geringste Sorge für Sie sein !!
KM.
1
Portierung ist nicht das Problem - es ist, wenn Sie als Entwickler zwischen Umgebungen hin und her wechseln müssen. Konsistenz ist gut.
Mark Ransom
20

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 <>.

Kyle
quelle
15

!=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.

Fetter Albert
quelle
6
warum nicht einfach CDATA es? Was passiert, wenn Ihre Abfrage XML enthält?
Janus Troelsen
12

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 <>.

Steve
quelle
10

Ich verstehe, dass die C-Syntax !=aufgrund ihres Unix-Erbes in SQL Server enthalten ist (in den Tagen von Sybase SQL Server vor Microsoft SQL Server 6.5).

Karl
quelle
7

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.

Jitendrapurohit
quelle
6
Ich bin mir nicht sicher, ob diese Funktion <>in allen Eckfällen genauso gut funktioniert wie in Bezug auf die Indexnutzung. Außerdem ist die Lesbarkeit sicherlich viel schlechter ...
Lukas Eder
Wie ich in der Antwort erwähnt habe, funktionierte dies für mich in den Datumsfeldern dort im Jahr 2014. Ich bin mir nicht sicher, welche Klausel / Bedingung andere Antworten einschränkte, aber wenn ich mir einige der positiven Stimmen anschaue, scheint dies auch anderen zu helfen.
Jitendrapurohit
1

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.

Andrea Antonangeli
quelle
-6

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!

Weiler Javier
quelle
20
Wenn Sie in SQL Server zwei ähnliche Abfragen nacheinander ausführen, werden wahrscheinlich Daten im Speicher zwischengespeichert und für ähnliche Abfragen optimiert. Wenn Sie es in umgekehrter Reihenfolge gemacht haben, finden Sie möglicherweise das gegenteilige Ergebnis!
Codemonkey
2
Dies ist auch falsch, sie hätten nicht zwei Operatoren, die genau gleich funktionierten, und einer war langsamer "nur weil". Es gibt viele Faktoren, die dazu beitragen, dass dieselbe Abfrage unterschiedliche Ausführungszeiten erzeugt.
Elliot Chance
-11

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.

Kevin Kinchen
quelle
3
Haben Sie eine unterstützende Referenz für Ihre Aussage? Beide Operatoren scheinen in PostgreSQL , Oracle und MySQL genau gleich zu sein .
GhostGambler
8
Dies ist völlig falsch. Wenn Sie diese Zeichen in Ihrem Kopf kombinieren, sieht es für Sie möglicherweise "größer als und kleiner als der gespeicherte Wert" aus. Für den Lexer ist dies jedoch nur eine andere Möglichkeit, das Token darzustellen.
Elliot Chance
Mangel an verwandten Ressourcen!
mostafa8026