Kuonen SQL

Beispielkatalog

Jedes Beispiel ist zugleich ein Test: der Katalog läuft im Testlauf gegen einen echten Server und muss sein hinterlegtes Ergebnis liefern — was hier steht, ist genau das, was ausgeführt wird.

Typen

AUTO_INCREMENT und der übliche Spaltentyp

AUTO_INCREMENT vergibt die Schlüsselnummer selbst; DECIMAL rechnet exakt.

CREATE TABLE pruefstand_mitarbeiter (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), gehalt DECIMAL(9,2));
INSERT INTO pruefstand_mitarbeiter (name, gehalt) VALUES ('Anna', 5500.00);
SELECT id, name, gehalt FROM pruefstand_mitarbeiter;
DROP TABLE pruefstand_mitarbeiter;
Erwartetes Ergebnis
id | name | gehalt
1 | Anna | 5500.00

JSON und ENUM

JSON_EXTRACT liest einen Wert aus einer JSON-Spalte; ENUM erlaubt nur die aufgezählten Werte.

CREATE TABLE pruefstand_typen (id INT PRIMARY KEY, info JSON, status ENUM('offen', 'erledigt'));
INSERT INTO pruefstand_typen VALUES (1, '{"anzahl":3}', 'offen');
SELECT id, JSON_EXTRACT(info, '$.anzahl') AS anzahl, status FROM pruefstand_typen;
DROP TABLE pruefstand_typen;
Erwartetes Ergebnis
id | anzahl | status
1 | 3 | offen

DDL

CREATE TABLE IF NOT EXISTS und CREATE OR REPLACE VIEW

IF NOT EXISTS macht ein zweites CREATE TABLE ungefährlich; CREATE OR REPLACE tauscht eine Sicht ohne DROP davor.

CREATE TABLE IF NOT EXISTS pruefstand_orte (id INT PRIMARY KEY, name VARCHAR(30));
CREATE TABLE IF NOT EXISTS pruefstand_orte (id INT PRIMARY KEY, name VARCHAR(30));
INSERT INTO pruefstand_orte VALUES (1, 'Bern'), (2, 'Chur');
CREATE OR REPLACE VIEW pruefstand_sicht AS SELECT id, name FROM pruefstand_orte WHERE id = 1;
CREATE OR REPLACE VIEW pruefstand_sicht AS SELECT id, name FROM pruefstand_orte WHERE id = 2;
SELECT id, name FROM pruefstand_sicht;
DROP VIEW pruefstand_sicht;
DROP TABLE pruefstand_orte;
Erwartetes Ergebnis
id | name
2 | Chur

ALTER TABLE MODIFY/CHANGE und RENAME TABLE

MODIFY ändert einen Spaltentyp, CHANGE benennt eine Spalte um und ändert ihren Typ, RENAME TABLE die ganze Tabelle.

CREATE TABLE pruefstand_alter (id INT PRIMARY KEY, txt VARCHAR(10));
ALTER TABLE pruefstand_alter MODIFY txt VARCHAR(40);
ALTER TABLE pruefstand_alter CHANGE txt beschreibung VARCHAR(40);
RENAME TABLE pruefstand_alter TO pruefstand_umbenannt;
INSERT INTO pruefstand_umbenannt VALUES (1, 'Eine laengere Beschreibung');
SELECT id, beschreibung FROM pruefstand_umbenannt;
DROP TABLE pruefstand_umbenannt;
Erwartetes Ergebnis
id | beschreibung
1 | Eine laengere Beschreibung

DML

ON DUPLICATE KEY UPDATE

Trifft der Schlüssel schon zu, läuft der UPDATE-Teil statt eines Fehlers.

CREATE TABLE pruefstand_zaehler (id INT PRIMARY KEY, anzahl INT);
INSERT INTO pruefstand_zaehler (id, anzahl) VALUES (1, 1) ON DUPLICATE KEY UPDATE anzahl = anzahl + 1;
INSERT INTO pruefstand_zaehler (id, anzahl) VALUES (1, 1) ON DUPLICATE KEY UPDATE anzahl = anzahl + 1;
SELECT id, anzahl FROM pruefstand_zaehler;
DROP TABLE pruefstand_zaehler;
Erwartetes Ergebnis
id | anzahl
1 | 2

INSERT IGNORE und REPLACE

INSERT IGNORE übergeht einen Schlüsselkonflikt stillschweigend, REPLACE löscht die alte Zeile und setzt die neue.

CREATE TABLE pruefstand_unikate (id INT PRIMARY KEY, wert VARCHAR(30));
INSERT INTO pruefstand_unikate VALUES (1, 'Erste');
INSERT IGNORE INTO pruefstand_unikate VALUES (1, 'Zweite');
REPLACE INTO pruefstand_unikate VALUES (1, 'Dritte');
SELECT id, wert FROM pruefstand_unikate;
DROP TABLE pruefstand_unikate;
Erwartetes Ergebnis
id | wert
1 | Dritte

UPDATE mit ORDER BY und LIMIT

LIMIT begrenzt, wie viele Zeilen ein UPDATE/DELETE trifft; ORDER BY legt fest, welche.

CREATE TABLE pruefstand_limit (id INT PRIMARY KEY, wert INT);
INSERT INTO pruefstand_limit VALUES (1, 10), (2, 20), (3, 30);
UPDATE pruefstand_limit SET wert = wert + 1 ORDER BY id LIMIT 2;
SELECT id, wert FROM pruefstand_limit ORDER BY id;
DROP TABLE pruefstand_limit;
Erwartetes Ergebnis
id | wert
1 | 11
2 | 21
3 | 30

RETURNING

RETURNING gibt die eingefügte Zeile gleich mit dem INSERT zurück.

CREATE TABLE pruefstand_returning (id INT AUTO_INCREMENT PRIMARY KEY, wert INT);
INSERT INTO pruefstand_returning (wert) VALUES (42) RETURNING id, wert;
DROP TABLE pruefstand_returning;
Erwartetes Ergebnis
id | wert
1 | 42