Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

SQL Grundkurs 1: Die Sprache erlernen

UNION

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Eine Gesamtliste aus mehreren Teillisten zu erzeugen, das ist die Aufgabe von UNION. Sehen Sie in diesem Video, wie Sie aus mehreren Tabellen mit Adressdaten eine einzige Liste kreieren.

Transkript

In diesem Video zeige ich Ihnen, wie Sie UNION dazu verwenden können, um mehrere separat erzeugte Teilergebnisse zu einem Gesamtergebnis zusammenzufügen. Dafür möchte ich folgendes Beispiel verwenden. Und zwar wollen wir unsere Kunden, Lieferanten und Mitarbeiter in einer gesamten Liste ausgeben. Das heißt, wir müssen drei separate Anweisungen schreiben: einmal für die Kunden, einmal für die Lieferanten, und einmal für die Mitarbeiter. Ich fange mit den Kunden an: "SELECT * FROM wawi.Kunden". Wir holen uns hier den Nachnamen, den Vornamen und den akademischen Grad, sowie Adressdaten, angefangen von der Straße, der Postleitzahl und dem Ort. Das Länderkennzeichen werden wir auch noch ausgeben, das machen wir vor der Postleitzahl. Die erste Anweisung gibt hier jeweils die Struktur des Ergebnisses vor. Das heißt, sie definiert, wie viele Spalten es gibt und welche Überschriften diese haben und welche Datentypen diese aufweisen. Alle anderen nachfolgenden Anweisungen müssen quasi von unten an diese andocken und sich an diese Struktur anpassen. Jetzt kann es in der Praxis vorkommen, so wie bei unseren Lieferanten, dass diese von der Struktur nicht dazu passen, denn in der Lieferantentabelle, sehen wir uns das einmal an, haben wir keinen Vornamen, und keinen Nachnamen, dafür haben wir die Firmenbezeichnung 1 und Firmenbezeichnung 2 für sehr lange Firmenbezeichnungen. Was hier gleich ist, ist, dass wir die Straße, das Länderkennzeichen und die Postleitzahl, sowie den Ort verwenden können. Aber die Struktur passt natürlich nicht eins-zu-eins. Was machen wir nun? Nachdem die erste Anweisung die Struktur vorgibt, müssen wir hier für alle Eventualitäten vorbauen, d.h. für die Spalten Firma 1 und Firma 2, die wir hier noch nicht haben, müssen wir sogenannte Dummy-Spalten hier einbauen. Das heißt, ich ergänze jetzt hier einerseits "NULL as Firma1" und danach "NULL as Firma2". Das sind sozusagen die zwei Dummy-Spalten für nachfolgende. Das heißt, wenn ich diese Anweisungen nun ausführe, dann haben wir-- diese Spalten hier sind zwar leer, aber die nachfolgenden Anweisungen können hier andocken. Nun haben wir aber hier, in der nachfolgenden Anweisung, keine Spalten wie "Nachname", "Vorname" und "Akademischer Grad". Deshalb müssen wir hier, quasi so wie beim Dummy vorhin auch, diese Spalten explizit mit "NULL" befüllen. Ich muss hier dreimal "NULL" eintippen, weil ich genau diese drei Spalten hiermit befüllen möchte. Ich empfehle Ihnen, bei allen einzelnen Anweisungen an derselben Stelle jeweils einen Zeilenumbruch im "SELECT" zu machen, wenn Sie einen machen, weil dann bleibt die Übersicht besser gewahrt. Jetzt haben wir dieses Teilergebnis und dieses Teilergebnis, und diese passen von der Struktur her zusammen. Ich kann hier in der nachfolgenden Alias-Namen vergeben, muss ich aber nicht, weil die nachfolgende ohnehin von der vorherigen diese erbt. Damit ich diese zwei nun zusammenfüge, muss ich dazwischen das Schlüsselwort "UNION" ergänzen. "UNION" wirkt an sich wie ein Distinkt. Das heißt, wenn ich diese Anweisungen jetzt gemeinsam ausführe, habe ich jetzt nicht nur eine gemeinsame Liste, sondern das System sortiert mir auch schon, weil es versucht Duplikate auszuschließen. Das heißt, hätte ich also theoretisch Kunden, die zugleich Lieferanten sind, oder umgekehrt und diese wären exakt gleich in beiden Tabellen erfasst, würden sie nur einmal angezeigt werden. Wenn ich diesen Distinkt-Mechanismus deaktivieren möchte, weil ich ihn nicht brauche, dann verwende ich anstelle von "UNION" einfach den Zusatz "UNION ALL". Dann werden die Daten nicht sortiert, sondern einfach der Reihe nach, so wie sie von den einzelnen Anweisungen geliefert werden, drangehängt. Jetzt habe ich hier mein Ergebnis, so wie sie geliefert werden. Zuerst die Kunden und hinten dann die Mitarbeiter. Ich habe noch keine Sortierung hier definiert. Nun möchte ich noch ein drittes Ergebnis hinten ergänzen, wieder mit "UNION ALL", diesmal sollen es die Mitarbeiter sein. "SELECT * FROM wawi.Personal", und die Spalten, die ich hier verwende, haben glücklicherweise denselben Namen, wie in der Kundentabelle, deshalb kann ich mir das hier kopieren. Auch bei den Mitarbeitern gibt es natürlich keine Firma, deshalb wähle ich hier meine zwei NULL-Dummy-Werte hier einfügen, bevor ich letztendlich hier noch abschließend die Adressfelder ergänze. Sie müssen natürlich aufpassen, wenn Sie hinten ergänzen, dass Sie das Semikolon hier auch an die letzte Position verschieben, denn sonst bekommen Sie hier natürlich einen Fehler für den hinteren Teil der Anweisung. Nun haben wir alle drei Einzelergebnisse mit zweimal "UNION" zusammengefügt, und wir können das Ergebnis uns anschauen. Wir haben jetzt hier unsere Kunden, dann gefolgt von den Lieferanten, die hier erfasst sind und letztendlich hier noch von unseren Mitarbeitern gefolgt werden. Dass hier sehr viele NULL-Werte enthalten sind, hängt damit zusammen, dass nicht alle Testdaten vollständig hier erfasst worden sind. Aber wir haben jetzt hier eine Gesamtliste, die aus drei Einzelergebnissen gebildet worden ist. Wie haben wir nun vorzugehen, wenn wir hier filtern? Und zwar müssen wir die WHERE-Klausel separat bei jeder Einzelanweisung anwenden. Das heißt, wenn ich z.B. nur die Adressen aus Deutschland hier jeweils aufnehmen möchte, dann muss ich hier in "summe" dreimal eine WHERE-Klausel ergänzen. Machen wir das hier einmal. Das heißt, ich muss einerseits immer hier beim Kunden definieren, "WHERE Länderkennzeichen Land = 'D'", muss aber dasselbe auch hier bei den Lieferanten machen und dasselbe auch hier letztendlich bei den Mitarbeitern. Das wirkt auf den ersten Blick vielleicht umständlich, dass man das nicht einmal für alle gemeinsam machen kann, hat aber auf den zweiten Blick den Vorteil, dass wir ja durchaus unterschiedliche Kriterien bei einzelnen Teilergebnissen verwenden können. Es muss ja nicht immer so sein wie hier bei diesem Beispiel, dass bei allen drei dieselbe Filterung benötigt wird. Nun führe ich auch diese Anweisung einmal aus. Wir haben jetzt weniger Adressen und alle nur mehr, die hier beim Länderkennzeichen auf "D", auf Deutschland gefiltert sind. WHERE-Klausel wird also bei jeder Einzelanweisung separat benötigt. Anders ist es beim Sortieren: beim Sortieren wird einmal am Ende für alle gemeinsam. Ich kopiere mir wieder die bisherige Anweisung, füge sie mir hier am Ende noch einmal ein, und jetzt ergänzen wir hier eine Sortierung. Sortierung wird nicht bei jeder Anweisung separat, sondern einmal am Ende, "ORDER BY", z.B. nehme ich jetzt hier den Nachnamen und den Vornamen, bzw. ich kann anstelle des Vornamens, oder zusätzlich, auch noch die Firma 1 ergänzen, weil ja die Firmen sonst in keiner Weise sortiert werden, weil sie ja weder Vor-, noch Nachname besitzen. Also: WHERE-Klausel separat für jede Anweisung "ORDER BY" einmal am Ende und diese wirkt für alle gemeinsam. Sehen wir uns das Ergebnis an. Nun haben wir hier Mitarbeiter und Kunden sowie Lieferanten aus Deutschland in einer Liste. Einen Tipp möchte ich Ihnen noch geben: Manchmal wäre es ganz hilfreich, hier auch im Endergebnis noch zu wissen, woher die einzelnen Zeilen ursprünglich stammen, ob das jetzt ein Kunde, ein Mitarbeiter, oder ein Lieferant ist. Aus diesem Grund ergänze ich typischerweise Dummy-Spalten mit irgendeinem Kürzel. Das mache ich typischerweise so, dass ich einfach bei der ersten Anweisung hier beginne, und z.B. in dem Fall sind es Kunden, also ein "K" z.B. "AS Typ" vergebe ich als Alias-Name für diese Spalte, und dann brauche ich bei den weiteren nur mehr analog vorgehen. Das heißt, bei den Lieferanten ergänze ich ein "L", den Alias-Namen muss ich ja hier bei der zweiten nicht mehr vergeben und bei dem dritten, Personaltabelle, für die Mitarbeiter ein "P". Jetzt habe ich hier eine zusätzliche Spalte und kann mir das Ergebnis wieder ansehen, und jetzt weiß ich zusätzlich hier, wenn ich mir die Daten anschaue, immer: aha, das ist ein Lieferant, das war ein Kunde, das ist ein Mitarbeiter und kann somit die Daten auch besser rückverfolgen. Einen wichtigen Hinweis habe ich noch für Oracle-Anwender. Prinzipiell ist ja diese Syntax bei allen drei Systemen des SQL Server, Oracle und MySQL identisch. Allerdings, wenn Sie diese Anweisung eins-zu-eins für Oracle übernehmen, laufen Sie vorerst auf einen Fehler auf. Ich kopiere mir die Anweisung hierher und führe sie einmal aus. Und zwar bekommen wir hier die Fehlermeldung "Ungültige Spalte Nachname". Woran liegt das? Ich habe Ihnen vorhin gesagt, dass Sie bei nachfolgenden Anweisungen den Alias-Namen nicht vergeben müssen. Prinzipiell gilt das bei Oracle auch, aber nur solange Sie nicht nach dieser Spalte sortieren. Das heißt, ich werde die "ORDER BY"-Klausel kurz deaktivieren, und dann werden Sie sehen, dass die Anweisung sehr wohl funktioniert. Das Problem, das sich hier jetzt ergibt, ist, dass ich hier nach Nachname und Vorname sortiere, aber diese hier in der Mitte, bei der mittleren Anweisung, bei den Lieferanten, nicht definiert sind. Und nur für die Sortierung, wenn ich es verwende, braucht Oracle das. Das heißt, um dieses Problem zu lösen, ergänze ich jetzt hier einmal den Alias-Name "AS Nachname" und hier einmal "AS Vorname". Das ändert zwar prinzipiell jetzt nichts an der Anweisung, aber jetzt laufen wir nicht mehr auf diesen Fehler auf und können diese Anweisung mit Sortierung sauber ausführen. Sie haben in diesem Video gesehen, wie Sie mittels "UNION" mehrere Teilergebnisse, die Sie über einzelne "SELECT"-Statements erhalten, zu einem Gesamtergebnis zusammenfügen können. Wichtig ist, dass Sie dabei darauf achten, dass alle Einzelanweisungen dieselbe Struktur haben, dass alle Spalten, die erst später vorkommen, zuerst mittels Dummy-Werten definiert werden müssen und dass Sie die WHERE-Klausel bei jeder Anweisung separat verwenden müssen und das Sortieren am Ende der Anweisung einmal für alle gemeinsam vornehmen.

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!