Aufwärmen · Aufgabe 1 von 7
// B1.3 · ca. 30 Min. · Einstieg
Zeilen einfügen: viele auf einmal, NULL, DEFAULT und Anführungszeichen
Nach dieser Lektion laden Sie mehrere Zeilen mit einem INSERT, lassen Spalten gezielt leer, setzen Text und Daten richtig in Anführungszeichen und kopieren Zeilen aus einer Abfrage.
Danach können Sie
- Mehrere Zeilen in einer Anweisung mit Spaltenliste einfügen, dabei Spalten weglassen (NULL) oder DEFAULT nutzen
- Text mit '' für einen Apostroph schreiben, Daten als '2026-09-30' und Zahlen ohne Anführungszeichen
- Zeilen mit INSERT ... SELECT kopieren und die Fehler von INSERT lesen
Vorhersagen · Aufgabe 2 von 7
Sagen Sie es voraus, bevor Sie weiterlesen: Das Datum steht ohne Anführungszeichen, und die Spalte ist text. Was gibt das SELECT aus?
CREATE TABLE notes (body text); INSERT INTO notes VALUES (2026-09-30); SELECT body FROM notes;Üben · Aufgabe 3 von 7
Ergänzen Sie den Wert, damit die Zeile den Namen O'Brien speichert.
INSERT INTO members (id, name) VALUES (5, ____);INSERT INTO members (id, name) VALUES (5, );Üben · Aufgabe 4 von 7
Ordnen Sie jeder ERROR-Meldung ihre Ursache zu.
Üben · Aufgabe 5 von 7
Was liefert die letzte Anweisung?
CREATE TABLE books (id integer, title text, year integer); INSERT INTO books VALUES (1, 'Dune', 1965), (2, 'Emma', 1815), (3, 'Kindred', 1979); CREATE TABLE older_books (id integer, title text); INSERT INTO older_books SELECT id, title FROM books WHERE year < 1970; SELECT count(*) FROM older_books;Denksport · Aufgabe 6 von 7
Knobelaufgabe. Die beiden Tabellen führen ihre Spalten in unterschiedlicher Reihenfolge. Was gibt das letzte SELECT aus?
CREATE TABLE a (title text, author text); INSERT INTO a VALUES ('Dune', 'Frank Herbert'); CREATE TABLE b (author text, title text); INSERT INTO b SELECT * FROM a; SELECT author FROM b;Anwenden · Aufgabe 7 von 7
Mini-Aufgabe. Legen Sie members (id integer, name text, email text, city text, joined date) an und laden Sie die vier Mitglieder der Bibliothek mit einem INSERT samt Spaltenliste: 1 Ada, ada@example.com, Berlin, 2025-01-15; 2 Grace, grace@example.com, Munich, 2025-03-02; 3 Linus, keine E-Mail, Berlin, 2026-02-10; 4 Margaret, margaret@example.com, keine Stadt, 2026-05-20. Listen Sie sie nach id sortiert auf und prüfen Sie, dass die fehlenden Werte als leere Zellen erscheinen.
Prüfen Sie Ihr Ergebnis anhand dieser Liste
Selbst programmieren
Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.
Ausgearbeitetes Beispiel
Fünf Mitglieder, vier Wege zum Einfügen
Das Skript füllt members auf vier Arten: zwei Zeilen in einem INSERT, eine Zeile, deren Spaltenliste email weglässt, eine Zeile mit DEFAULT für city und ein Name mit Apostroph. Dann kopiert es die Berliner Mitglieder mit INSERT ... SELECT in eine zweite Tabelle. Führen Sie es aus und ergänzen Sie dann eine dritte Zeile im ersten INSERT. Auf Ihrem Computer führen Sie es mit psql -X -q -v ON_ERROR_STOP=1 -f main.sql aus.
main.sql
CREATE TABLE members (
id integer,
name text,
email text,
city text,
joined date
);
-- Several rows in one statement, with a column list.
INSERT INTO members (id, name, email, city, joined) VALUES
(1, 'Ada', 'ada@example.com', 'Berlin', '2025-01-15'),
(2, 'Grace', 'grace@example.com', 'Munich', '2025-03-02');
-- A column left out of the list gets no value: NULL.
INSERT INTO members (id, name, city, joined)
VALUES (3, 'Linus', 'Berlin', '2026-02-10');
-- DEFAULT asks for the column's default value, here NULL.
INSERT INTO members
VALUES (4, 'Margaret', 'margaret@example.com', DEFAULT, '2026-05-20');
-- An apostrophe inside text is written twice.
INSERT INTO members (id, name, city)
VALUES (5, 'Siobhan O''Brien', 'Dublin');
SELECT * FROM members ORDER BY id;
-- Copy rows with INSERT ... SELECT.
CREATE TABLE berlin_members (id integer, name text);
INSERT INTO berlin_members (id, name)
SELECT id, name FROM members WHERE city = 'Berlin';
SELECT * FROM berlin_members ORDER BY id;
Ausführen mit
psql -X -q -v ON_ERROR_STOP=1 -f main.sqlAusgabe
id | name | email | city | joined
----+-----------------+----------------------+--------+------------
1 | Ada | ada@example.com | Berlin | 2025-01-15
2 | Grace | grace@example.com | Munich | 2025-03-02
3 | Linus | | Berlin | 2026-02-10
4 | Margaret | margaret@example.com | | 2026-05-20
5 | Siobhan O'Brien | | Dublin |
(5 rows)
id | name
----+-------
1 | Ada
3 | Linus
(2 rows)- NULL erscheint als leere Zelle: Linus hat keine email, Margaret keine city, Siobhan weder email noch joined.
- Der Name wird mit einem Apostroph gespeichert: Das doppelte '' im SQL steht für eines.
- DEFAULT ergab NULL, weil die Tabelle für city keinen anderen Standardwert festlegt.
- INSERT ... SELECT kopierte die beiden Zeilen mit city Berlin und keine anderen.
Ändern und ausführen
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser PostgreSQL herunter (bis zu 10.1 MB) und speichert es im Cache. Jeder Lauf beginnt mit einer leeren Datenbank. Ihr Code bleibt auf Ihrem Gerät.
Übungen
Übung 1 von 2
Drei Rezensionen in einem INSERT
setup.sql hat eine leere Tabelle reviews (id, book_id, reviewer, stars, written) angelegt. Fügen Sie drei Rezensionen in einem INSERT mit Spaltenliste ein: 1, Buch 1, Ada, 5 Sterne, geschrieben am 2026-09-12; 2, Buch 3, Siobhan O'Brien, 4 Sterne, geschrieben am 2026-09-20; 3, Buch 1, Grace, 3 Sterne, Datum unbekannt (NULL). Das SELECT listet sie dann auf.
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser PostgreSQL herunter (bis zu 10.1 MB) und speichert es im Cache. Jeder Lauf beginnt mit einer leeren Datenbank. Ihr Code bleibt auf Ihrem Gerät.
Hinweise
Hinweis 1
Ein INSERT INTO reviews (id, book_id, reviewer, stars, written) VALUES, dann drei Zeilen in Klammern, durch Kommas getrennt.
Hinweis 2
Der Apostroph in O'Brien wird doppelt geschrieben: 'Siobhan O''Brien'.
Hinweis 3
Eine Zeile eines mehrzeiligen VALUES braucht alle fünf Werte; schreiben Sie NULL (ohne Anführungszeichen) oder DEFAULT für das unbekannte Datum.
Eine Lösung zeigen
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
INSERT INTO reviews (id, book_id, reviewer, stars, written) VALUES
(1, 1, 'Ada', 5, '2026-09-12'),
(2, 3, 'Siobhan O''Brien', 4, '2026-09-20'),
(3, 1, 'Grace', 3, NULL);
SELECT * FROM reviews ORDER BY id;
Auf dem eigenen Computer ausführen
Installieren Sie PostgreSQL 18 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.sql
-- setup.sql has created the empty table reviews.
-- Add the three reviews here, in one INSERT.
SELECT * FROM reviews ORDER BY id;
test.sql
-- test: Die Tabelle enthält drei Rezensionen
SELECT count(*) = 3 FROM reviews;
-- test: Rezension 2 stammt von Siobhan O'Brien, mit einem Apostroph
SELECT EXISTS (SELECT 1 FROM reviews WHERE id = 2 AND reviewer = 'Siobhan O''Brien');
-- test: Rezension 3 hat kein Datum (NULL), keinen Text wie 'NULL'
SELECT EXISTS (SELECT 1 FROM reviews WHERE id = 3 AND written IS NULL);
-- test: Das Skript listet die drei Rezensionen auf
-- output:
-- id | book_id | reviewer | stars | written
-- ----+---------+-----------------+-------+------------
-- 1 | 1 | Ada | 5 | 2026-09-12
-- 2 | 3 | Siobhan O'Brien | 4 | 2026-09-20
-- 3 | 1 | Grace | 3 |
-- (3 rows)
setup.sql
CREATE TABLE reviews (
id integer,
book_id integer,
reviewer text,
stars integer,
written date
);
psql führt die Dateien auf Ihrem eigenen PostgreSQL-Server aus. Nehmen Sie eine leere Datenbank, die Sie wegwerfen können: Hängen Sie -d und ihren Namen an den Befehl an.
Programm ausführen:
psql -X -q -v ON_ERROR_STOP=1 -f setup.sql -f main.sqlFür die Prüfungen gibt es auf Ihrem Computer noch keinen Befehl. Sie stehen in test.sql: Jede Prüfabfrage gibt t aus, wenn sie besteht.
Übung 2 von 2
Die Science-Fiction kopieren
setup.sql hat books mit sechs Büchern und eine leere Tabelle sci_fi (id, title, year) angelegt. Füllen Sie sci_fi mit einem INSERT ... SELECT, das id, title und year jedes Buchs mit dem genre 'sci-fi' kopiert. Tippen Sie die Zeilen nicht selbst ab: Die Abfrage findet sie. Das SELECT listet dann die Kopien auf, die älteste zuerst.
Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.
Beim ersten Ausführen lädt Ihr Browser PostgreSQL herunter (bis zu 10.1 MB) und speichert es im Cache. Jeder Lauf beginnt mit einer leeren Datenbank. Ihr Code bleibt auf Ihrem Gerät.
Hinweise
Hinweis 1
Schreiben Sie zuerst die Abfrage allein: SELECT id, title, year FROM books WHERE genre = 'sci-fi';
Hinweis 2
Setzen Sie dann INSERT INTO sci_fi (id, title, year) davor, ohne VALUES.
Hinweis 3
Die Spalten der Abfrage füllen die Zielspalten nach Position: id, title, year auf beiden Seiten in derselben Reihenfolge.
Eine Lösung zeigen
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
INSERT INTO sci_fi (id, title, year)
SELECT id, title, year FROM books WHERE genre = 'sci-fi';
SELECT * FROM sci_fi ORDER BY year;
Auf dem eigenen Computer ausführen
Installieren Sie PostgreSQL 18 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.
main.sql
-- setup.sql has created books (6 rows) and the empty table sci_fi.
-- Copy the sci-fi books into sci_fi here.
SELECT * FROM sci_fi ORDER BY year;
test.sql
-- test: sci_fi enthält die drei Science-Fiction-Bücher
SELECT count(*) = 3 FROM sci_fi;
-- test: Jede kopierte Zeile hat Titel und Jahr ihres Buchs
SELECT count(*) = 3 FROM sci_fi s JOIN books b ON b.id = s.id AND b.title = s.title AND b.year = s.year AND b.genre = 'sci-fi';
-- test: Das Skript listet die Kopien auf, die älteste zuerst
-- output:
-- id | title | year
-- ----+-------------+------
-- 1 | Dune | 1965
-- 3 | Kindred | 1979
-- 6 | Neuromancer | 1984
-- (3 rows)
setup.sql
CREATE TABLE books (
id integer,
title text,
author text,
year integer,
genre text,
copies integer
);
INSERT INTO books VALUES
(1, 'Dune', 'Frank Herbert', 1965, 'sci-fi', 2),
(2, 'Emma', 'Jane Austen', 1815, 'classic', 1),
(3, 'Kindred', 'Octavia E. Butler', 1979, 'sci-fi', 1),
(4, 'Beloved', 'Toni Morrison', 1987, 'fiction', 1),
(5, 'The Hobbit', 'J. R. R. Tolkien', 1937, 'fantasy', 3),
(6, 'Neuromancer', 'William Gibson', 1984, 'sci-fi', 1);
CREATE TABLE sci_fi (
id integer,
title text,
year integer
);
psql führt die Dateien auf Ihrem eigenen PostgreSQL-Server aus. Nehmen Sie eine leere Datenbank, die Sie wegwerfen können: Hängen Sie -d und ihren Namen an den Befehl an.
Programm ausführen:
psql -X -q -v ON_ERROR_STOP=1 -f setup.sql -f main.sqlFür die Prüfungen gibt es auf Ihrem Computer noch keinen Befehl. Sie stehen in test.sql: Jede Prüfabfrage gibt t aus, wenn sie besteht.
Häufige Fehler
Mehr Werte als Spalten
INSERT INTO members (id, name) VALUES (1, 'Ada', 'Berlin');
Was psql ausgibt
ERROR: INSERT has more expressions than target columnsWarum, und die Lösung
Die Spaltenliste nennt zwei Spalten, die Zeile hat aber drei Werte, und PostgreSQL rät nicht, wohin 'Berlin' gehört. Nehmen Sie die Spalte in die Liste auf, INSERT INTO members (id, name, city) VALUES (1, 'Ada', 'Berlin');, oder streichen Sie den überzähligen Wert. Bei zu wenigen Werten lautet die Meldung umgekehrt: INSERT has more target columns than expressions.
Ein Apostroph, der den Text beendet
INSERT INTO members (id, name) VALUES (5, 'O'Brien');
Was psql ausgibt
ERROR: syntax error at or near "Brien"Warum, und die Lösung
Das einfache Anführungszeichen in O'Brien beendet den Text nach O, also liest PostgreSQL Brien als verirrtes Wort und hält dort an. Schreiben Sie einen Apostroph im Text als zwei einfache Anführungszeichen: 'O''Brien'. Gespeichert wird er einfach.
Ein Datum ohne Anführungszeichen
INSERT INTO members (id, name, joined) VALUES (1, 'Ada', 2025-01-15);
Was psql ausgibt
ERROR: column "joined" is of type date but expression is of type integerWarum, und die Lösung
Ohne Anführungszeichen ist 2025-01-15 eine Subtraktion mit dem Ergebnis 2009, einer ganzen Zahl, und eine date-Spalte nimmt keine ganze Zahl an. Setzen Sie das Datum in Anführungszeichen: '2025-01-15'. Dann liest PostgreSQL den Text als Datum. In einer text-Spalte gibt derselbe Fehler keine Meldung und speichert 2009; setzen Sie Daten also überall in Anführungszeichen.
PostgreSQL im Browser: PGlite 0.5.8 (PostgreSQL 18.3), Apache-2.0 und PostgreSQL License. Lizenz und Quellcode
Abschlussquiz
5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.
Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.