SQL Grundkurs 1: Die Sprache erlernen

TOP für Oracle

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Oracle kennt die TOP-Klausel für das Filtern aufgrund eines Rankings nicht. Mit einer Unterabfrage und der integrierten Spalte ROWNUM können Sie aber dasselbe Ergebnis erzielen. In diesem Video finden Sie die Anleitung dazu.

Transkript

Dieses Video verwende ich dazu, Ihnen zu zeigen, wie Sie mithilfe einer Unterabfrage des Oracle fehlende TOP substituieren können. Mit TOP können Sie ja filtern aufgrund der Sortierung, z.B. den teuersten oder die 5 teuersten Artikel, oder die 3 zuletzt eingetretenen Mitarbeiter. Mittels TOP filtern Sie nach einem gewissen Ranking: immer die größten, die kleinsten, etc., oder die jüngsten, oder die ältesten. D.h. die Sortierung definiert, was ich filtere. Möchte ich z.B. die ältesten haben, muss ich nach dem Alter absteigend sortieren, um die ältesten am Beginn der Anweisung zu haben. Über den Zusatz TOP kann ich definieren, wie viele letztendlich angezeigt werden. Diese Variante gibt es ja bei Oracle nicht, aber wir können das mit einer Unterabfrage substituieren. Wie das geht, zeige ich Ihnen einmal. Wenn wir Daten aus einer Oracle-Tabelle abrufen, dann bekommen wir nicht nur das Ergebnis angezeigt, sondern diese Daten müssen ja im Hintergrund von der Platte am Server gelesen werden, in einer gewissen Reihenfolge. Und diese Reihenfolge können wir uns mit ausgeben lassen über die interne Systemspalte "rownum". Ich ergänze "rownum" hier in der SELECT-Klausel und führe die Anweisung noch einmal aus. Und nun sehen wir hier diese Ausgabereihenfolge mit angezeigt. Solange wir keine Sortierung in unserer Anweisung verwenden, wird die Row Number immer aufsteigend ausgegeben, weil die Daten ja genau in der Reihenfolge zurückgegeben werden, wie sie auch vom System intern von der Platte gelesen werden, oder aus dem Speicher eben, sofern sie noch gecached sind. Was passiert jetzt, wenn ich hier eine Sortierung ergänze? Ich sortiere z.B. nach dem Verkaufspreis absteigend, um die teuersten Artikel am Beginn der Liste angezeigt zu bekommen. "ORDER BY vkpreis DESC", descending für "absteigend". Die Row Number erscheint nun wild durcheinander. Das hängt damit zusammen, dass die Sortierung der Daten im Speicher passiert, nachdem sie vom System gelesen worden sind. D.h. zum Zeitpunkt der Sortierung steht die Row Number schon fest. Deshalb haben wir hier auch keine aufsteigende Reihenfolge. Deshalb können wir die Row Number hier auf dieser Ebene nicht für eine Filterung verwenden, sonst hätten wir sagen können: "Gib uns nur jene, bei denen die Row Number <= 5 ist", um die 5 teuersten Artikel zu bekommen. Aber an dieser Stelle hilft uns die Unterabfrage. Dazu mache ich folgendes: Ich vergebe jetzt hier dieser Row Number einen Alias-Namen, z.B. "AS nummer_innen", denn ich werde gleich auf diese Anweisung in Form einer Unterabfrage zugreifen, und dann haben wir ja auch eine "rownum" in der äußeren Anweisung. Also ich sage jetzt "SELECT", "FROM" und werde hier jetzt genau diese Anweisung als Unterabfrage einbauen, gebe hier in die äußere Anweisung diese Spalten hinein, damit ich auf diese zugreifen kann. Schauen wir uns das Ergebnis einmal an. Auf den ersten Blick hat sich hier natürlich noch nichts verändert. Wir haben 1:1 auf diese Inhalte zugegriffen. Diese "NR_INNEN" ist aber jetzt die Reihenfolge, die ursprünglich in der Unterabfrage verwendet worden ist. Ich werde jetzt folgendes tun: Ich werde jetzt zusätzlich noch die "rownum" der äußeren Anweisung ergänzen, weil diese liest ja auch in einer gewissen Reihenfolge das Ergebnis, das die Unterabfrage geliefert hat, und diese Reihenfolge spiegelt sich in der "rownum" wieder. "Rownum", und zur Unterscheidung nenne ich die jetzt "AS nr_aussen". Ich führe diese Anweisung aus, und Sie sehen jetzt, dass wir natürlich jetzt in der Hauptabfrage die Zeilen so eingelesen haben, in der Reihenfolge wie wir sie sortiert von der Unterabfrage bekommen. Das heißt, es entspricht jetzt die absteigende Sortierung im Einkaufspreis in der äußeren Abfrage der Reihenfolge, wie die Daten angegeben werden. Und diese Information, diese "rownum" in der äußeren Anweisung, kann ich nun als mein Filterkriterium verwenden. Um also nur die 5 teuersten Artikel angezeigt zu bekommen, ergänze ich hier eine WHERE-Klausel, in der ich definiere: "WHERE rownum <= 5", und das ist in dem Fall hier in der äußeren Anweisung, muss "<= 5" sein. Damit werde ich nach dieser Zeile die Ausgabe filtern und abbrechen. Schauen wir uns das Ergebnis an. Genau das haben wir hier bekommen. Wir sehen hier die 5 teuersten Artikel. Auf diese Art und Weise können Sie also bei Oracle ein TOP substituieren. Sie müssen ebenso die Sortierung von der Logik her anwenden wie bei einem klassischen TOP und diese Sortierung bereits in einer Unterabfrage bewerkstelligen. Dann greifen Sie auf diese Anweisung als Unterabfrage zu und verwenden die Einschränkung über die "rownum", um in der Hauptabfrage nur jene Anzahl an Zeilen auszugeben, die Sie ausgegeben haben möchten. Um das noch zu vertiefen, möchte ich das Gleiche mit einem weiteren Beispiel noch einmal demonstrieren. Und zwar wollen wir die 3 zuletzt eingestellten Mitarbeiter aus der Personaltabelle ausgeben. Aus der Tabelle "Personal FROM wawi.Personal" holen wir uns die Personalnummer, den Nachnamen, den Vornamen, sowie das Eintrittsdatum. Damit wir die drei zuletzt eingestellten Mitarbeiter bekommen, müssen wir das Ergebnis nach dem Eintrittsdatum sortieren. Also "ORDER BY eintritt". Wenn wir nach Eintrittsdatum aufsteigend sortieren, haben wir diejenigen, die das späteste Eintrittsdatum haben, also das größte Eintrittsdatum, am Ende der Liste. Wir benötigen diese aber am Beginn der Liste. Deshalb müssen wir hier die Sortierung umkehren, also absteigend sortieren. Um jetzt genau diese 3 zu bekommen, setzen wir das Ganze als Unterabfrage ein: "SELECT", "FROM". Ich verwende die Anweisung als Unterabfrage. Hier greife ich jetzt auf diese Spalten zu die nehme ich hier einfach 1:1, ich hätte auch hier "SELECT *" schreiben können und verwende jetzt hier in meiner WHERE-Klausel die Einschränkung "WHERE rownum". Ich möchte die ersten 3, also entweder "<=3" oder "<4". Damit bekomme ich genau die 3 Mitarbeiter, die zuletzt eingestellt worden sind. Vielleicht ist Ihnen aufgefallen, dass ich hier bei der Unterabfrage keinen Tabellenaliasnamen angegeben habe. Generell sollten Sie das immer tun. Das ist eine Ausnahme, dass Oracle das akzeptiert, wenn Sie den Tabellenaliasnamen bei Unterabfragen in der FROM-Klausel weglassen. Aber generell empfehle ich Ihnen dennoch einen Tabellenaliasnamen zu vergeben. Sie haben in diesem Video gesehen, wie Sie mittels Unterabfragen in der FROM-Klausel, also sogenannten Inline Views bei Oracle sehr elegant das fehlende TOP substituieren können.

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!