🛠️DDL und DML
DDL (Data Definition Language) beschreibt die Struktur: CREATE, ALTER, DROP. DML (Data Manipulation Language) ändert Inhalte: INSERT, UPDATE, DELETE, MERGE. Dazu kommen DQL (SELECT), DCL (GRANT, REVOKE) und TCL (COMMIT, ROLLBACK).
🔍Was ändert sich? Vorher/Nachher
Grün = neu, gelb = geändert, rot = gelöscht. Die Anweisung lässt sich frei bearbeiten.
Neue Zeilen (grün). Nicht genannte Spalten bekommen ihren DEFAULT bzw. NULL.
Jede Ausführung startet mit frischen Beispieldaten.
Tabelle autoren nach der Änderung
SQL-Engine wird geladen …
🏗️DDL: Tabellen anlegen und ändern
CREATE TABLE rezensionen ( rezension_id INTEGER PRIMARY KEY, -- Primärschlüssel buch_id INTEGER NOT NULL REFERENCES buecher (buch_id) ON DELETE CASCADE, -- Buch weg → Rezensionen weg kunde_id INTEGER REFERENCES kunden (kunde_id) ON DELETE SET NULL, sterne INTEGER NOT NULL CHECK (sterne BETWEEN 1 AND 5), text TEXT, erstellt TEXT NOT NULL DEFAULT CURRENT_DATE, UNIQUE (buch_id, kunde_id) -- eine Rezension pro Buch und Person ); ALTER TABLE rezensionen ADD COLUMN hilfreich INTEGER DEFAULT 0; CREATE INDEX idx_rez_buch ON rezensionen (buch_id); DROP TABLE IF EXISTS alte_tabelle;
💡 Datentypen unterscheiden sich
Standard:
INTEGER, DECIMAL(10,2), VARCHAR(n), DATE, BOOLEAN. SQLite speichert flexibel (Type Affinity) – ein TEXT in einer INTEGER-Spalte ist dort erlaubt, außer bei STRICT-Tabellen. Geldbeträge in echten Systemen als DECIMAL, nicht als Gleitkommazahl.💡 Automatische IDs
Standard:
GENERATED ALWAYS AS IDENTITY (PostgreSQL, Oracle, DB2) · MySQL/MariaDB: AUTO_INCREMENT · SQL Server: IDENTITY(1,1) · SQLite: INTEGER PRIMARY KEY (Alias der rowid).⚠️ DDL und Transaktionen
PostgreSQL und SQLite können DDL zurückrollen. MySQL/MariaDB und Oracle bestätigen bei DDL implizit (impliziter COMMIT) – ein ROLLBACK hilft danach nicht mehr.
SQL-Engine wird geladen …
In diesem Feld bleiben Änderungen bis „Daten zurücksetzen“ erhalten – erst die Tabelle anlegen, dann die Beispiele.
🔀MERGE / UPSERT in den Dialekten
„Einfügen oder, falls vorhanden, aktualisieren“ – jeder Hersteller hat eine eigene Schreibweise.
SQL-Standard, SQL Server, Oracle, PostgreSQL ab 15
MERGE INTO autoren AS z USING (VALUES (6, 1979)) AS q (autor_id, jahr) ON z.autor_id = q.autor_id WHEN MATCHED THEN UPDATE SET geburtsjahr = q.jahr WHEN NOT MATCHED THEN INSERT (autor_id, name, geburtsjahr) VALUES (q.autor_id, '?', q.jahr);
PostgreSQL, SQLite
INSERT INTO autoren (autor_id, name, geburtsjahr) VALUES (6, 'Lucia Moretti', 1979) ON CONFLICT (autor_id) DO UPDATE SET geburtsjahr = excluded.geburtsjahr;
MySQL, MariaDB
INSERT INTO autoren (autor_id, name, geburtsjahr) VALUES (6, 'Lucia Moretti', 1979) ON DUPLICATE KEY UPDATE geburtsjahr = VALUES(geburtsjahr);