Zurück zur Artikelliste Artikel
7 Leseminuten

UNION und UNION ALL in SQL: Was sie tun und wie sie sich unterscheiden

In diesem Artikel werden wir uns mit den SQL-Klauseln UNION und UNION ALL beschäftigen. Erfahren Sie, was sie bewirken und wann sie zu verwenden sind.

Ich war wahrscheinlich vier Jahre lang Analytiker, bevor ich die SQL-Klausel UNION ALL kannte. Ich verwendete UNION regelmäßig, hatte aber noch nie von ihrem Gegenstück gehört. Eines Tages hörte ich, wie ein Kollege darüber sprach. Ich dachte mir: "Wovon spricht er? Ist das etwas Neues?" Also tat ich, was jeder gute Analytiker tun würde, und googelte es. Mein Herz sank. Wahrscheinlich hatte ich schon mehr als einmal die falsche Klausel in meinen Analysen verwendet.

Nach dem Studium brachte ich mir selbst SQL bei. Das Ergebnis war ein unvollständiges Verständnis der Syntax, die ich verwendete. Wenn Sie lernen, empfehle ich Ihnen dringend, formale Kurse zu besuchen, damit Sie sicher sein können, dass Sie die Abfragen, die Sie schreiben, vollständig verstehen. Eine gute Möglichkeit, dies zu tun, ist die Teilnahme an dem SQL für Anfänger Kurs. Machen Sie nicht die gleichen Fehler, die ich zu Beginn meiner Karriere gemacht habe. Besuchen Sie Kurse von Fachleuten und erwerben Sie ein solides Grundwissen über SQL.

Ich greife ein wenig zu weit vor. Lassen Sie uns einen Schritt zurücktreten und darüber sprechen, was UNION und UNION ALL in SQL tun.

UNION

Es kann vorkommen, dass ein Analytiker die Ergebnisse mehrerer Abfragen kombinieren muss. Das kann daran liegen, dass sich die Daten in verschiedenen Tabellen befinden, oder Sie haben bereits Abfragen, die Sie nun zu einer einzigen zusammenfassen müssen. Aus welchem Grund auch immer, die einfachste Lösung ist die Verwendung von UNION. Lassen Sie uns dies anhand eines Beispiels erläutern.

Beispiel #1 - UNION

In diesem Beispiel stellen wir uns vor, dass wir an der Analyse einiger Website-Daten arbeiten. Eine Tabelle, mit der wir arbeiten werden, heißt button_clicks. Diese Tabelle enthält alle Klickereignisse, die wir auf unserer Website verfolgen. Sie sieht wie folgt aus:

user_idtimestamplabel
1364782022-12-01 09:15:34continue
1364782022-12-01 09:15:34continue
1827362022-12-01 09:17:03submit
2736472022-12-01 09:18:00back
3475892022-12-01 09:21:48continue

Wir werden auch mit einer Tabelle namens: navigation_clicks. Diese Tabelle enthält alle Klickereignisse, die im Navigationsmenü der Website auftreten. Sie sieht wie folgt aus:

user_idtimestampnavigation_link
1364782022-12-01 09:10:15home
1364782022-12-01 09:12:12about_us
1827362022-12-01 09:17:59store
2736472022-12-01 09:21:30home
3475892022-12-01 09:18:17blog

Nehmen wir an, unser Manager kommt zu uns und sagt, dass er eine Liste aller Schaltflächenklicks auf der Website benötigt. Das ist einfach genug. Wir werden einfach loslegen:

SELECT *
FROM button_clicks

Ein paar Minuten später kommt er jedoch zu uns und bittet uns, auch die Navigationsklicks in unseren Bericht aufzunehmen. Klingt einfach, aber wie machen wir das? Indem wir die UNION Klausel verwenden. Um die Ergebnisse dieser beiden Abfragen miteinander zu kombinieren, führen wir aus:

SELECT *
FROM button_clicks
	
	UNION

SELECT *
FROM navigation_clicks

Wie Sie sehen, befindet sich die UNION Klausel zwischen den beiden SELECT Abfragen. Die Abfrage auf beiden Seiten der UNION -Klausel sollte als eigenständige Abfrage ausgeführt werden. Diese Abfrage gibt das Folgende zurück:

user_idtimestamplabel
1364782022-12-01 09:15:34continue
1827362022-12-01 09:17:03submit
2736472022-12-01 09:18:00back
3475892022-12-01 09:21:48continue
1364782022-12-01 09:10:15home
1364782022-12-01 09:12:12about_us
1827362022-12-01 09:17:59store
2736472022-12-01 09:21:30home
3475892022-12-01 09:18:17blog

Wir haben die Ergebnisse von zwei separaten Abfragen genommen und sie übereinander gelegt. Wir sehen, dass die ersten 4 Zeilen die Ergebnisse der ersten Abfrage und die nächsten 5 Zeilen die Ergebnisse der zweiten Abfrage enthalten.

Aber Moment... unsere Tabellen enthalten zusammen 10 Zeilen, warum haben wir also nur 9 Zeilen zurückgegeben? Das liegt daran, dass UNION Duplikate aus den Ergebnissen entfernt. Die ersten beiden Zeilen in der Tabelle button_clicks sind genau gleich, so dass UNION nur eine von ihnen zurückgegeben hat.

Umbenennen von Spalten in UNION

Achten Sie in der obigen Ergebnismenge auf die Spaltennamen. In der Tabelle button_clicks ist die dritte Spalte label, aber in der Tabelle navigation_clicks ist die dritte Spalte navigation_label. Wenn wir UNION verwenden, werden die Spaltennamen aus den Spaltennamen der ersten Abfrage übernommen, was wir oben sehen. Wenn Sie möchten, können Sie den Spalten jederzeit Aliasnamen hinzufügen, um sie nach Ihren Wünschen umzubenennen.

Wenn wir zum Beispiel den Namen der dritten Spalte in button_or_navigation_label ändern wollen, sollten wir diese Abfrage ausführen:

SELECT user_id, 
	 timestamp,
       label AS button_or_navigation_label
FROM button_clicks
	
	UNION

SELECT user_id, 
	 timestamp,
       navigation_label AS button_or_navigation_label
FROM navigation_clicks

Beispiel #2 - Verwendung der gleichen Anzahl von Spalten in UNION

Gehen wir ein weiteres Beispiel mit UNION durch. Zunächst nehmen wir eine kleine Änderung an unserer navigation_clicks Tabelle. Wir fügen eine weitere Spalte hinzu, so dass unsere Tabelle nun wie folgt aussieht:

user_idtimestampnavigation_linknavigation_level
1364782022-12-01 09:10:15homemain
1364782022-12-01 09:12:12about_ussub
1827362022-12-01 09:17:59storesub
2736472022-12-01 09:21:30homemain
3475892022-12-01 09:18:17blogsub

Wenn wir versuchen, unsere ursprüngliche Abfrage UNION erneut auszuführen, erhalten wir einen Fehler, der Each UNION query must have the same number of columns lautet. Das liegt daran, dass wir alle Tabellenspalten aus jeder Tabelle auswählen, aber die Anzahl der Spalten in den Tabellen ist jetzt unterschiedlich. Um dies zu beheben, müssen wir die Spalten, die wir zurückgeben möchten, explizit benennen. Außerdem muss die Anzahl der von jeder Abfrage zurückgegebenen Spalten gleich sein und der Typ sollte übereinstimmen. Wenn die dritte Spalte in der ersten Abfrage eine Zeichenkette ist, muss die dritte Spalte in der anderen Abfrage ebenfalls eine Zeichenkette sein.

Um Fehler zu vermeiden, führen wir aus:

SELECT user_id, 
 timestamp,
 label
FROM button_clicks
	
	UNION

SELECT user_id, 
 timestamp,
 	 navigation_label
FROM navigation_clicks

Dies liefert die gleichen Ergebnisse wie unser erstes UNION Beispiel.

Beispiel #3 - UNION ALL

Nachdem wir nun UNION verstanden haben, lassen Sie uns ein Beispiel mit UNION ALL durchgehen. Wie bereits erwähnt, entfernt UNION Duplikate aus unseren Abfrageergebnissen. UNION ALL wird dies nicht tun.

Lassen Sie uns auf unserem vorherigen Beispiel aufbauen. Unser Manager hat sich an uns gewandt und um einen Bericht gebeten, der alle Schaltflächen- und Navigationsklicks auf der Website enthält. Wir haben dann bestätigt, dass der Bericht auch Duplikate enthalten soll.

Da Sie bereits wissen, wie man UNION verwendet, können Sie sich denken, wie wir das machen würden? Richtig - wir ersetzen einfach UNION durch UNION ALL:

SELECT user_id, 
 timestamp,
 label
FROM button_clicks
	
	UNION ALL

SELECT user_id, 
 timestamp,
 	 navigation_label
FROM navigation_clicks
user_idtimestamplabel
1364782022-12-01 09:15:34continue
1364782022-12-01 09:15:34continue
1827362022-12-01 09:17:03submit
2736472022-12-01 09:18:00back
3475892022-12-01 09:21:48continue
1364782022-12-01 09:10:15home
1364782022-12-01 09:12:12about_us
1827362022-12-01 09:17:59store
2736472022-12-01 09:21:30home
3475892022-12-01 09:18:17blog

Es sind alle 10 Zeilen vorhanden. Wie Sie sehen können, hat UNION ALL alle Ergebnisse erhalten, auch wenn es Duplikate gibt.

Unsere Beispiele haben nur eine UNION oder UNION ALL Anweisung enthalten, aber es gibt keine Begrenzung für die Anzahl der Abfragen, die Sie zusammenführen können.

Ein letztes Beispiel: Nehmen wir an, wir möchten auch eine Tabelle namens form_clicks einbeziehen . Wir machen uns keine Gedanken über Duplikate, also verwenden wir weiterhin UNION ALL:

SELECT user_id, 
 timestamp,
 label
FROM button_clicks
	
	UNION ALL

SELECT user_id, 
 timestamp,
 	 navigation_label
FROM navigation_clicks

UNION ALL

SELECT user_id, 
 timestamp,
 	 form_label
FROM form_clicks

Wie Sie sehen, handelt es sich um genau dieselbe Syntax; wir fügen lediglich unsere bestehende Abfrage weiter hinzu. Wenn Sie mehr über UNION ALL erfahren möchten, sollten Sie unbedingt unseren Artikel über SQL Union All lesen!

UNION vs. UNION ALL - Die Entscheidung für die Verwendung

Es ist wichtig zu verstehen, dass eine Abfrage, die UNION ALL verwendet, schneller abläuft, als wenn Sie UNION verwenden würden. Das liegt daran, dass die UNION-Klausel die Daten sortiert und alle Duplikate entfernt. Je nachdem, wie viele Daten Sie abfragen, kann dies die Laufzeit Ihrer Abfrage beträchtlich verlängern.

Bei der Entscheidung, welche Klausel Sie verwenden sollen, müssen Sie sich nur die folgende Frage stellen:

  1. Muss ich doppelte Werte entfernen?
    1. Wenn ja, verwenden Sie UNION.
    2. Wenn nein (oder wenn es keine Rolle spielt), verwenden Sie UNION ALL.

Das war eine Menge, also nehmen wir uns etwas Zeit für einen Überblick! Sowohl UNION als auch UNION ALL sind Klauseln, die verwendet werden, um mehrere Abfragen zu einer Ergebnismenge zusammenzufassen. UNION entfernt Duplikate, während UNION ALL dies nicht tut. UNION ALL läuft deshalb schneller. Hier ist ein weiterer großartiger Artikel über SQL-Set-Operationen , um das soeben Gelernte zu festigen und zu erweitern.

Gut gemacht! Sie kennen jetzt sowohl UNION als auch UNION ALL genau und können entscheiden, welche davon Sie für Ihre Analysen verwenden wollen. Sie sind bereits einige Schritte weiter als ich, als ich noch lernte! Schauen Sie sich unbedingt unseren SQL für Anfänger Kurs und setzen Sie Ihre Reise zum SQL-Experten fort.