Level 13: Ergebnisse kombinieren: UNION, INTERSECT, EXCEPT
Aktualisiert am
Mittelstufe · Level 13 von 20. Ziel: Die Ergebnisse zweier Abfragen stapeln, schneiden oder voneinander abziehen.
Themen: UNION UNION ALL INTERSECT EXCEPT
Lektion
Bisher lieferte eine Abfrage ein einziges Ergebnis. Mengenoperatoren verbinden die Ergebnisse zweier Abfragen, so wie man zwei Listen verbindet. Man schreibt ein vollständiges SELECT, den Operator und dann ein zweites vollständiges SELECT.
Bedingung: Beide SELECT müssen dieselbe Anzahl von Spalten liefern, von gleicher Art und in derselben Reihenfolge. SQL ordnet die Spalten nach Position zu, nicht nach Namen: die erste der ersten, die zweite der zweiten. Das Ergebnis übernimmt die Spaltennamen des ersten SELECT.
UNION stapelt beide Ergebnisse und entfernt Duplikate: Eine Person, die in beiden Klubs ist, erscheint nur einmal. UNION ALL stapelt alles, Duplikate eingeschlossen; es ist schneller, da es keine Duplikate suchen muss. Verwende UNION ALL, wenn Duplikate unmöglich oder gewollt sind.
INTERSECT behält nur die Zeilen, die in beiden Ergebnissen vorkommen: die Mitglieder beider Klubs. EXCEPT behält die Zeilen des ersten Ergebnisses, die im zweiten fehlen: die Schachspieler, die keine Musik machen. EXCEPT ist nicht symmetrisch: Vertauscht man die beiden Abfragen, ändert sich die Frage.
Zeilen werden als Ganzes verglichen: ('Claire', 'Paris') und ('Claire', 'Lyon') sind zwei verschiedene Zeilen, die UNION beide behält.
Man kann eine konstante Spalte hinzufügen, um zu erkennen, woher jede Zeile stammt: SELECT 'hotel' AS kind, name FROM hotels UNION ALL SELECT 'guest', name FROM guests.
Nur ein einziges ORDER BY ist erlaubt, ganz am Ende: Es sortiert das kombinierte Ergebnis und verwendet die Spaltennamen des ersten SELECT.
Syntax
SELECT col
FROM a
UNION
SELECT col
FROM b; -- oder UNION ALL, INTERSECT, EXCEPTKommentiertes Beispiel
SELECT member
FROM chess
UNION
SELECT member
FROM music;Alle Mitglieder von mindestens einem der beiden Clubs. Claire und David, in beiden eingeschrieben, erscheinen nur einmal.
| member |
|---|
| Alice |
| Bob |
| Claire |
| David |
| member |
|---|
| Claire |
| David |
| Emma |
| Farid |
Ergebnis des Beispiels
| member |
|---|
| Alice |
| Bob |
| Claire |
| David |
| Emma |
| Farid |
Das Wichtigste
- Auf beiden Seiten gleich viele Spalten.
- UNION entfernt Duplikate, UNION ALL behält alles.
- INTERSECT = in beiden; EXCEPT = im ersten, aber nicht im zweiten.
Häufige Fallen
- Ein ORDER BY steht nur einmal, ganz am Ende, und gilt für das kombinierte Ergebnis.
- EXCEPT ist nicht symmetrisch: A EXCEPT B ist nicht B EXCEPT A.
Die 5 Übungen des Levels
- Zeige die Personen, die sowohl im Schachclub als auch im Musikclub sind.
- Zeige die Personen, die im Schachclub, aber nicht im Musikclub sind.
- Zeige ohne Duplikate alle Städte, in denen es ein Hotel oder einen Flughafen gibt.
- Zeige in einer einzigen Liste die Namen der Hotels und die Namen der Gäste, mit einer ersten Spalte kind, die 'hotel' oder 'guest' ist.
- Alle Hotels liegen in Frankreich. Zeige die Stadt jedes Hotels und die jedes französischen Flughafens, mit einer Spalte source, die 'hotel' oder 'airport' ist. Sortiere das Ergebnis nach Stadt und dann nach Quelle. Eine Stadt erscheint einmal pro Hotel oder Flughafen: Paris hat zwei Hotels, also zwei Zeilen „Paris, hotel“.
In SpeedQL wird jede Abfrage sofort geprüft: Ihr Ergebnis wird mit dem erwarteten verglichen, dann läuft die Abfrage noch einmal auf einer versteckten Kontrolldatenbank. Zu jeder Übung gibt es schriftliche Hinweise, die du nur bei Bedarf aufrufst.
Die Übungen von Level 13 machen
Kostenlos und ohne Anmeldung: Die Lektion und die 5 Übungen öffnen sich direkt in deinem Browser.
← Vorheriges Level: Fehlende Werte (NULL) behandeln · Nächstes Level: Abfragen in Abfragen: Unterabfragen →