Kurz: INSERT INTO nutzer (name, ort) VALUES (‘Mia’, ‘Berlin’); INSERT INTO nutzer (name, ort, punkte) VALUES (‘Tom’, ‘Hamburg’, 50), (‘Zoe’, NULL, 80); INSERT INTO nutzer (id, name) VALUES (10, ‘Ben’);
Teil des Kurses SQL
INSERT
CREATE TABLE nutzer (id INTEGER PRIMARY KEY, name TEXT NOT NULL, ort TEXT, punkte INTEGER DEFAULT 0);
INSERT INTO nutzer (name, ort) VALUES ('Mia', 'Berlin');
INSERT INTO nutzer (name, ort, punkte) VALUES ('Tom', 'Hamburg', 50), ('Zoe', NULL, 80);
INSERT INTO nutzer (id, name) VALUES (10, 'Ben');
SELECT * FROM nutzer;Ausgabe:
id name ort punkte
-- ---- ------- ------
1 Mia Berlin 0
2 Tom Hamburg 50
3 Zoe 80
10 Ben 0Gib die Spalten immer explizit an: Der Code bleibt gültig, wenn später Spalten hinzukommen. Fehlende Spalten bekommen den DEFAULT oder NULL.
Aus einer anderen Abfrage einfügen
CREATE TABLE a (n INTEGER);
CREATE TABLE b (n INTEGER);
INSERT INTO a VALUES (1), (2), (3), (4);
INSERT INTO b SELECT n * 10 FROM a WHERE n > 2;
SELECT * FROM b;Ausgabe:
n
--
30
40Konflikte behandeln (Upsert)
CREATE TABLE zaehler (wort TEXT PRIMARY KEY, anzahl INTEGER);
INSERT INTO zaehler VALUES ('a', 1);
INSERT INTO zaehler VALUES ('a', 1)
ON CONFLICT(wort) DO UPDATE SET anzahl = anzahl + 1;
INSERT OR IGNORE INTO zaehler VALUES ('a', 99);
INSERT INTO zaehler VALUES ('b', 1)
ON CONFLICT(wort) DO UPDATE SET anzahl = anzahl + 1;
SELECT * FROM zaehler ORDER BY wort;Ausgabe:
wort anzahl
---- ------
a 2
b 1ON CONFLICT ... DO UPDATE heißt in PostgreSQL gleich, in MySQL ON DUPLICATE KEY UPDATE.
UPDATE
CREATE TABLE konto (id INTEGER PRIMARY KEY, inhaber TEXT, stand REAL);
INSERT INTO konto VALUES (1,'Mia',100),(2,'Tom',50),(3,'Zoe',0);
UPDATE konto SET stand = stand + 25 WHERE id = 1;
UPDATE konto SET inhaber = 'Thomas', stand = 60 WHERE inhaber = 'Tom';
UPDATE konto SET stand = stand * 1.1 WHERE stand > 50;
SELECT * FROM konto;Ausgabe:
id inhaber stand
-- ------- -----
1 Mia 137.5
2 Thomas 66.0
3 Zoe 0.0Achtung
Ohne
WHEREändertUPDATEalle Zeilen. Teste die Bedingung vorher mit einemSELECT.
DELETE
CREATE TABLE logs (id INTEGER PRIMARY KEY, stufe TEXT, text TEXT);
INSERT INTO logs (stufe, text) VALUES ('info','a'),('fehler','b'),('info','c'),('debug','d');
DELETE FROM logs WHERE stufe = 'debug';
SELECT changes() AS geloescht;
DELETE FROM logs WHERE stufe IN ('info');
SELECT * FROM logs;Ausgabe:
geloescht
---------
1
id stufe text
-- ------ ----
2 fehler bDELETE FROM tabelle; leert die Tabelle (Struktur bleibt). TRUNCATE TABLE ist die schnelle Variante in PostgreSQL/MySQL (SQLite kennt es nicht).
RETURNING
Neuere SQLite- und PostgreSQL-Versionen liefern geänderte Zeilen direkt zurück:
CREATE TABLE t (id INTEGER PRIMARY KEY, name TEXT);
INSERT INTO t (name) VALUES ('x'), ('y') RETURNING id, name;
UPDATE t SET name = upper(name) WHERE id = 2 RETURNING *;Ausgabe:
id name
-- ----
1 x
2 y
id name
-- ----
2 YMerke
INSERT INTO t (spalten) VALUES (...)mit expliziten SpaltenUPDATE ... SET ... WHEREundDELETE ... WHERE: immer anWHEREdenken- Upsert:
ON CONFLICT DO UPDATE(MySQL:ON DUPLICATE KEY UPDATE) RETURNINGliefert betroffene Zeilen zurück- Mehrere Zeilen mit einem
INSERTsind schneller als viele einzelne
Übungsaufgabe
Lege eine Tabelle mit fünf Produkten an, erhöhe alle Preise unter 10 um 10 % und lösche das teuerste Produkt.
Quiz zur Selbstkontrolle
Was passiert bei UPDATE ohne WHERE?
- Alle Zeilen werden geändert (richtig)
- Nichts
- Nur die erste Zeile
- Es gibt einen Syntaxfehler
Wozu dient ON CONFLICT DO UPDATE?
- Bei Schlüsselkonflikt die vorhandene Zeile aktualisieren (richtig)
- Konflikte ignorieren und alles löschen
- Tabellen zusammenführen
- Transaktionen abbrechen
Was ist besser als INSERT INTO t VALUES (...)?
- INSERT mit expliziter Spaltenliste (richtig)
- INSERT ohne Werte
- INSERT ALL
- INSERT *
Weiter im Kurs
Zurück: Tabellen und Datentypen
Weiter: SELECT und WHERE
Alle Kapitel: SQL im Überblick