EMZETT.
Login

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

Kapitel 3 von 15 im Kurs SQL. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

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            0

Gib 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
40

Konflikte 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     1

ON 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.0

Achtung

Ohne WHERE ändert UPDATE alle Zeilen. Teste die Bedingung vorher mit einem SELECT.

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  b

DELETE 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   Y

Merke

  • INSERT INTO t (spalten) VALUES (...) mit expliziten Spalten
  • UPDATE ... SET ... WHERE und DELETE ... WHERE: immer an WHERE denken
  • Upsert: ON CONFLICT DO UPDATE (MySQL: ON DUPLICATE KEY UPDATE)
  • RETURNING liefert betroffene Zeilen zurück
  • Mehrere Zeilen mit einem INSERT sind 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

Weiter im Kurs

Zurück: Tabellen und Datentypen

Weiter: SELECT und WHERE

Alle Kapitel: SQL im Überblick