Tabellen und Spalten Aliasse in der from-Klausel


Du weißt vielleicht schon, wie man Spalten- und Tabellen-Aliasse0 vergibt. Es könnte jedoch gut sein, dass du nicht weißt, wie man die Spalten einer Tabelle in der from-Klausel umbenennt.

Wie so oft ist die Syntax sehr einfach: einem Tabellen-Alias kann eine in Klammern gesetzte Spaltenliste folgen:

FROM … [AS] alias [(<derived column list>)]

Leider hat diese Syntax ihre Tücken, weil die sie Aliasse in der Reihenfolge der Spalten in der Tabelle zuweist. Es ist generell eine schlechte Praxis sich auf die Position einzelner Spalten in einer Tabelle zu verlassen – darum wollten doch erst sinnvolle Spaltenname definieren! Es geht aber noch weiter: In standard-konformen SQL muss für jede Tabellenspalte ein Alias vergeben werden1. Man kann nicht nur einen Alias für die erste Spalte vergeben. Alle oder keine. Und jetzt denke bitte darüber nach, was passiert, wenn man dieser Tabelle eine neue Spalte hinzufügt?2

Dennoch ist es wichtig, dass man Spalten auf Basis Ihrer Position umbenennen kann: manche Spalten haben nämlich keinen Namen, oder einen unbekannten Namen. Das trifft vor allem auf das Ergebnis von Tabellen-Funktionen, unnest und values zu.

Hinweis in eigener Sache

Ich biete SQL Schulungen, Optimierung und Beratung an. Auch der Kauf meines Buches „SQL Performance Explained“ (ab €9,95) unterstützt meine Arbeit an dieser Webseite.

Anwendungsfälle

Konforme Alternatives

Derselbe Effekt kann mit der with-Klausel erreicht werden (Beispiel siehe Anwendungsfall).

Kompatibilität

Spalten in der from-Klausel umzubennenen war bereits in forgeschrittenem SQL-92 vorgesehen3 und wurde mit SQL:1999 sogar verpflichtend in Core SQL aufgenommen4. Die Umsetzung ist dennoch lückenhaft.

Erwähnenswert ist auch, dass Entry-Level SQL-92 konformen Systeme das optionale Schlüsselwort as vor dem Tabellenalias nicht unterstützen müssen5. Datenbanken, die fortgeschrittenes oder volles SQL-92 unterstützten, oder Core SQL:1999 oder später erfüllen, müssen as vor dem Tabellenalias akzeptieren. Die beste Portabilität erhält man dennoch, wenn man as weglässt:

BigQueryDb2 (LUW)MariaDBMySQLaOracle DBPostgreSQLbSQL ServercdSQLiteErlaubt <as> vor TabellenaliasFrom-Klausel SpaltennamenWith-Klausel (nicht-rekursiv)
  1. Kommt in MySQL 8.0 (funktioniert ab 8.0.1). Nur für derived tables
  2. Akzeptiert weniger Spalten in der a <derived column list> als die Basistabelle hat
  3. Nicht für normale Tabellen und Views
  4. Nur am Anfang einer Anweisung: z.B.: with...insert...select

20 Jahre SQL-Evolution kann man nicht an einem Tag nachholen. Abonniere den Newsletter via E-Mail, Twitter oder RSS, um sukzessive aufzuholen und modern-sql.com am Radar zu behalten.

Über den Autor

Foto von Markus Winand

Markus Winand gibt auf modern-sql.com Einblick in SQL und zeigt, wie es von verschiedenen Systemen unterstützt wird. Zuvor machte er use-the-index-luke.com, was er noch immer wartet. Markus kann als Trainer, Sprecher und Berater auf winand.at engagiert werden.

Sein Buch kaufen

Titelbild von „SQL Performance Explained“: Eichhörnchen läuft durchs Grass

Die Essenz: SQL-Tuning auf 200 Seiten

Jetzt Kaufen
(Taschenbuch und/oder PDF)

Sein Training

Markus verwandelt veraltetes SQL-92-Wissen in solides und zeitgemäßes SQL-Know-how

Erfahren Sie mehr»

Fußnoten

  1. Obwohl „Alias“ der gängige Begriff ist, ist „umbenennen“ treffende (dieser Begriff wird auch im Standard verwendet). Mit Alias meint man meist eine zusätzlichen Namen für etwas. Die SQL-Funktion die hier beschrieben wird benennt die Objekte effektiv um: unter dem ursprünglichen Namen kann nicht mehr auf sie zugegriffen werden.

    Ich verwende hier weiterhin „Alias“ um eine Verwechslung mit dem Umbenennen von Tabellen und Spalten mittels alter zu vermeiden (das ist zwar nicht Standard, aber manche Produkte können es dennoch).

  2. ISO/IEC 9075-2:2023 §7.6 SR 12bii1B

  3. Anweisungen, die diese Funktion nutzen, werden fehlschlagen. Oder, um es positiv zu formulieren: man muss alle Abfragen suchen, die Spalten dieser Tabelle in der from-Klausel umbenennen und die neue Spalte ebenfalls anführen.

  4. SQL:92, §6.3, Leveling Rule 2c.

  5. E051-09 “Rename columns in the FROM clause” in SQL:1999 and later.

  6. SQL:92, §6.3, Leveling Rule 2b.

Mit Markus Winand verbinden

Markus Winand auf LinkedInMarkus Winand auf XINGMarkus Winand auf Twitter
„modern SQL“ von Markus Winand ist unter einer Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License lizenziert.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz und DSGVO | CC-BY-NC-ND 3.0 Lizenz