SQL Style Guide – Lesbare SQL-Abfragen schreiben

S

Meine SQL-Abfragen waren bisher schwer zu lesen. Ich hielt mich nie an eine einheitliche Formatierung. Entsprechend schwer war es für mich, denn Sinn und Aufbau einer Abfrage Wochen später sofort wieder zu verstehen. Seit Kurzem ist das nicht mehr so. Ich verwende für alle meine SQL-Dateien ein einheitliches Schemata.

Header

Meine SQL-Dateien beginnen stets mit einem Header. Dieser informiert über den Autor, das Erstellungsdatum, den Zweck und später vorgenommene Änderungen an der darin enthaltenen Abfrage. Er sieht so aus:

— — — — — — — — — — — — — — — — — — — — — — — — — — — — -
— Autor Jacob Fricke
— Erstellt am 2017–08–18
— Zweck: Dies ist eine Test-SQL-Abfrage
— — — — — — — — — — — — — — — — — — — — — — — — — — — — -
— Änderungshistorie
— 
— 2018–09–19 Jacob Fricke
— Einen fehlerhaften Join korrigiert
— — — — — — — — — — — — — — — — — — — — — — — — — — — — -

Ich speichere die Datei anschließend nach den von mir hier benannten Regeln für einheitliche und verständliche Dateinamen ab.

Groß- und Kleinschreibung

Reservierte Schlüsselwörter wie SELECT oder WHERE und Funktionen wie COUNT oder SUM schreibe ich stets in Großbuchstaben. Abkürzungen versuche ich zu vermeiden. ABSOLUTE ist besser als ABS. Aliasnamen schreibe ich hingegen klein. Statt Leerzeichen verwende ich Unterstriche.

SELECT COUNT(vornamen) AS 'anzahl_vornamen'
  FROM personen
 WHERE ort = 'Berlin'

Zeilenumbrüche

Vor jedem neuem Schlüsselwort verwende ich einen Zeilenumbruch. Frage ich mit SELECT mehr als einen Wert ab, füge ich ebenfalls einen Zeilenumbruch ein.

SELECT SUM(betrag) AS 'summe_betrag',
       AVG(betrag) AS 'avg_betrag',
       COUNT(betrag) AS 'num_betrag'
  FROM buchungen

Einzüge

Schlüsselwörter zentriere ich mit Leerzeichen links. Damit enden Sie auf der gleichen Zeichengrenze und ich kann die Schlüsselwörter einer Abfrage auf einen Blick vom Rest der Abfrage getrennt lesen.

SELECT SUM(betrag) AS 'summe_betrag'
  FROM buchungen
 WHERE YEAR(BUCHUNGSDATUM) = 2017
   AND betrag > 20
 ORDER BY summe_betrag DESC

Joins

Joins zentriere ich links der Mitte. Mehrere Joins trenne ich durch eine Leerzeile.

SELECT a.vorname, 
       a.nachname, 
       a.plz, 
       a.ort 
  FROM adressen AS a
       INNER JOIN buchungen AS b 
       ON a.id = b.id
       AND b.betrag > 20 

       INNER JOIN contacts AS c 
       ON a.id = c.id
       AND type = 'email';

UnterabfrageN

Den Anfang einer Unterabfrage zentriere ich ebenfalls links der Mitte. Den Rest der Abfrage formatiere ich nach den bisher erwähnten Regeln. Die abschließende Klammer der Unterabfrage stelle ich in einer neuen Zeile auf die gleiche Position wie die öffnende Klammer.

SELECT a.nachname, 
       (SELECT MAX(YEAR(buchungsdatum)) 
          FROM buchungen AS bu 
         WHERE bu.last_name = a.last_name 
           AND betrag > 100
       ) AS letzte_spende_über_100_euro 
  FROM adressen AS a 
 WHERE a.nachname IN 
       (SELECT be.nachname 
          FROM beitraege AS be 
         WHERE YEAR(zahlung_ab) > '2012' 
           AND b.beitrags_status = '2'
       );

About the author

Jacob Fricke

Hi, ich bin Jacob. Ich arbeite als Fundraiser und Datenanalyst bei Campact. Mehr Informationen über mich findest Du auf dieser Seite.

Add comment

By Jacob Fricke

Your sidebar area is currently empty. Hurry up and add some widgets.