Language: Deutsch English















Last Update: 2017 - 11 - 14





Aliase in SQL – Unersetzliche kleine Helfer

by Philipp Stiefel, ursprünglich veröffentlicht am 04. Oktober 2016


Article Header, Building, symmetrical view to sky

Foto von veeterzy, hier verwendet unter CC0 licensing

Die Sprache SQL (Structured Query Language) hat eine umfangreiche Syntax und Vokabular. Viele haben schon damit zu kämpfen, die Grundlagen von INSERT, SELECT, UPDATE und DELETE zu lernen. Wenn du das geschafft hast, gib es einen Haufen weniger häufig verwendeter Nuancen der Sprache zu lernen.

Es ist keine Überraschung, dass Anfänger in SQL einen kleinen Aspekt der SQL Syntax übersehen, der auf den ersten Blick nicht essenziell erscheint. Experten der Sprache kennen diese kleinen Helfer gut und benutzen sie ständig, vergessen aber häufig sie den Anfängern zu erklären, denn sobald man sie gemeistert hat, erscheinen sie so klein und trivial.

Heute möchte ich diese Situation verbessern. Ich werde dir die Aliase in der SQL-Programmiersprache vorstellen.

Einen Alias definieren

Aliase sind „Ersatznamen“ für die Spalten und Tabellen, die du in deinen SQL-Statements verwendest. Sie sind sehr einfach zu erstellen und zu verwenden. Das Schlüsselwort um einen Alias zu erstellen ist AS. Du verwendest das AS-Schlüsselwort, um einen neuen Namen für eine Spalte oder eine Tabelle in deinem SQL-Statement festzulegen.

Streng genommen ist das Schlüsselwort AS in einigen Fällen optional. Dennoch empfehle ich es immer zu benutzen, wenn du beginnst Aliase zu verwenden, da es klarer macht was dort passiert.

Aliase für Spalten

Lass uns damit beginnen, uns ein Beispiel für einen Alias für eine Spalte anzuschauen.

Hier ist ein einfaches Beispiel:

SELECT ColumnWithACrazyWeirdVeryLongName AS SimpleName FROM tblYourTable;

In der Ergebnismenge der Abfrage werden die Daten der Tabellenspalte ColumnWithACrazyWeirdVeryLongName in der Ausgabespalte SimpleName angezeigt.

Der alias in dem obigen Beispiel ist komfortabel, aber du könntest argumentieren, dass er nur begrenz nützlich ist, denn…

  • Das Problem hätte vermieden werden können, wenn man gleich SimpleName in der Tabellendefinition verwendet hätte.
  • Du wirst ohnehin ein „schön“ beschriftetes Bezeichnungsfeld verwenden um die Daten in der Benutzeroberfläche (Formular / Bericht) anzuzeigen.

Es gibt viele Situationen in denen du Aliase verwenden kannst, um deine SQL Statement einfacher zu schreiben und besser lesbar zu machen. Es gibt aber auch einige Szenarios, in denen du Aliase verwenden musst, um die gewünschte Abfrage überhaupt schreiben zu können.

Die Situation ist eine andere, wenn du das Ergebnis einer Berechnung in deiner Abfrage ausgeben willst. Da die berechnete Ausgabespalte keinen eigenen Namen hat, benötigst du einen Alias, um der Ausgabespalte einen Namen zuzuweisen.

SELECT ItemPrice * Quantity AS ExtendedPrice FROM tblOrders;

Hier brauchst du den Alias. Andernfalls bekommst du Probleme die Ergebnisse zu verarbeiten oder darzustellen. Manche Datenbanksysteme, z.B. Microsoft Access, behandeln den technischen Aspekt des Problems, indem sie automatisch einen Alias für die Spalte vergeben. Dies resultiert aber in einem hässlichen Namen, wie Expr1 oder Audr1, der keinerlei Bedeutung transportiert und zwingend für Verwirrung sorgt, wenn du mehrere berechnete Spalten in der Abfrage hast. – Also, verwende hier einen Alias!

Aliase für Tabellennamen

Du kannst auch Aliase für Tabellennamen vergeben. Bei einfachen Abfrage, die nur auf einer einzelnen Tabelle basieren, macht das wenig Sinn, aber sobald du mehr als eine Tabelle verwendest, ist es sehr bequem mit Aliasen für die Tabellennamen zu arbeiten.

Bessere Lesbarkeit

Vergleiche die beiden folgenden SQL-Statements.

SELECT tblCustomer.CustomerName, tblAddress.Street, tblAddress.City, tblAddress.ZIP, tblServiceAppointment.AppointmentDate, tblServiceAppointment.Description FROM tblCustomer INNER JOIN tblAddress tblCustomer.AddressId = tblAddress.AddressId INNER JOIN tblServiceAppointment ON tblCustomer.CustomerId = tblServiceAppointment.CustomerId;

 

SELECT c.CustomerName, a.Street, a.City, a.ZIP, sa.AppointmentDate, sa.Description FROM tblCustomer AS c INNER JOIN tblAddress AS a c.AddressId = a.AddressId INNER JOIN tblServiceAppointment AS sa ON c.CustomerId = sa.CustomerId;

Welches von beiden ist besser lesbar? – Ich bevorzuge sehr deutlich das Statement mit den Aliasen.

Es ist auch viel weniger Aufwand das Statement zu schreiben. Solltest du später eine der Tabellen umbenennen müssen oder durch eine Abfrage (mit gleicher Struktur) ersetzen wollen, dann musst du nur an einer einzigen Stelle den Tabellennamen ändern. – Praktisch, oder?

Ich verwende Aliase für die Tabellennamen bei absolut jeder Abfrage mit mehr als einer Tabelle.

Erforderliche Aliase

In dem obigen Beispiel war es immer noch optional die Aliase zu verwenden, aber es kann durchaus vorkommen, dass du zwingend Aliase verwenden musst, um ein SQL-Statement zu schreiben. Lass uns das obige Beispiel etwas erweitern.

SELECT c.CustomerName, ca.Street AS CustomerStreet, ca.City AS CustomerCity, ca.ZIP AS CustomerZIP, sa.AppointmentDate, sa.Description, st.TechnicianName, ta.Street AS TechnicianStreet, ta.City AS TechnicianCity, ta.ZIP AS TechnicianZIP FROM tblCustomer AS c INNER JOIN tblAddress AS ca c.AddressId = ca.AddressId INNER JOIN tblServiceAppointment AS sa ON c.CustomerId = sa.CustomerId INNER JOIN tblServiceTechnician st ON sa.TechnicianId = st.TechnicianId INNER JOIN tblAddress ta ON st.AddressId = ta.AddressId;

Siehst du was hier passiert? Wir haben eine allgemeine Tabelle tblAddress in unserer Datenbank, die alle Adressen enthält. Nun wollen wir in einer Abfrage die Adresse eines Kunden sowie die Adresse eines zugeordneten Servicetechnikers darstellen. Um das gewünschte Abfrageergebnis zu erreichen, müssen wir sowohl die Tabelle tblAddress zweimal zu der Abfrage hinzufügen, als auch Spalten aus dieser Tabelle jeweils zweimal zu der Ausgabeliste hinzufügen.

Eine Abfrage zu erstellen, die mehrfach ein und dieselbe Tabelle referenziert, wäre unmöglich ohne Alias. Dann gäbe es keine Möglichkeit die verschiedenen Instanzen dieser einen Tabelle innerhalb der Abfrage auseinanderzuhalten. Durch die jeweiligen Aliase für die Tabelleninstanzen bekommt jede davon eine eindeutige Identität innerhalb der Abfrage.

Mit den Aliasen für sowohl die Tabellen als auch die Spaltennamen der Tabelle tblAddress ist diese Abfrage immer noch lesbar und gut verständlich. – Ohne Aliase wärst du in diesem Fall komplett verloren.

Einschränkungen von Aliasen – Geltungsbereich

Aliase sind sehr hilfreiche, aber wir müssen zur Kenntnis nehmen, dass ihre Mächtigkeit nur begrenzt ist. Die größte Einschränkung ist ihr Geltungsbereich. Aliase deklarieren einen neuen Namen für eine Tabelle oder Spalte nur nach außen hin.

Es mag auf den ersten Blick nicht offensichtlich sein, aber SQL Statements sind hierarchisch. In der Select-Liste (die Liste der Ausgabespalten) einer Abfrage kannst du nur Tabellen (oder andere Objekte) referenzieren, die in der zugrundeliegenden From-Klausel enthalten sind. Wenn du in der From-Klausel einen Alias definierst, ist dieser überall in der Abfrage verwendbar, denn die From-Klausel ist die unterste Ebene einer Auswahlabfrage.

Wenn du einen Alias in der Ausgabeliste der Abfrage definierst, wird dieser Alias nur auf höheren, äußeren Ebenen sichtbar werden. Da die Select-Liste bereits die höchste Ebene der Abfrage ist, sind Aliase die du dort definierst, nicht innerhalb der Abfrage sichtbar.

Lass uns als Beispiel, die einfache Berechnung von oben noch einmal anschauen.

SELECT ItemPrice * Quantity AS ExtendedPrice FROM tblOrders;

Der Alias ExtendedPrice wird außerhalb der Abfrage wirksam. Also z.B. aus der Perspektive eines Clients, der diese Abfrage ausführt. Er ist aber nirgendwo innerhalb der Abfrage sichtbar. Du kannst ihn nicht als Grundlage für eine weitere Berechnung verwenden oder ihn in der Where-Bedingung oder der Order-By-Klausel referenzieren.

Dies funktioniert nicht:

SELECT ItemPrice * Quantity AS ExtendedPrice, ExtendedPrice * TaxFactor AS TotalPrice FROM tblOrders ORDER BY ExtendedPrice DESC;

So unbequem das auch ist, um das beabsichtigte Ergebnis dieser Abfrage zu erzielen, musst du den ursprünglichen Berechnungsausdruck erneut an beiden Stellen wiederholen.

Dies funktioniert so:

SELECT ItemPrice * Quantity AS ExtendedPrice, (ItemPrice * Quantity) * TaxFactor AS TotalPrice FROM tblOrders ORDER BY (ItemPrice * Quantity) DESC;

Es wäre toll, wenn die erste Variante auch funktionieren würde, aber das ist leider nicht möglich.

Gefahren der Aliase

Aufgrund ihrer beschränkten Mächtigkeit, bestehen bei der Verwendung von Aliasen nur geringe Gefahren.

Ich möchte deine Aufmerksamkeit auf zwei Situationen lenken, in denen du Aliase vorsichtig verwenden musst, um keine unbeabsichtigten Ergebnisse zu erhalten.

Bestehende Spaltennamen überschreiben

Du kannst Aliase verwenden, um einen bereits existierenden Spaltennamen zu überschreiben. Dies kannst du verwenden, um die Anwendungslogik einer Datenbankanwendung bereits auf Ebene der Datenbank zu ändern, ohne die darüber liegenden Schichten anzufassen.

Angenommen es gibt eine gespeicherte Abfrage (View, Function, or…), die konsistent in allen Teilen der Anwendung verwendet wird, dann kannst du dort die Datenausgabe verändern, ohne die darüber liegenden Schichten anpassen zu müssen.

SELECT WidgetPrice * 1.1 AS WidgetPrice FROM tblWidget;

Verwende dies immer mit großer Vorsicht. Solange man sich nicht das SQL-Statement dieser Abfrage genau anschaut, ist es nicht erkennbar, dass diese Abfrage nicht den eigentlichen WidgetPrice aus der Tabelle ausgibt.

(Keine) Eindeutigkeit von Aliasen und Namen

Bei den meisten DBMS (Datenbank Management Systeme) ist es möglich den Namen einer bestehenden Spalte, die ebenfalls in der Ausgabeliste vorhanden ist als Alias-Namen für einen anderen Ausdruck zu verwenden. Um bei manchen DBMS ist es sogar möglich ein und denselben Alias mehrfach zu verwenden.

SELECT c.CustomerName, ca.Street, ca.City, ca.ZIP + ' ' + ca.City AS City, somethingcompletelydifferent AS City FROM tblCustomer c INNER JOIN tblAddress ca c.AddressId = ca.AddressId;

Viele DBMS werden dieses Statement ohne Fehlermeldung ausführen. Was genau dabei passiert, hängt von dem jeweils verwendeten DBMS ab, aber ich versichere dir, dass dabei nichts Gutes herauskommen wird.

Du musst also selbst darauf achten, dass du nicht versehentlich einen Begriff als Alias definierst, der bereits in der Abfrage verwendet wird.

Fazit

Aliase sind einfach zu verstehen und zu verwenden. Sie sind extrem hilfreich, um SQL-Statements einfacher zu schreiben, zu lesen und zu warten.

Verwende sie ab heute.

 

Share this article: Share on Facebook Tweet Share on LinkedIn Share on XING

Abonniere meinen Newsletter

*

Ich werde Deine Email-Addresse niemals weitergeben. Du kannst den Newsletter jederzeit abbestellen.



© 1999 - 2017 by Philipp Stiefel