SQL Grundkurs 1: Die Sprache erlernen

Synchronisierte Unterabfrage

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Info von "Oben" benötigt? Wenn eine Unterabfrage eine Information von der Hauptabfrage benötigt, um einen speziellen Wert zu liefern, spricht man von einer synchronisierten Unterabfrage. Aber Achtung: immer auf die Performance einer solchen Abfrage achten!

Transkript

Synchronisierte Unterabfragen sind in der Lage, mit der Hauptabfrage zu kommunizieren. Wie das funktioniert, sehen sie in diesem Video. Die hier vorbereitete Anweisung ist noch eine normale, eine noch nicht synchronisierte, Unterabfrage. Die Unterabfrage eruiert uns den durchschnittlichen Verkaufspreis aller Artikel. Das ist im Moment ein Betrag von knapp über 32 Euro. Dieser Wert wird an die Hauptabfrage übergeben, die alle Artikel anzeigt, die einen höheren Preis haben als der Durchschnittspreis. Ich habe hier eine Sortierung über die Artikelgruppe und den Verkaufspreis ergänzt. Führen wir diese Anweisung einmal aus und wir sehen jetzt, dass 295 unserer Artikel mehr kosten als der Durchschnitt. Aufgrund der Sortierung sehen wir, dass es z.B. hier nur einen Artikel aus der Artikelgruppe "Besteck" gibt, der über diesem Mittelwert liegt. Bei den elektrischen Geräten gibt es schon deutlich mehr. Dann sehen wir hier: Nach den elektrischen Geräten kommen wieder die Gartenartikel mit 32,48 Euro, der erste Preis liegt ganz knapp darüber usw. Bei einer klassischen Unterabfrage wird hier einmal die Unterabfrage ausgeführt, vorweg, und das Ergebnis dann an die Hauptabfrage übergeben. Also de facto werden diese zwei Abfragen hintereinander ausgeführt. Wie sieht es nun bei einer synchronisierten Unterabfrage aus? Hier ist es etwas anders. Wenn wir jetzt die Aufgabenstellung so erweitern, dass wir sagen: Wir möchten alle Artikel, die mehr kosten als der Durchschnitt ihrer Artikelgruppe d.h., nicht der Gesamtdurchschnitt für alle Artikel, sondern der Durchschnitt ihrer Artikelgruppe. Dann ändert sich ja alles, denn die Unterabfrage muss ja immer wissen, für welchen Artikel, sprich für welchen Artikel aus welcher Artikelgruppe, sie einen Durchschnittspreis bilden muss und an die Hauptabfrage zurückzugeben hat. Was muss also in dieser Unterabfrage verändert werden? Diese Unterabfrage muss in der WHERE-Klausel auf eine Spalte in der Hauptabfrage verweisen. In dem Fall wäre das "where Gruppe = Gruppe". Das können wir so natürlich nicht verwenden, denn das wäre natürlich immer "wahr". Er würde die Artikelgruppe aus der Unterabfrage verwenden. Wir müssen dem System jetzt mitteilen, dass wir einmal die Artikelgruppe aus der Unterabfrage und einmal die Artikelgruppe aus der Hauptabfrage meinen. Da hier zweimal dieselbe Tabelle verwendet wird, ist es nicht ausreichend den Tabellennamen voranzusetzen, deshalb vergibt man hier einfach unterschiedliche Aliasnamen, ähnlich wie bei einem self-join. D.h., ich nenne diese Tabelle in der Hauptabfrage z.B. "außen" und gebe ihr in der Unterabfrage den Aliasnamen "innen". Denn nun kann ich diese Tabellen-Aliasnamen verwenden um zu sagen: "where innen.gruppe", sprich aus der inneren Tabelle "= außen.gruppe". Diese Unterabfrage ist natürlich für sich alleine nicht mehr ausführbar, so wie wir das vorhin bei der ersten Variante getestet haben, weil sie "außen" alleinstehend nicht kennt. "Außen" ist nur in Kombination mit der Hauptabfrage bekannt. Was passiert jetzt, wenn wir diese Haupt-Unterabfrage gemeinsam ausführen. Nachdem die Unterabfrage auf eine Spalte aus der äußeren Abfrage verweist, kann sie nicht einmal vorweg ausgeführt werden, sondern muss für jede Zeile, die in der Hauptabfrage geprüft wird, man spricht hier auch von einer Kandidatenzeile, separat ausgeführt werden. Ich führe die Anweisung jetzt aus, und wir haben jetzt etwas mehr Treffer, weil nun gilt es nicht mehr, alle zurückzubekommen, die mehr kosten als der Gesamtdurchschnittspreis, sondern mehr als der Durchschnittspreis ihrer Artikelgruppe. Wir erkennen den Unterschied sofort, hier beim "Besteck", dass hier jetzt einige Datensätze mehr zu sehen sind, nämlich das erste Besteck, das angezeigt wird, kostet 14,06 Euro, das ist offensichtlich über dem Durchschnittspreis der Artikelgruppe "Besteck". Aber bei den elektrischen Geräten gibt es einen höheren Durchschnittspreis als den Gesamtdurchschnittspreis , da ist nämlich das erste elektrische Gerät, das wir hier sehen, mit einem Preis von 76,09 Euro versehen. Was bedeutet das aus Sicht der Performance? Das ist natürlich einer der größten Nachteile dieser Variante. Die Unterabfrage muss jetzt sehr häufig ausgeführt werden, nämlich für jede Zeile, die hier geprüft wird. Nachdem wir ungefähr 1100 Artikel in der Artikeltabelle haben, ist hier in unserem Beispiel die Unterabfrage 1100 Mal ausgeführt worden. Wir haben nicht wirklich gemerkt dass das hier langsam ist, ich führe das noch einmal aus, aber tendenziell gilt: Je größer die Grund-Datenmenge ist, desto eher geht aus Performance-Sicht diese Anweisung in die Knie. D.h., für große Datenmengen ist sie nicht sehr gut geeignet. Da könnte man andere Varianten wählen. Generell ist es also möglich, dass ich aus einer Unterabfrage auf die Hauptabfrage verweise. Ich muss darauf achten, wenn es dieselbe Tabelle ist, dass ich Tabellen-Aliasnamen verwende. Man nennt diese Form der Unterabfrage "synchronisiert", weil sie einen Wert aus der Hauptabfrage benötigt, um selbst ausgeführt zu werden. Es ist sozusagen ein permanentes Hin und Her zwischen den beiden. Aus Performance-Sicht sollten Sie überlegen, ob sie bei größeren Datenmengen nicht eine andere Variante für die Lösung heranziehen möchten.

SQL Grundkurs 1: Die Sprache erlernen

Arbeiten Sie sich in die Grundlagen der Datenbanksprache SQL am Beispiel von Microsoft SQL Server, Oracle und MySQL ein und lassen Sie sich die praktische Nutzung erklären.

14 Std. 40 min (112 Videos)
Derzeit sind keine Feedbacks vorhanden...

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!