Ergebnisse kombinieren mit UNION
Ein Join setzt Tabellen nebeneinander: die Spalten der einen neben die Spalten der anderen. UNION setzt die Ergebnisse zweier Abfragen untereinander: zuerst die Zeilen der ersten Abfrage, dann die der zweiten. Was im Shop seit August 2025 neu ist, neue Kunden und neue Spiele in einer Liste:
SELECT beigetreten AS tag, 'neuer Kunde' AS ereignis, name AS detail
FROM kunden
WHERE beigetreten >= '2025-08-01'
UNION ALL
SELECT erschienen, 'neues Spiel', titel
FROM spiele
WHERE erschienen >= '2025-08-01'
ORDER BY tag;| tag | ereignis | detail |
|---|---|---|
| 2025-08-21 | neuer Kunde | Sophie Arnold |
| 2025-09-26 | neues Spiel | Goal Rush |
| 2025-10-03 | neuer Kunde | Max Krause |
| 2025-11-14 | neues Spiel | Knight's Oath |
Beide Abfragen müssen dieselbe Anzahl von Spalten haben. Die Spalten werden nach ihrer Position zugeordnet, nicht nach ihren Namen: Die erste Spalte der zweiten Abfrage kommt unter die erste Spalte der ersten Abfrage und so weiter. Die Namen der Spalten stammen aus der ersten Abfrage, nur sie braucht also Aliase. Bei einer anderen Anzahl von Spalten bekommst du einen Fehler:
Error on line 1: SELECTs to the left and right of UNION do not have the same number of result columnsBeachte die Spalten 'neuer Kunde' und 'neues Spiel': Ein Text in Anführungszeichen gibt in jeder Zeile denselben Wert, und hier sagt er, woher jede Zeile stammt.
UNION ALL behält alle Zeilen. UNION ohne ALL entfernt doppelte Zeilen aus dem Ergebnis, so wie es DISTINCT tut. Die Spiele, die jemand bestellt oder bewertet hat, SELECT spiel_id FROM positionen UNION SELECT spiel_id FROM bewertungen, ergeben 17 Zeilen, jedes Spiel einmal. Mit UNION ALL sind es 67 Zeilen, eine für jede Position jeder Bestellung und eine für jede Bewertung. Wenn du weißt, dass es keine Duplikate geben kann, oder wenn du sie behalten willst, benutze UNION ALL: Die Datenbank muss nicht nach Duplikaten suchen, also ist es schneller.
ORDER BY steht nur einmal, ganz am Ende, und sortiert das ganze Ergebnis; dasselbe gilt für LIMIT. Es benutzt die Spaltennamen der ersten Abfrage, hier tag. Ein ORDER BY nach der ersten Abfrage endet mit ORDER BY clause should come after UNION not before.
Typischer Fehler: Spalten in einer anderen Reihenfolge. Hätte die zweite Abfrage SELECT titel, 'neues Spiel', erschienen, würde sich SQLite nicht beschweren: Es würde die Titel kommentarlos unter die Daten setzen. Prüfe, dass die Spalten beider Abfragen dasselbe bedeuten.
So schreibst du es:
Anweisungen
- 1
Zeige, wie viele Spiele jedes Genre hat, als
genreundanzahl_spiele, und füge eine weitere Zeile hinzu: den TextAlle Genresund die Zahl aller Spiele. Sortiere nachanzahl_spielevom höchsten Wert, dann nach dem Genre:genre anzahl_spiele Alle Genres 20 Action 4 Adventure 3 Strategie 3 … … - 2
Zeige darunter die Namen der Kunden, die die Chefin anrufen soll: die, bei denen eine Bestellung erstattet wurde, und die, die eine Bewertung mit weniger als 3 Sternen geschrieben haben. Jeder von ihnen soll nur einmal in der Liste stehen. Verbinde in der ersten Abfrage
kundenmitbestellungen, in der zweitenkundenmitbewertungen. Sortiere nach dem Namen:name Greta Hoffmann Jonas Hartmann Leon Wagner