Der Zweck von SQL EXISTS und NOT EXISTS

8

Hin und wieder sehe ich, dass diese verwendet werden, aber es scheint nie etwas zu sein, das nicht genauso gut, wenn nicht sogar besser, mit einer normalen Verknüpfung oder Unterabfrage ausgeführt werden kann.

Ich sehe sie als irreführend an (sie sind im Vergleich zu herkömmlichen Joins und Unterabfragen wohl schwerer zu visualisieren), oft missverstanden (zB verhält sich SELECT * genauso wie SELECT 1 in der EXISTS/NOT EXISTS Unterabfrage), und aus meiner begrenzten Erfahrung, langsamer auszuführen.

Kann mir jemand ein Beispiel beschreiben und / oder angeben, wo es am besten passt oder wo es keine andere Möglichkeit gibt, als sie zu nutzen? Beachten Sie, dass ihre Ausführung und Leistung wahrscheinlich plattformabhängig ist. Daher bin ich besonders an deren Verwendung in MySQL .

    
Riedsio 16.12.2010, 21:40
quelle

3 Antworten

4
  

Hin und wieder sehe ich, dass diese verwendet werden, aber es scheint nie etwas zu sein, das nicht genauso gut, wenn nicht sogar besser, mit einem normalen Join oder einer Unterabfrage ausgeführt werden kann.

Dieser Artikel (obwohl SQL Server verwandt):

könnte für Sie von Interesse sein.

Zusammengefasst ist JOIN eine gesetzte Operation, während EXISTS ein Prädikat ist.

Mit anderen Worten, diese Abfragen:

%Vor%

gegen

%Vor%

sind nicht dasselbe: Ersteres kann mehr als einen Datensatz von a zurückgeben, während Letzteres nicht möglich ist.

Ihre Gegenstücke, NOT EXISTS vs. LEFT JOIN / IS NULL , sind logisch, aber nicht leistungsmäßig.

Tatsächlich ist ersteres möglicherweise effizienter in SQL Server :

Quassnoi 20.12.2010, 17:59
quelle
1

Wenn die Hauptabfrage viel weniger Zeilen zurückgegeben hat als die Tabelle, in der Sie sie finden möchten. Beispiel:

%Vor%

dies mit einem Join wird viel langsamer sein. oder ein besseres Beispiel, wenn Sie suchen möchten, ob ein Element in einer von mehreren Tabellen existiert.

    
The Scrum Meister 16.12.2010 21:43
quelle
1

Sie können [Join] in einer UPDATE Anweisung nicht [einfach] verwenden, daher funktioniert WHERE EXISTS dort ausgezeichnet:

%Vor%

Bearbeiten: Basiert auf Oracle mehr als MySQL, und ja, es gibt Möglichkeiten, es mit einer Inline-Ansicht zu tun, aber IMHO ist das sauberer.

    
BQ. 16.12.2010 23:38
quelle