Was ist der Unterschied zwischen der EXISTS
und IN
-Klausel in SQL?
Wann sollten wir verwenden EXISTS
und wann sollten wir verwenden IN
?
Das exists
Schlüsselwort kann auf diese Weise verwendet werden, aber es ist wirklich dazu gedacht, das Zählen zu vermeiden:
--this statement needs to check the entire table
select count(*) from [table] where ...
--this statement is true as soon as one match is found
exists ( select * from [table] where ... )
Dies ist am nützlichsten, wenn Sie if
bedingte Anweisungen haben, da exists
dies viel schneller sein kann als count
.
Das in
wird am besten verwendet, wenn Sie eine statische Liste übergeben müssen:
select * from [table]
where [field] in (1, 2, 3)
Wenn Sie eine Tabelle in einer in
Anweisung haben, ist es sinnvoller, eine zu verwenden join
, aber meistens sollte es keine Rolle spielen. Der Abfrageoptimierer sollte in beiden Fällen denselben Plan zurückgeben. In einigen Implementierungen (meistens älter, wie z. B. Microsoft SQL Server 2000) erhalten in
Abfragen immer einen verschachtelten Join- Plan, während join
Abfragen je nach Bedarf verschachtelt, zusammengeführt oder hashen . Modernere Implementierungen sind intelligenter und können den Plan auch bei in
Verwendung anpassen .
JOIN
als Ersatz verwenden könnenIN
.select * from [table] where [field] in (select [field] from [table2])
Gibt die gleichen Ergebnisse (und Abfragepläne) wie zurückselect * from [table] join [table2] on [table2].[field] = [table].[field]
.table
, während die zweite alles vontable
und zurückgibttable2
. In einigen (meist älteren) SQL-Datenbanken wird diein
Abfrage als verschachtelter Join implementiert, während diejoin
Abfrage verschachtelt, zusammengeführt, gehasht usw. werden kann - was auch immer am schnellsten ist.exists
kann innerhalb einer case-Anweisung verwendet werden, so dass sie auch auf diese Weise nützlich sein können, dhselect case when exists (select 1 from emp where salary > 1000) then 1 else 0 end as sal_over_1000
EXISTS
Hier erfahren Sie, ob eine Abfrage Ergebnisse zurückgegeben hat. z.B:IN
wird verwendet, um einen Wert mit mehreren zu vergleichen, und kann Literalwerte wie diesen verwenden:Sie können Abfrageergebnisse auch mit der folgenden
IN
Klausel verwenden:quelle
Basierend auf dem Regeloptimierer :
EXISTS
ist viel schneller alsIN
wenn die Ergebnisse der Unterabfrage sehr groß sind.IN
ist schneller alsEXISTS
, wenn die Ergebnisse der Unterabfrage sehr klein sind.Basierend auf dem Kostenoptimierer :
quelle
Ich gehe davon aus, dass Sie wissen, was sie tun, und daher anders verwendet werden. Daher verstehe ich Ihre Frage wie folgt: Wann wäre es eine gute Idee, das SQL neu zu schreiben, um IN anstelle von EXISTS zu verwenden, oder umgekehrt.
Ist das eine faire Annahme?
Bearbeiten : Der Grund, den ich frage, ist, dass Sie in vielen Fällen eine auf IN basierende SQL neu schreiben können, um stattdessen EXISTS zu verwenden, und umgekehrt. Bei einigen Datenbank-Engines behandelt das Abfrageoptimierungsprogramm die beiden unterschiedlich.
Zum Beispiel:
kann umgeschrieben werden in:
oder mit einem Join:
Meine Frage bleibt also weiterhin: Ist das Originalplakat eine Frage, was IN und EXISTS tun und wie man es verwendet, oder ob er eine SQL mit IN neu schreibt, um stattdessen EXISTS zu verwenden, oder umgekehrt, eine gute Idee ist?
quelle
JOIN
benötigen Sie eineDISTINCT
EXISTS
ist viel schneller alsIN
wenn die Ergebnisse der Unterabfrage sehr groß sind.IN
ist schneller alsEXISTS
wenn die Ergebnisse der Unterabfrage sehr klein sind.Abfrage 1
Abfrage 2
Wenn
t1
Ihre ID den Wert Null hat, werden sie von Abfrage 1 gefunden, aber Abfrage 2 kann keine Nullparameter finden.Ich meine, ich
IN
kann nichts mit null vergleichen, also hat es kein Ergebnis für null, aber ich kann alles mit nullEXISTS
vergleichen.quelle
Wenn Sie den
IN
Operator verwenden, scannt die SQL-Engine alle Datensätze, die aus der inneren Abfrage abgerufen wurden. Wenn wir dagegen verwendenEXISTS
, stoppt die SQL-Engine den Scanvorgang, sobald eine Übereinstimmung gefunden wurde.quelle
IN unterstützt nur Gleichheitsrelationen (oder Ungleichheit, wenn NICHT vorangestellt ist ).
Es ist ein Synonym für = any / = some , z
EXISTS unterstützt verschiedene Arten von Beziehungen, die nicht mit IN ausgedrückt werden können , z.
Und in einem anderen Sinne -
Die angeblichen Leistungs- und technischen Unterschiede zwischen EXISTS und IN können auf Implementierungen / Einschränkungen / Fehler bestimmter Anbieter zurückzuführen sein. Oft handelt es sich jedoch nur um Mythen, die aufgrund mangelnden Verständnisses der internen Datenbanken entstanden sind.
Die Definition der Tabellen, die Genauigkeit der Statistiken, die Datenbankkonfiguration und die Version des Optimierers wirken sich alle auf den Ausführungsplan und damit auf die Leistungsmetriken aus.
quelle
Das
Exists
Schlüsselwort wertet wahr oder falsch aus, aber dasIN
Schlüsselwort vergleicht alle Werte in der entsprechenden Unterabfragespalte. Ein andererSelect 1
kann mitExists
Befehl verwendet werden. Beispiel:Ist
IN
aber weniger effizient soExists
schneller.quelle
Ich glaube,
EXISTS
In diesem Fall müssen Sie die Ergebnisse der Abfrage mit einer anderen Unterabfrage abgleichen. Die Ergebnisse der Abfrage Nr. 1 müssen abgerufen werden, wenn die SubQuery-Ergebnisse übereinstimmen. Art eines Joins. Wählen Sie beispielsweise die Kundentabelle Nr. 1 aus, die auch die Bestelltabelle Nr. 2 aufgegeben hatIN soll abrufen, ob der Wert einer bestimmten Spalte in
IN
einer Liste liegt (1,2,3,4,5). ZB Kunden auswählen, die in den folgenden Postleitzahlen liegen, dh Postleitzahlwerte liegen in der Liste (....).Wann man es übereinander verwendet ... wenn man das Gefühl hat, dass es angemessen liest (kommuniziert Absicht besser).
quelle
Der Unterschied liegt hier:
Die obige Abfrage gibt alle Datensätze zurück, während die untere Abfrage leer zurückgibt.
Probieren Sie es aus und beobachten Sie die Ausgabe.
quelle
Nach meinem Wissen
NULL
wird die gesamte Anweisung, wenn eine Unterabfrage einen Wert zurückgibtNULL
. In diesen Fällen verwenden wir dasEXITS
Schlüsselwort. Wenn wir bestimmte Werte in Unterabfragen vergleichen möchten, verwenden wir dasIN
Schlüsselwort.quelle
Welche schneller ist, hängt von der Anzahl der von der inneren Abfrage abgerufenen Abfragen ab:
EXIST bewertet auf wahr oder falsch, aber IN vergleicht mehrere Werte. Wenn Sie nicht wissen, dass der Datensatz vorhanden ist oder nicht, sollten Sie EXIST wählen
quelle
Der Grund dafür ist, dass der EXISTS-Operator nach dem Prinzip „zumindest gefunden“ arbeitet. Es gibt true zurück und stoppt das Scannen der Tabelle, sobald mindestens eine übereinstimmende Zeile gefunden wurde.
Wenn andererseits der IN-Operator mit einer Unterabfrage kombiniert wird, muss MySQL zuerst die Unterabfrage verarbeiten und dann das Ergebnis der Unterabfrage verwenden, um die gesamte Abfrage zu verarbeiten.
quelle
Meines Wissens nach sollten beide gleich sein, solange es sich nicht um NULL-Werte handelt.
Der gleiche Grund, warum die Abfrage den Wert für = NULL vs nicht zurückgibt, ist NULL. http://sqlinthewild.co.za/index.php/2010/02/18/not-exists-vs-not-in/
Was das Argument Boolean vs Comparator betrifft, müssen zum Generieren eines Boolean beide Werte verglichen werden, und so funktioniert jede Bedingung, wenn sie funktioniert. Daher verstehe ich nicht, wie sich IN und EXISTS unterschiedlich verhalten.
quelle
In certain circumstances, it is better to use IN rather than EXISTS. In general, if the selective predicate is in the subquery, then use IN. If the selective predicate is in the parent query, then use EXISTS.
https://docs.oracle.com/cd/B19306_01/server.102/b14211/sql_1016.htm#i28403
quelle
Wenn eine Unterabfrage mehr als einen Wert zurückgibt, müssen Sie möglicherweise die äußere Abfrage ausführen, wenn die Werte in der in der Bedingung angegebenen Spalte mit einem Wert in der Ergebnismenge der Unterabfrage übereinstimmen. Um diese Aufgabe auszuführen, müssen Sie das
in
Schlüsselwort verwenden.Sie können eine Unterabfrage verwenden, um zu überprüfen, ob eine Reihe von Datensätzen vorhanden ist. Dazu müssen Sie die
exists
Klausel mit einer Unterabfrage verwenden. Dasexists
Schlüsselwort gibt immer den Wert true oder false zurück.quelle
Ich glaube, das hat eine einfache Antwort. Warum überprüfen Sie es nicht von den Leuten, die diese Funktion in ihren Systemen entwickelt haben?
Wenn Sie ein MS SQL-Entwickler sind, finden Sie hier die Antwort direkt von Microsoft.
IN
::EXISTS
::quelle
Ich habe festgestellt, dass die Verwendung des EXISTS-Schlüsselworts oft sehr langsam ist (das ist in Microsoft Access sehr richtig). Ich verwende stattdessen den Join-Operator auf folgende Weise: Sollte-ich-das-Schlüsselwort-verwenden-existiert-in-SQL
quelle
EXISTS ist schneller in der Leistung als IN. Wenn sich die meisten Filterkriterien in einer Unterabfrage befinden, ist es besser, IN zu verwenden. Wenn sich die meisten Filterkriterien in der Hauptabfrage befinden, ist es besser, EXISTS zu verwenden.
quelle
Wenn Sie den IN-Operator verwenden, scannt die SQL-Engine alle Datensätze, die aus der inneren Abfrage abgerufen wurden. Wenn wir dagegen EXISTS verwenden, stoppt die SQL-Engine den Scanvorgang, sobald eine Übereinstimmung gefunden wurde.
quelle
IN
undEXISTS
kann äquivalent und ineinander transformiert sein.