🛠️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);