Lesbares SQL ist nicht optional
Wie du SQL-Abfragen so formatierst, dass dein zukünftiges Ich (und Teamkollegen) dich nicht hassen.
Du erbst eine Abfrage. Sie ist eine Zeile. 400 Zeichen. Mehrere Joins, Subqueries und CASE-Statements, alles zusammengequetscht.
Viel Glück beim Verstehen.
SQL-Formatierung geht nicht um Ästhetik. Es geht darum, ob Abfragen wartbar sind.
Das Problem mit dichtem SQL
SELECT u.id,u.name,o.total,p.name FROM users u JOIN orders o ON u.id=o.user_id JOIN products p ON o.product_id=p.id WHERE o.created_at>'2024-01-01' AND u.status='active' ORDER BY o.total DESC;
Wo ist die Join-Bedingung? Was wird gefiltert? Aus welcher Tabelle kommt jede Spalte?
Stell dir jetzt vor, das um 2 Uhr nachts zu debuggen.
Dieselbe Abfrage, lesbar
SELECT
u.id,
u.name,
o.total,
p.name
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id
WHERE o.created_at > '2024-01-01'
AND u.status = 'active'
ORDER BY o.total DESC;
Jede Klausel hat ihre eigene Zeile. Bedingungen richten sich aus. Die Struktur ist sichtbar.
Formatierungs-Regeln, die funktionieren
Eine Klausel pro Zeile. SELECT, FROM, WHERE, ORDER BY bekommen jeweils ihre eigene Zeile.
Spalten auf separaten Zeilen. Lange SELECT-Listen werden scannbar.
Einrücken fortgesetzter Bedingungen. Mehrere WHERE-Bedingungen richten sich aus.
Großbuchstaben für Schlüsselwörter. SELECT, FROM, WHERE heben sich von Tabellennamen und Spalten ab.
Konsistente Groß-/Kleinschreibung. Wähle einen Stil. Bleib dabei.
Subquery-Formatierung
Subqueries werden schnell unübersichtlich. Rücke sie klar ein:
SELECT *
FROM orders
WHERE user_id IN (
SELECT id
FROM users
WHERE status = 'premium'
)
Oder verwende CTEs, wenn Subqueries komplex werden:
WITH premium_users AS (
SELECT id
FROM users
WHERE status = 'premium'
)
SELECT *
FROM orders
WHERE user_id IN (SELECT id FROM premium_users)
CTEs sind oft klarer als verschachtelte Subqueries.
JOIN-Formatierung
Gib immer Join-Typen an. JOIN allein ist INNER JOIN, aber explizit ist besser.
SELECT *
FROM orders o
INNER JOIN users u ON o.user_id = u.id
LEFT JOIN shipping s ON o.id = s.order_id
Setze die Join-Bedingung auf dieselbe Zeile für einfache Joins. Breche zur nächsten Zeile für komplexe Bedingungen.
Was ist mit Performance?
Formatierung beeinflusst die Ausführung nicht. Der Datenbank-Optimizer kümmert sich nicht um Leerraum.
Aber formatiertes SQL ist einfacher zu optimieren. Du kannst die Struktur sehen, unnötige Joins identifizieren, fehlende Indizes erkennen.
Unlesbares SQL verbirgt Performance-Probleme.
Team-Standards
Wähle einen Stil. Dokumentiere ihn. Erzwinge mit automatisierten Formatierern.
Verschiedene Stile existieren. Einige Teams setzen Kommas an den Zeilenanfang. Einige schreiben alles groß. Einige nicht.
Konsistenz ist wichtiger als welchen Stil du wählst.
Jede Abfrage wird öfter gelesen als geschrieben. Formatiere für Lesbarkeit. Deine Teamkollegen – und dein zukünftiges Ich – werden dir danken.