Abfrageergebnisse einfügen
Manchmal sind die Zeilen, die du hinzufügen willst, in der einen oder anderen Form schon in der Datenbank. Statt sie nach VALUES hinzuschreiben, kannst du sie von einer Abfrage finden lassen: INSERT INTO … SELECT … fügt jede Zeile hinzu, die die Abfrage findet.
Der Shop bereitet Deluxe-Editionen seiner RPGs vor, jede 10 € teurer als das Original, die am 01.03.2026 erscheinen. Jede von ihnen ist eine Kopie eines vorhandenen Spiels mit ein paar Änderungen:
INSERT INTO spiele (titel, genre, preis, erschienen, altersfreigabe)
SELECT titel || ' Deluxe', genre, preis + 10, '2026-03-01', altersfreigabe
FROM spiele
WHERE genre = 'RPG';Die Abfrage findet zwei RPGs, also fügt der INSERT zwei Spiele hinzu (Geänderte Zeilen: 2), mit den IDs 21 und 22:
| id | titel | genre | preis | erschienen |
|---|---|---|---|---|
| 21 | Dragon Forge Deluxe | RPG | 50 | 2026-03-01 |
| 22 | Knight's Oath Deluxe | RPG | 70 | 2026-03-01 |
Die Spalten der Abfrage kommen nach ihrer Reihenfolge in die aufgelisteten Spalten, nicht nach ihren Namen: die erste Spalte der Abfrage in die erste Spalte der Liste und so weiter. Deshalb kann die Abfrage titel || ' Deluxe' haben, wo die Tabelle titel hat, und feste Werte wie '2026-03-01', die in jeder Zeile gleich sind. Die Anzahl muss übereinstimmen: Wenn die Abfrage weniger Spalten hat als die Liste, bekommst du einen Fehler wie 3 values for 4 columns.
Die Abfrage kann alles sein, was du kennst: mit WHERE, Joins, GROUP BY oder Unterabfragen. Schreibe sie zuerst für sich, führe sie aus und prüfe ihr Ergebnis. Wenn sie genau die Zeilen zeigt, die du hinzufügen willst, setze die Zeile INSERT INTO darüber. Es ist derselbe Rat wie für das WHERE eines UPDATE: erst ansehen, dann ändern.
Typischer Fehler: Die Spalten der Abfrage stehen in einer anderen Reihenfolge als die Liste. Mit (kunde_id, bestellt_am, status) und SELECT id, 'bezahlt', '2026-01-01' würde das Datum in den Status kommen. Hier stoppt die Datenbank das mit CHECK constraint failed: status IN ('bezahlt', 'erstattet'), aber zwei Textspalten ohne Regel würden stillschweigend ihre Werte vertauschen.
So schreibst du es:
Anweisungen
- 1
Der Shop möchte sich bei seinen treuesten Kunden bedanken: Jeder, der mindestens 3 bezahlte Bestellungen aufgegeben hat, bekommt ein Geschenk. Schreibe einen
INSERT … SELECT, der für jeden von ihnen eine neue Bestellung vom 01.01.2026 mit dem Statusbezahlthinzufügt (das Geschenk kommt später in die Positionen). Finde die Kunden zuerst mit einer Abfrage: Gruppiere die bezahlten Bestellungen nach Kunde und behalte die mit mindestens 3. - 2
Zeige darunter den Kunden, das Datum und den Status der Bestellungen mit einer ID größer als 30, sortiert nach dem Kunden. Es sollten vier sein:
kunde_id bestellt_am status 1 2026-01-01 bezahlt 2 2026-01-01 bezahlt 3 2026-01-01 bezahlt 4 2026-01-01 bezahlt - 3
Das Geschenk ist Lost Temple (Spiel 9), ein Exemplar für 0 €. Füge es mit einem zweiten
INSERT … SELECTjeder der neuen Bestellungen als Position hinzu, die du an ihrem Datum findest. Zeige danach alle Positionen von Lost Temple, das vorher niemand gekauft hatte: den Namen des Kunden, der es bekommen hat, die Menge und den Preis, sortiert nach dem Namen. Es sollten nur die vier Geschenke sein:name menge preis Emma Becker 1 0 Lukas Neumann 1 0 Noah Winter 1 0 Olivia Braun 1 0