Die funktionale Ästhetik von SQL — warum sich strukturierter Code schneller bearbeiten lässt

Wer einmal ein 200-Zeilen-SELECT ohne Einrückung debuggen musste, weiß: Formatierung von SQL ist mehr als Geschmacksfrage. Lesbarer Code lässt sich nicht nur besser verstehen — er lässt sich mit den richtigen Editor-Werkzeugen auch deutlich schneller bearbeiten.

In diesem Artikel:

  • Warum SQL ein eigenes Stilproblem hat
  • Blockauswahl: gleichzeitiges Editieren mehrerer Zeilen
  • Suchen&Ersetzen als Formatierungs-Werkzeug

Voraussetzung: SSMS dient als Beispiel-Editor; die Prinzipien gelten für jeden Editor mit Blockauswahl (Azure Data Studio, VS Code, DataGrip, DBeaver, …).

Inhalt

Warum SQL einen eigenen Stil braucht

Visual Studio und VS Code formatieren C#, Python und JavaScript größtenteils automatisch — für SQL gilt das nur eingeschränkt. SQL Server Management Studio (SSMS) bietet im Vergleich zu spezialisierten SQL-Editoren nur begrenzte automatische Formatierung, und einen einheitlichen, verbindlichen Formatierungsstil, wie ihn andere Sprachen kennen, gibt es für SQL nicht: Konventionen und Styleguides existieren viele — welche gilt, hängt von Dialekt, Formatter und Team ab. Dazu kommt das Paradigma: Ein einzelnes SQL-Statement kann sich über hunderte Zeilen erstrecken, während Software-Code typischerweise aus vielen kurzen Anweisungen besteht. Lesbarkeit muss in SQL also bewusst hergestellt werden: manuell oder mit Editor-Werkzeugen, die genau das erleichtern.

Formatieren ist Lernen

Wer ein 100-Zeilen-SELECT manuell formatiert, kommt nicht umhin, das Statement wirklich zu lesen. Einrückung an JOIN-Klauseln zwingt dazu, die Beziehungen zwischen Tabellen mental aufzubauen. Aliase ausrichten heißt, die Spalten-Herkunft nachzuverfolgen. Klammern setzen heißt, die Logik präzise zu durchdringen. Das Ergebnis ist nicht nur lesbarer Code — es ist ein besseres Modell der Daten im Kopf des Schreibers.

Wer dagegen im Designer zusammenklickt oder eine Wortwolke aus Snippets kopiert, hat am Ende ein funktionierendes Statement und kein Verständnis. Das ist eine Erfahrungs-These und kein Naturgesetz, aber eine, die sich in der Praxis immer wieder bestätigt. In einer Welt, in der Copilot und Cursor SQL fertig hinschreiben, wird dieses Verstehens-Defizit zum Risiko: technisch korrektes SQL, das die fachliche Frage trotzdem nicht beantwortet, weil der Schreiber die Daten nie wirklich angesehen hat. SQL ist näher an Datenmodellierung als an klassischem Programmieren — und Modellierung verlangt Verstehen, nicht Tippen. Manuelle Formatierung ist eine Disziplin, die genau das verhindert. Lesbarkeit ist nur das sichtbare Nebenprodukt.

Ästhetik

Wenn ein SQL-Statement strukturiert ist, wird seine Logik sichtbar — das ist die Ästhetik, die hier gemeint ist. Was im funktionalen Code als SchönheitGesetzmäßigkeit und Harmonie durchgeht, ist nichts Esoterisches: Es sind die Eigenschaften, die strukturierter Code hat und eine Wortwolke aus Snippets eben nicht.

Das folgende SQL-Statement ist zugegebenermaßen nicht sinnvoll, aber dennoch valide und kann in der Datenbank AdventureWorksDW2017 ohne Probleme ausgeführt werden:

  1: SELECT[DimDate].ProductKey,C.EnglishProductName,DueDateKey,FullDateAlternateKey,DimDate.CustomerKey,B.[LastName]FROM[dbo].FactInternetSales[DimDate],dbo.[DimDate]D,dbo.[DimCustomer]B,dbo.DimProduct[C]WHERE[DueDateKey]=[DateKey]AND[DimDate].[ProductKey]=[C].[ProductKey]AND[DimDate].CustomerKey=B.CustomerKey

Auch wenn Ästhetik subjektiv ist, lassen sich SchönheitGesetzmäßigkeit und Harmonie dieses Statements in Frage stellen — und sicherlich auch seine Sinnhaftigkeit.

Das gleiche Statement, etwas umformatiert und umgeschrieben, erscheint ästhetischer als die erste Fassung:

  1: SELECT
  2:     T01.[ProductKey]
  3:    ,T04.[EnglishProductName]
  4:    ,T01.[DueDateKey]
  5:    ,T02.[FullDateAlternateKey]
  6:    ,T01.[CustomerKey]
  7:    ,T03.[LastName]
  8: FROM
  9:    [dbo].[FactInternetSales] T01
 10:    LEFT JOIN [dbo].[DimDate] T02
 11:    ON
 12:      T01.[DueDateKey] = T02.[DateKey]
 13:    LEFT JOIN [dbo].[DimCustomer] T03
 14:    ON
 15:      T01.[CustomerKey] = T03.[CustomerKey]
 16:    LEFT JOIN [dbo].[DimProduct] T04
 17:    ON
 18:      T01.[ProductKey] = T04.[ProductKey];

Die zweite Fassung ist dabei nicht nur eingerückt, sondern auch umgeschrieben: Die impliziten Komma-Joins des ersten Statements sind durch explizite LEFT JOIN-Klauseln ersetzt, und die Aliase folgen einem einheitlichen positionellen Schema (T01T04). Das Ergebnis ist lesbarer und verständlicher: Einzelne Bestandteile lassen sich allein aufgrund ihrer Position innerhalb des Statements identifizieren. Der Begriff der Ästhetik mag hier im technischen Sinne weit hergeholt sein, allerdings lassen sich viele Anforderungen an strukturierten Code unter diesem Begriff zusammenfassen.

Funktionalität

Die Überschrift dieses Artikels stellt auf die Funktionalität der Ästhetik ab. Es geht hier weniger um die Funktion von SQL-Befehlen als um mächtige Editierfunktionen, mit denen sich SQL-Statements in SSMS und anderen Editoren schnell strukturieren und formatieren lassen. Zwei wichtige Power-Features sind die Blockauswahl und die Suchen&Ersetzen-Funktion. Wer dabei die Tastatur der Maus vorzieht, erstellt in kurzer Zeit ein gut strukturiertes und formatiertes SQL-Statement.

Die Blockauswahl

Die Blockauswahl (in SSMS „Spaltenauswahl“, in VS Code und Azure Data Studio „Box Selection“) ist in zahlreichen Editoren verfügbar und ein derart mächtiges Feature, dass es immer wieder überrascht, wie selten es im Entwickler-Alltag zum Einsatz kommt. Die Blockauswahl erlaubt es, Text blockweise zu selektieren und zu bearbeiten — anstelle der zeilenbasierten Standard-Selektion.

Für die zeilenweise Selektion von Text wird die Shift-Taste benötigt. Über die Tastenkombination Shift+Pfeil-rechts wird ein Text beginnend bei der aktuellen Cursor-Position nach rechts selektiert. Die Selektion erfolgt hier zeichenweise und kann sich auch über mehrere Zeilen erstrecken:

Zeilenweise Cursor-Selektion in SSMS: Mit Shift+Pfeil-rechts wird ein Bereich des SELECT-Statements zeichenweise über mehrere Zeilen markiert.

Für eine blockweise Selektion von Text wird die Shift-Taste in Kombination mit der ALT-Taste verwendet. Im folgenden Beispiel wird der Cursor über die Tastenkombination ALT+Shift+Pfeil-runter ausgehend vom ersten Vorkommen des Alias T01 zunächst über mehrere Zeilen erweitert. Anschließend selektiert ALT+Shift+Pfeil-rechts einen Block über alle Aliase.

Blockweise Selektion in SSMS: Mit ALT+Shift+Pfeil-runter und ALT+Shift+Pfeil-rechts werden alle T01-Aliase senkrecht in einem Rechteck markiert.

Die Blockauswahl ermöglicht es also, den Cursor über mehrere Zeilen zu erweitern und einen Block an beliebiger Stelle des Editors zu selektieren. Texteingaben werden auf alle Zeilen angewendet, über die sich der Cursor erstreckt. Der nachfolgende Text wurde nicht durch Copy&Paste dupliziert, sondern genau einmal getippt, nachdem der Cursor über fünf Zeilen erweitert wurde — die Eingabe landet gleichzeitig in allen fünf Zeilen.

Blockauswahl in SSMS: Eine einmal getippte Eingabe erscheint gleichzeitig in fünf Zeilen, ohne Copy & Paste.

Die Blockauswahl kann auch in Verbindung mit der Maus verwendet werden. Ausgehend von der aktuellen Cursor-Position kann bei gleichzeitigem Drücken von ALT+Shift und der linken Maustaste ein Rechteck aufgezogen werden.

Blockauswahl mit Maus in SSMS: Bei gedrücktem ALT+Shift wird mit der linken Maustaste ein Auswahlrechteck aufgezogen.

Resultat der Maus-Blockauswahl: Innerhalb des aufgezogenen Rechtecks ist eine Zeile farblich hervorgehoben.

Damit die Blockauswahl wirklich Zeit spart, muss das SQL-Statement strukturiert gegliedert und präzise eingerückt sein.

Die Verwendung der Blockauswahl ist anfänglich etwas gewöhnungsbedürftig. Wer sie aber einmal zu schätzen gelernt hat, wird dieses Feature nicht mehr missen wollen.

Anmerkung

  • Die Verwendung der Blockauswahl funktioniert nur in den Bereichen des Editors, in denen Zeilenumbrüche vorliegen.
  • Die Blockauswahl arbeitet zeichenspalten-basiert: Echte Tabulator-Zeichen brechen das rechteckige Auswahlverhalten, der Editor sollte Tabs daher als Leerzeichen einfügen. Siehe hierzu auch Editor Optionen in SSMS.
  • Die blockweise Selektion wird von zahlreichen Editoren und sogar Microsoft Word unterstützt: SQL Server Management Studio, Microsoft Visual Studio, Notepad++, etc.
  • Die Implementierung dieses Power-Features kann jedoch von Editor zu Editor stark abweichen.
  • SQL Server Management Studio basiert auf der Visual-Studio-Shell, das Feature verhält sich in beiden Produkten deshalb gleich. Notepad++ macht die Blockauswahl ebenfalls über die Tastenkombination ALT+Shift verfügbar, die Implementierung des Features weicht jedoch von der in den Microsoft-Produkten ab und ist weniger intuitiv und komfortabel.

Suchen & Ersetzen

Die Suchen&Ersetzen-Funktion ist wohl jedem bekannt und in SSMS über die Tastenkombination Ctrl+H verfügbar. Ursprünglich eher für die Ersetzung einzelner Textfragmente gedacht, erweist sie sich als weiteres Power-Feature für die Formatierung von SQL-Code.

Ein Beispiel zeigt das: SQL Server unterstützt als Bezeichnungsbegrenzer (Delimiter) für Feldnamen eckige Klammern ([ ]) sowie das doppelte Anführungszeichen (") — Letzteres nur bei eingeschalteter Option QUOTED_IDENTIFIER, dem Standard in SSMS. Zwingend erforderlich sind Delimiter nur bei Bezeichnern, die etwa reservierte Wörter, Leerzeichen oder Sonderzeichen enthalten. Viele Teams setzen sie trotzdem durchgängig, damit jeder Bezeichner syntaktisch eindeutig markiert ist. Ob das die Lesbarkeit erhöht oder eher wie visuelles Rauschen wirkt, ist eine Frage der Konvention.

Die nachfolgenden beiden SELECT-Statements unterscheiden sich lediglich durch die Delimiter der Feldnamen.

Ohne Delimiter:

  1: SELECT
  2:     T01.object_id
  3:    ,T01.name
  4:    ,T01.column_id
  5:    ,T01.system_type_id
  6:    ,T01.user_type_id
  7:    ,T01.max_length
  8:    ,T01.precision
  9: FROM
 10:     sys.columns T01

Mit Delimiter (eckige Klammern):

  1: SELECT
  2:     T01.[object_id]
  3:    ,T01.[name]
  4:    ,T01.[column_id]
  5:    ,T01.[system_type_id]
  6:    ,T01.[user_type_id]
  7:    ,T01.[max_length]
  8:    ,T01.[precision]
  9: FROM
 10:     [sys].[columns] T01

Das Einfügen von Delimitern erscheint bei größeren Statements als Herausforderung. Insbesondere das Einfügen der schließenden eckigen Klammern ist problematisch, da die Position der schließenden eckigen Klammern von Zeile zu Zeile abweicht.

Tatsächlich ist diese Aufgabe aber in wenigen Momenten erledigt.

Die Klammern sind über die Blockauswahl schnell eingefügt, wie die nachfolgende Abbildung zeigt.

Blockauswahl in Aktion: Vor und nach allen Feldnamen werden gleichzeitig öffnende und schließende eckige Klammern eingefügt.

Mit der Suchen&Ersetzen-Funktion lassen sich die schließenden eckigen Klammern anschließend so weit nach links rücken, bis zwischen dem letzten Zeichen der Feldnamen und der schließenden Klammer keine Leerzeichen mehr stehen. Dazu wird der Text <Leerzeichen>] so lange durch ]<Leerzeichen> ersetzt, bis kein Vorkommen von <Leerzeichen>] mehr gefunden wird.

Ergebnis von Suchen&Ersetzen: Die schließenden eckigen Klammern sind bündig an die Feldnamen herangerückt, der Code ist final formatiert.

Fazit

Je konsequenter SQL-Code strukturiert und formatiert ist, desto lesbarer und wartbarer wird er. SSMS stellt mit der Blockauswahl und der Suchen&Ersetzen-Funktion zwei mächtige Power-Features zur Verfügung, mit deren Hilfe SQL-Code schnell und effizient strukturiert und formatiert werden kann. Das Ergebnis mag als ästhetisch empfunden werden oder nicht. Die Ästhetik ist hier jedoch nur ein beiläufiges Attribut. Der Begriff der Ästhetik wurde in diesem Artikel als provokantes Buzzword verwendet.

Wenn SSMS an Grenzen kommt: DataGrip

Für gelegentliche SQL-Editierung mit Blockauswahl und Suchen&Ersetzen ist SSMS ein solider Editor. Wer aber regelmäßig größere Statements refactort, findet in DataGrip von JetBrains ein deutlich mächtigeres Werkzeug: echter Multi-Cursor an beliebigen Positionen, eingebautes Auto-Format für T-SQL und Postgres, intelligente Spalten- und Alias-Refactorings. Für umfangreiche SQL-Refactorings und datenbankspezifische Navigation bietet DataGrip mehr integrierte Funktionen als eine typische VS-Code-Konfiguration mit SQL-Erweiterungen.

Seit Oktober 2025 ist DataGrip kostenfrei für nicht-kommerzielle Nutzung (JetBrains-Ankündigung). Damit fällt eine Eintrittsbarriere zum Ausprobieren weg.

FAQ

Warum sollte man SQL überhaupt manuell formatieren — Auto-Formatter machen das doch?

Auto-Formatter (sqlfluff, pgFormatter, Formatierungs-Buttons im Editor) erzeugen lesbares Layout, aber sie ersetzen nicht den Akt des Formatierens. Beim manuellen Einrücken, Alias-Ausrichten und Klammer-Setzen liest man das Statement zwangsläufig vollständig — und baut dabei ein mentales Modell der Daten und ihrer Beziehungen auf. Auto-Formatter sind sinnvoll als letzter Polish-Schritt, aber wer sich beim Schreiben nie mit der Struktur des Statements beschäftigt, lernt dabei wenig über die Datenbasis.

Wie aktiviert man die Blockauswahl in SSMS?

ALT+Shift gedrückt halten und entweder mit den Pfeiltasten (Pfeil-runter/Pfeil-rechts) oder mit der linken Maustaste ein Rechteck aufziehen. Die anschließende Eingabe erscheint gleichzeitig in allen markierten Zeilen.

Funktioniert die Blockauswahl auch in anderen Editoren?

Ja — in Visual Studio (identisch zu SSMS), Azure Data Studio, VS Code, DataGrip, DBeaver und sogar in Microsoft Word. Das Prinzip ist überall dasselbe, Tastenkombination und Implementierungs-Details unterscheiden sich aber je nach Editor, Betriebssystem und Konfiguration. In den Microsoft-Tools ist es ALT+Shift mit Pfeiltasten oder Maus, Notepad++ nutzt dieselbe Kombination mit leicht abweichendem Verhalten.

Was ist der Unterschied zwischen Blockauswahl und Multi-Cursor?

Beide erlauben gleichzeitiges Editieren an mehreren Stellen. Die Blockauswahl zieht ein Rechteck auf — alle markierten Spalten in untereinanderliegenden Zeilen. Der Multi-Cursor (Ctrl+Klick in VS Code, DataGrip und Azure Data Studio; in SSMS eingeschränkt verfügbar) setzt mehrere unabhängige Cursor an beliebigen Stellen. Für formatierungs-orientiertes Refactoring von SQL-Spalten ist die Blockauswahl meist intuitiver; für unregelmäßige Mehrfach-Edits ist Multi-Cursor flexibler.

Wie ersetzt man Text in vielen SQL-Zeilen gleichzeitig?

Ctrl+H öffnet Suchen&Ersetzen. Für komplexere Muster — etwa „alle CONVERT(-Aufrufe zu TRY_CONVERT(“ — hilft die Regex-Option im Suchdialog. Für sich wiederholende, gleichartige Eingaben innerhalb desselben Zeilen-Blocks ist die Blockauswahl meist schneller.