Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

SQL Grundkurs 2: Aufgaben und Lösungen

Beispiel 22: OUTER JOIN

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Zeigen Sie alle Artikel mit ihren Bestellmengen an. Wurden diese noch nie bestellt, soll als Bestellmenge 0 (nicht NULL) angegeben werden. Schränken Sie in der zweiten Stufe auf alle Artikel ein, die zwischen 100 Euro und 200 Euro im Verkauf kosten.

Transkript

In diesem Beispiel möchten wir noch einmal den OUTER JOIN üben. Dazu möchten wir alle Artikel mit ihrer Bestellmenge anzeigen, auch wenn sie noch nie bestellt worden sind. Dazu müssen wir die zwei Tabellen "artikel" und "bestellpositionen" miteinander joinen. In der Tabelle "bestellpositionen" ist die Spalte "artikel" der Fremdschlüssel, der auf die Spalte "artikelnummer" in der Artikeltabelle ... da sind wir hier noch falsch, hier sind wir im Objektexplorer richtig ... auf die Spalte "artikelnummer" hier verweist. Alle Spalten aus der Tabelle, für die es keine Entsprechungen gibt, sind ja im Ergebnis bei einem OUTER JOIN NULL. Wir wollen aber jetzt nicht bei den Artikeln, die noch nie bestellt worden sind null als Bestellmenge hier stehen haben, sondern wir möchten diese durch den Wert "0" ersetzen. Und so sollen alle Artikel angezeigt werden, auch wenn sie nie bestellt worden sind. In einer zweiten Ausbaustufe, sollen dann nur mal jene angezeigt werden, die noch nie bestellt worden sind. Zum Vergleich: Alle Artikel mit ihrer Bestellmenge liefern uns 1.112 Zeilen, die zweite Variante, also nunmehr die Artikel, die noch nie bestellt worden sind, nur 1.088, d. h. ein paar Artikel fallen hier heraus. Nachdem hier ja die Bestellmenge per Definition nie vorhanden ist, können wir sie im Ergebnis gleich weglassen. Pausieren Sie nun das Video und lösen Sie die Aufgabe. Wenn Sie damit fertig sind, fahren Sie mit dem Video fort und sehen Sie sich meine Musterlösung an. Betrachten wir nun das Ergebnis für die erste Lösung, für den ersten Teil der Lösung. Ich habe hier wieder in zwei Varianten umgesetzt, einmal mit einem LEFT und RIGHT OUTER JOIN damit Sie wiederum sehen, dass es nur um die Reihenfolge geht, in der wir die Tabelle in der Anweisung verwenden. Sonst sind diese zwei Lösungen jeweils ident. Ich habe hier beim SQL Server die ISNULL-Funktion verwendet, um die Bestellmenge, für den Fall dass sie null ist, mit der Ziffer "0" zu ersetzen, um dieses Ergebnis zu bekommen. Beim LEFT OUTER JOIN beginnen wir mit der Artikeltabelle und ergänzen dann die Bestellpositionen. "a" habe ich als Aliasnamen für die "artikel" und "p" für die "bestellpositionen" verwendet. "ON a.artnr = p.artikel". Sortiert habe ich das Ergebnis nach der Artikelbezeichnung. Dieser Spalte "Menge" habe ich "bestellmenge" als Aliasnamen vergeben. Und beim RIGHT OUTER JOIN haben wir nur die vertauschte Reihenfolge der Tabellen, um dasselbe Ergebnis zu erzielen. Um jetzt nur jene anzuzeigen, die noch nie bestellt worden sind, müssen wir wieder so filtern, aus der anderen Tabelle, in dem Fall aus den "bestellpositionen", hier null enthalten müssen. Und daher die zweite Lösung, also der zweite Teil der Lösung. Wir sehen jetzt hier die WHERE-Klausel ergänzt. Da habe ich noch einen unschönen Schreibfehler. Fehler ist es ja nicht, weil fürs Funktionieren ist ja Groß- und Kleinschreibung in SQL irrelevant, aber fürs Lesen ist es immer besser, wenn man Groß- und Kleinschreibung verwendet. Deshalb versuche ich das auch einzuhalten. "WHERE p.artikel IS NULL". Ich habe diesmal die Spalte aus der "JOIN"-Bedingung verwendet. Ich habe Ihnen schon gesagt, diese oder die Primärschlüsselspalte aus der anderen Tabelle sind sozusagen Einser-Bänke, die funktionieren immer, hier als Kriterium. Sie dürfen hier nie eine Spalte verwenden, die von sich aus NULL sein kann. Und wenn jetzt eine Spalte aus den "bestellpositionen" null ist, dann nur deshalb, weil es keine Zuordnung gibt. Damit bekommen wir genau diese 1.088 Artikel, aus unserer Tabelle, die noch nie bestellt worden sind. Das sind jetzt sehr viele. Das hängt damit zusammen, dass in der Tabelle "bestellpositionen" und auch in den "bestellungen" nur sehr wenige Testdatensätze enthalten sind. Wie unterscheiden sich die Lösungen für MySQL und Oracle? Nur sehr geringfügig, bis auf die Funktion ISNULL wird hier alles ident sein. Bei Oracle verwenden wir ja die gleiche Funktion mit dem Namen NVL, um NULL-Werte zu ersetzen. Sonst ist Syntax der Anweisung und auch die Funktion NVL gleich wie ISNULL-Funktion. Und wenn ich das hier ausführe, bekommen auch wir hier das Ergebnis, wie wir es schon vom Microsoft SQL Server her kennen, alle anderen Lösungen sind ident. Und die dritte im Bunde, MySQL liefert uns auch dasselbe Ergebnis, mit derselben Lösung, nur statt ISNULL oder NVL verwenden wir hier die Funktion IFNULL. die das gleiche erledigt, nämlich einen Null-Wert in der Menge durch die Ziffer "0" zu ersetzen. damit wir hier überall, wo noch nichts bestellt ist, "0" bekommen und nicht NULL. Auch hier führe ich die Anweisung noch einmal aus. damit Sie wirklich sehen, dass diese Anweisung zu diesem Ergebnis führt. Achten Sie beim OUTER JOIN also immer darauf, auf welcher Seite die Tabelle steht, aus der wir alles benötigen. Und um ein Ergebnis zu erzielen, bei dem wir alles aus einer Tabelle sehen, wo es in der anderen keine Entsprechung gibt, machen wir einen OUTER JOIN, und verwenden das Kriterium dass eine Spalte aus der anderen Tabelle die von sich aus nicht NULL sein kann, hier im Ergebnis sehr wohl NULL ist. Damit bekommen wir alle, für die es in dieser Tabelle keine Entsprechung gibt.

SQL Grundkurs 2: Aufgaben und Lösungen

Vertiefen Sie Ihre SQL-Kenntnisse. In diesem Workshop erhalten Sie zahlreiche Beispielaufgaben, die Sie selbst lösen können. Anschließend zeigt Ihnen der Trainer die Lösung.

7 Std. 41 min (61 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieses Training setzt SQL-Kenntnisse voraus, wie sie beispielsweise in „SQL lernen und anwenden“ vermittelt werden.

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!