📚Quellen & Engines

Was hier ausgeführt wird, was nur gezeigt wird – und wo jede Versionsangabe herkommt.

🪶

SQLite 3.49.1 · sql.js

Jedes Beispiel läuft in sql.js (SQLite als WebAssembly). Die WASM-Datei liefert die App selbst aus, geladen wird sie beim ersten Beispiel. Jede Ausführung startet mit frischen Beispieldaten.

🐘

PostgreSQL 18.3 · PGlite 0.5.8

Viele Tipps haben zusätzlich eine ausführbare PostgreSQL-Fassung (MERGE, PL/pgSQL-Trigger, Transition Tables, generate_series …). PGlite ist echtes PostgreSQL als WebAssembly und wird erst beim ersten Klick nachgeladen (ca. 5 MB komprimiert), ebenfalls ohne CDN.

📄

MySQL/MariaDB · SQL Server · Oracle

Diese Varianten werden nur gezeigt, nicht ausgeführt – überall als „nur gezeigt“ gekennzeichnet. Syntax und Versionsangaben stammen aus den offiziellen Dokumentationen (unten), geprüft im September 2026.

PostgreSQL

INSERT – ON CONFLICTON CONFLICT DO UPDATE/NOTHING, EXCLUDED, atomares Insert-oder-Update, keine Zeile zweimal pro Befehl
Release Notes 9.5INSERT … ON CONFLICT seit 9.5
MERGEMERGE-Syntax, merge_action(), WHEN NOT MATCHED BY SOURCE
Release Notes 15MERGE seit 15, UNIQUE NULLS NOT DISTINCT seit 15
Release Notes 17MERGE … RETURNING und WHEN NOT MATCHED BY SOURCE seit 17
CREATE TRIGGERBEFORE/AFTER/INSTEAD OF, FOR EACH ROW/STATEMENT, REFERENCING (Transition Tables), EXECUTE FUNCTION
Release Notes 10Transition Tables seit 10
PL/pgSQL – Trigger-FunktionenNEW/OLD, TG_OP, RETURN NEW/NULL, Audit-Trigger-Beispiel
Partielle IndizesCREATE UNIQUE INDEX … WHERE …
Release Notes 9.4Aggregat-FILTER-Klausel seit 9.4
Nicht unterstützte Features des SQL-StandardsT180 System-versioned tables nicht unterstützt
Release Notes 18WITHOUT OVERLAPS für PRIMARY KEY/UNIQUE, temporale Fremdschlüssel (PERIOD)
JSON-Funktionen und -Operatoren->, ->>, jsonb_array_elements_text
EXPLAINEXPLAIN / EXPLAIN ANALYZE
Generated ColumnsGENERATED ALWAYS AS … STORED

SQLite

UPSERTUPSERT seit 3.24.0, mehrere ON CONFLICT-Klauseln seit 3.35.0, „WHERE true“ bei INSERT … SELECT
RETURNINGRETURNING seit 3.35.0
ON CONFLICT-Klausel (REPLACE)REPLACE löscht störende Zeilen; DELETE-Trigger nur mit recursive_triggers
CREATE TRIGGERnur FOR EACH ROW, INSTEAD OF nur auf Views, RAISE()
PRAGMA recursive_triggersrekursive Trigger standardmäßig aus
Foreign Key SupportFremdschlüssel standardmäßig aus (PRAGMA foreign_keys)
Generated ColumnsGenerated Columns seit 3.31.0
JSON-Funktionen-> und ->> seit 3.38.0, json_each, json_object
Window FunctionsWindow Functions seit 3.25.0, ROWS/RANGE
Partielle Indizespartielle Indizes seit 3.8.0
Indizes auf AusdrückenAusdrucksindizes seit 3.9.0
Release 3.30.0FILTER-Klausel und NULLS FIRST/LAST seit 3.30.0
EXPLAIN QUERY PLANSCAN / SEARCH im Abfrageplan
Row Values(a, b) > (x, y) – Row-Value-Vergleiche (u. a. für Keyset-Paginierung)

MySQL

INSERT … ON DUPLICATE KEY UPDATEZeilen-Alias seit 8.0.19, VALUES() deprecated seit 8.0.20, affected rows 1/2/0
REPLACEREPLACE löscht die alte Zeile vor dem Einfügen
INSERT (IGNORE)IGNORE wandelt Fehler in Warnungen
CREATE TRIGGERBEFORE/AFTER, nur FOR EACH ROW, FOLLOWS/PRECEDES; REPLACE aktiviert DELETE- und INSERT-Trigger
Trigger Syntax and ExamplesSET NEW.col nur in BEFORE-Triggern wirksam
Restrictions on Stored ProgramsTrigger darf die auslösende Tabelle nicht ändern (Fehler 1442)
CREATE INDEX (funktionale Schlüsselteile)funktionale Indizes seit 8.0.13, keine WHERE-Klausel (keine partiellen Indizes)
CHECK ConstraintsCHECK wird seit 8.0.16 durchgesetzt
JSON-Funktionen->, ->>, JSON_EXTRACT
Window FunctionsWindow Functions in MySQL 8.0

MariaDB

System-Versioned TablesWITH SYSTEM VERSIONING, FOR SYSTEM_TIME AS OF (seit 10.3.4)
Release Notes 10.3.4System-Versioned Tables seit 10.3.4
INSERT … RETURNINGINSERT … RETURNING seit 10.5.0
INSERT ON DUPLICATE KEY UPDATEVALUES() in ON DUPLICATE KEY UPDATE (nicht veraltet, kein Zeilen-Alias)

SQL Server

MERGE (Transact-SQL)MERGE-Syntax, OUTPUT $action, HOLDLOCK gegen Unique-Verletzungen
MERGE in SQL Server 2008MERGE seit SQL Server 2008
Temporal TablesSystem-Versioned Temporal Tables seit 2016 (13.x), FOR SYSTEM_TIME AS OF/FROM/BETWEEN/CONTAINED IN/ALL
CREATE TRIGGER (Transact-SQL)AFTER/INSTEAD OF, anweisungsweise, inserted/deleted, max. 32 Ebenen
model-DatenbankRECURSIVE_TRIGGERS standardmäßig OFF
Gefilterte Indizes (2008)gefilterte Indizes seit 2008
ORDER BY – OFFSET/FETCHOFFSET … FETCH seit 2012 (11.x)
JSON_VALUEJSON_VALUE seit 2016 (13.x)
OPENJSONOPENJSON seit 2016, Kompatibilitätslevel 130
STRING_AGGSTRING_AGG seit 2017 (14.x)
CREATE OR ALTERCREATE OR ALTER seit 2016 SP1

Oracle

MERGEMERGE-Syntax (ON in Klammern, DELETE WHERE)
Neue Features 9i Release 1MERGE und Flashback Query seit 9i
Flashback-TechnologieSELECT … AS OF TIMESTAMP, Flashback Data Archive
Neue Features 11g Release 1Flashback Data Archive und Compound Trigger seit 11.1
CREATE TRIGGERBEFORE/AFTER, FOR EACH ROW, INSTEAD OF, :NEW/:OLD
ORA-04091 (mutating table)Zeilentrigger darf die auslösende Tabelle nicht lesen/ändern
Neue Features 12.1FETCH FIRST/OFFSET und Identity-Spalten seit 12.1
Nullsleere Zeichenkette wird als NULL behandelt
SELECT – Subquery Factoring (rekursiv)rekursives WITH seit 11.2, Spaltenliste Pflicht, kein RECURSIVE

PGlite

PGlite – PostgreSQL als WASMPostgreSQL im Browser (hier Version 18.3)