💡 Visuelle Erklärung

SQL-Tipps aus der Praxis – zum Anfassen

Upserts ohne Race Condition, Historie per Trigger, Duplikate sauber entfernen, Lücken in Nummernfolgen finden: 35 Tipps, jeder mit Vorher/Nachher, ausführbar in einer echten SQL-Engine im Browser und im Vergleich von PostgreSQL, MySQL/MariaDB, SQL Server, Oracle und SQLite.

35
Tipps, alle ausführbar
32
davon auch in echtem PostgreSQL
16
Übungen mit Auto-Prüfung
5
Dialekte im Vergleich

🧭Kapitel

🔀6 Tipps

Upserts

Einfügen oder aktualisieren – ON CONFLICT, ON DUPLICATE KEY, MERGE und die REPLACE-Falle.

  • • Einfügen oder aktualisieren – in einer Anweisung
  • • Zähler atomar hochzählen
  • • Nur einfügen, wenn neu – und sehen, was wirklich eingefügt wurde
  • • Tabellen abgleichen: Lieferung in den Bestand buchen
  • • …
🕰️4 Tipps

Historie & Audit

Gültig-von/bis per Trigger, Audit-Log als JSON, Temporal Tables und Zeitreise.

  • • Preis-Historie mit gültig_von / gültig_bis (SCD Typ 2)
  • • Audit-Log: wer hat was geändert – alt und neu als JSON
  • • System-versionierte Tabellen: die Datenbank führt die Historie
  • • Zeitreise-Abfrage: „Wie war der Stand am …?“
⚡5 Tipps

Trigger

BEFORE, AFTER, INSTEAD OF, Zeile vs. Anweisung, NEW/OLD – mit Ablauf-Debugger.

  • • BEFORE-Trigger zur Validierung
  • • Abgeleitete Werte: Generated Column oder Trigger?
  • • INSTEAD OF: Sichten beschreibbar machen
  • • FOR EACH ROW oder FOR EACH STATEMENT?
  • • …
👯5 Tipps

Duplikate

Finden, genau eine Zeile behalten, unscharfe Dubletten und Vorbeugen per UNIQUE.

  • • Duplikate finden mit GROUP BY … HAVING
  • • Genau eine Zeile je Gruppe behalten (ROW_NUMBER)
  • • Ältesten behalten mit EXISTS-Selbstjoin
  • • Unscharfe Duplikate: normalisieren vor dem Vergleich
  • • …
🧠10 Tipps

Abfragemuster

Gaps & Islands, Top-N, laufende Summen, Pivot, rekursive CTEs, Anti-Join, Datumsgrenzen.

  • • Gaps & Islands: Lücken in Nummernfolgen
  • • Top-N je Gruppe: die zwei größten Bestellungen pro Kunde
  • • Laufende Summen – und die RANGE-Falle
  • • Pivot und Unpivot mit CASE-Aggregation
  • • …
🧰5 Tipps

Praxis-Rezepte

Soft Delete, Keyset-Paginierung, Batch-Updates, JSON-Spalten, EXPLAIN.

  • • Soft Delete: löschen, ohne zu löschen
  • • Paginierung: OFFSET vs. Keyset (Seek-Methode)
  • • Sicheres Batch-Delete: große Mengen in kleinen Portionen
  • • JSON-Spalten abfragen und aufklappen
  • • …

🧩So ist jeder Tipp aufgebaut

😖
1. Problem
ein typischer Praxisfall
💡
2. Lösung
die Idee in zwei Sätzen
🎞️
3. Vorher / Nachher
Änderungen farbig und animiert
▶️
4. Ausführen
editierbar, mit Zurücksetzen
🌍
5. 5 Dialekte
nebeneinander, mit Versionen
⚠️
6. Fallstricke
und Belege aus der Doku
-- Race Condition? Nicht mit einem Upsert:
INSERT INTO anmeldungen (email, anzahl)
VALUES ('neu@example.org', 1)
ON CONFLICT (email) DO UPDATE
  SET anzahl = anmeldungen.anzahl + 1;

Ausgeführt wird wirklich: SQLite 3.49 über sql.js für jedes Beispiel, dazu bei 32 Tipps echtes PostgreSQL 18 über PGlite – beides als WebAssembly im Browser, ohne Server-Datenbank und ohne CDN.

Nur gezeigt werden MySQL/MariaDB, SQL Server und Oracle – mit Versionsangaben aus den offiziellen Dokumentationen (siehe Quellen).

Die SQL-Grundlagen (JOINs, NULL, GROUP BY, Window Functions, Transaktionen, Indizes) erklärt die Schwester-App VisualSql.

🏪Die Beispieldaten: Versandhandel „Musterhandel“

Vollständig erfunden (Namen, Adressen @example.org). Viele Tipps legen zusätzlich eigene kleine Tabellen an – jede Ausführung beginnt mit frischen Daten.
🧑‍🤝‍🧑
kunden
6 Zeilen

Kundschaft mit Bonuspunkten – eine E-Mail fehlt (NULL).

📦
artikel
7 Zeilen

Sortiment mit Preis und Lagerbestand, Schlüssel ist die Artikelnummer.

🧾
bestellungen
12 Zeilen

Bestellungen Januar bis März 2026, eine storniert.

🏢
mitarbeiter
8 Zeilen

Hierarchie über chef_id – ideal für rekursive CTEs.