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' );