MYSQL - Unterschied zwischen IN und EXIST

8

MySql Frage:

Was ist der Unterschied zwischen [NOT] IN und [NOT] EXIST bei Unterabfragen in MySql.

    
Paulo Coghi 22.10.2010, 17:59
quelle

2 Antworten

9

EXISTEN

EXISTS dient buchstäblich dazu, die Existenz bestimmter Kriterien zu überprüfen. Im aktuellen Standard-SQL können Sie mehr als ein Kriterium für den Vergleich angeben - IE, wenn Sie wissen möchten, ob col_a und col_b übereinstimmen - was es etwas stärker macht als die IN-Klausel. MySQL IN unterstützt Tupel, aber die Syntax ist nicht portierbar, daher ist EXISTS sowohl für die Lesbarkeit als auch für die Portabilität eine bessere Wahl.

Die andere Sache, die bei EXISTS beachtet werden muss, ist, wie sie funktioniert - EXISTS gibt einen booleschen Wert zurück und gibt bei der ersten Übereinstimmung einen booleschen Wert zurück. Wenn Sie also mit Duplikaten / Multiples arbeiten, ist EXISTS schneller auszuführen als IN oder JOINs, abhängig von den Daten und den Anforderungen.

IN

IN ist syntaktischer Zucker für OR-Klauseln. Während es sehr entgegenkommend ist, gibt es Probleme mit dem Umgang mit vielen Werten für diesen Vergleich (nördlich von 1.000).

NICHT

Der NOT-Operator kehrt nur die Logik um.

Unterabfragen gegen JOINs

Das Mantra "joins immer verwenden" ist fehlerhaft, da JOINs das Aufblähen der Ergebnismenge riskiert, wenn mehr als ein untergeordneter Datensatz für einen übergeordneten Datensatz vorhanden ist. Ja, Sie können DISTINCT oder GROUP BY verwenden, um damit umzugehen, aber es ist sehr wahrscheinlich, dass dies den Leistungsvorteil der Verwendung eines JOIN-Moots erhöht. Kennen Sie Ihre Daten und was Sie für eine Ergebnismenge wünschen - dies sind die Schlüssel zum Schreiben von SQL, das gute Ergebnisse erzielt.

Um zu wiederholen, wann und warum zu wissen ist, was zu verwenden ist - LEFT JOIN IS NULL ist die schnellste Ausschlussliste für MySQL , wenn die verglichenen Spalten NICHT NULL-fähig sind , andernfalls NICHT IN / NOT EXISTS sind eine bessere Wahl.

Referenz:

OMG Ponies 22.10.2010, 18:19
quelle
3

Sie arbeiten sehr unterschiedlich:

  • EXISTS verwendet ein einzelnes Argument, das eine Unterabfrage (abgeleitete Tabelle) sein sollte und überprüft, ob mindestens eine Zeile von der Unterabfrage zurückgegeben wird.
  • IN benötigt zwei Argumente, von denen das erste ein einzelner Wert (oder ein Tupel) sein sollte und das zweite eine Unterabfrage oder ein Tupel ist und prüft, ob der erste Wert in second enthalten ist.

Beide können jedoch verwendet werden, um zu überprüfen, ob eine Zeile in Tabelle A eine übereinstimmende Zeile in Tabelle B enthält. Wenn Sie nicht vorsichtig sind und wissen, was Sie tun, würde ich in MySQL nicht mit IN arbeiten, da es oft viel schlechtere Leistung bietet komplexere Abfragen. Verwenden Sie NOT EXISTS oder einen LINKEN JOIN ... WHERE ... ist NULL.

    
Mark Byers 22.10.2010 18:01
quelle

Tags und Links