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.
🧭Kapitel
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
- • …
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 …?“
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?
- • …
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
- • …
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
- • …
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
-- 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“
Kundschaft mit Bonuspunkten – eine E-Mail fehlt (NULL).
Sortiment mit Preis und Lagerbestand, Schlüssel ist die Artikelnummer.
Bestellungen Januar bis März 2026, eine storniert.
Hierarchie über chef_id – ideal für rekursive CTEs.