MySql Frage:
Was ist der Unterschied zwischen [NOT] IN und [NOT] EXIST bei Unterabfragen in MySql.
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 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).
Der NOT-Operator kehrt nur die Logik um.
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:
Sie arbeiten sehr unterschiedlich:
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.