Einführung in SQL: Berechnete Spalten
Aus Wikibooks
Mit Abfragen kann man nicht nur Spalten auswählen, sondern auch völlig neue Spalten aus anderen Spalten oder mit Funktionen erstellen.
Inhaltsverzeichnis |
[Bearbeiten] Allgemeine Regel
Eine neue Spalte wird als Teil einer Abfrage wie folgt erstellt:
<Ausdruck> [AS] <Name der neuen Spalte>
Ausdruck ist allgemein der Hinweis auf etwas, das an der betreffenden Stelle verwendet wird: ein konstanter Wert, der Inhalt einer oder mehrerer Spalten, eine Berechnung mit diesen Spalten, das Ergebnis einer Funktion oder das Ergebnis einer Unterabfrage. Der Spalte, die das Ergebnis aufnimmt, wird mit AS ein eigener Name, ein Alias zugewiesen; das AS kann auch entfallen.
In manchen DBMS ist bei berechneten Spalten die Angabe eines Alias Pflicht, und das Vergessen führt zu einem Fehler, manche erzeugen automatisch einen zufälligen Namen, wenn kein Alias eingegeben wird, und andere meckern erst, wenn man versucht, eine physische Tabelle mit einer namenlosen Spalte zu füllen.
Wenn eine Unterabfrage als berechnete Spalte benutzt wird, ist es unbedingt wichtig, dass sie – wie bei einer Funktion, Berechnung oder Verknüpfung – für jede Zeile der Hauptabfrage genau einen Wert ergibt. In dem untenstehenden Beispiel wird dies durch eine passende WHERE-Bedingung erreicht.
Hinweis: Fast alles, was in diesem Abschnitt über Ausdrücke, Funktionen und Konvertierungen gesagt wird, ist auch bei der Manipulation oder Verarbeitung von Daten wichtig. Die Funktionen und Konvertierungen wurden bereits in Funktionen und Funktionen (2) behandelt.
[Bearbeiten] Ergebnis von Berechnungen
Alle Werte einer Spalte werden für eine Berechnung verwendet, vorzugsweise eine der Grundrechenarten. Das folgende Beispiel errechnet für alle Zeilen der Tabelle Schadensfall aus dem Feld Schadenshoehe den Nettobetrag (ohne MWSt) und fügt alle weiteren Felder an:
Dieses Ergebnis kann auch für weitere Berechnungen verwendet werden, wenn auch nicht direkt mit dem Alias:
Der Alias-Name der neuen Spalte kann nicht verwendet werden:
SQL-Quelltext:
SELECT Schadenshoehe AS Brutto, Schadenshoehe / 1.19 AS Netto, Schadenshoehe - Netto AS MWSt FROM Schadensfall;
Aber die Berechnung kann erneut zugewiesen werden:
SQL-Quelltext:
SELECT Schadenshoehe AS Brutto, Schadenshoehe / 1.19 AS Netto, Schadenshoehe - (Schadenshoehe / 1.19) AS MWSt FROM Schadensfall;
Man kann aber davon ausgehen, dass das DBMS die Abfrage soweit optimiert, dass die Berechnung tatsächlich nur einmal ausgeführt werden muss.
[Bearbeiten] Zeichenketten verbinden und bearbeiten
Ebenso wie Zahlen für Berechnungen verwendet werden, gibt es die Bearbeitung von Zeichenketten. Das einfachste ist die Verknüpfung (Verkettung) von Strings durch den Operator || bzw. +:
SELECT Name || ', ' || Vorname AS Gesamtname FROM Mitarbeiter;
Gesamtname Müller, Kurt Schneider, Daniela
In diesem Beispiel wird zwischen die Spalten noch das Komma und ein Leerzeichen als konstanter Text gesetzt.
Bei Textspalten mit fester Feldlänge, die wir in der Beispieldatenbank nicht haben, sollten überzählige Leerzeichen mit der Funktion TRIM abgeschnitten werden:
Auf diese Weise kann man auch Teile von Texten übernehmen und den Rest abschneiden:
SELECT Name || ', ' || TRIM( SUBSTRING(Vorname FROM 1 FOR 1) ) || '.' AS Name_kurz FROM Mitarbeiter;
Name_kurz Müller, K. Schneider, D.
Hinweis: Nach SQL-Standard liefert das Ergebnis von SUBSTRING einen Text von gleicher Länge wie der ursprüngliche Text; die jetzt zwangsläufig folgenden Leerzeichen müssen mit TRIM entfernt werden.
[Bearbeiten] Ergebnis von Funktionen
In den bisherigen Beispielen wurden Feldinhalte direkt modifiziert und ausgegeben. In Funktionen sowie Funktionen (2) wurden neue Informationen berechnet und unabhängig von vorhandenen Zeilen und Spalten ausgegeben:
Bei diesem Beispiel mit einer Aggregatfunktion besteht das Ergebnis aus einer einzelnen Zahl in einer einzigen Zeile. Dies muss aber nicht so sein; vor allem bei Gruppierungen gibt es viele Varianten.
Viele andere Funktionen können besondere Abfragen ermöglichen oder stark erleichtern. EXTRACT nach Monat liefert die Liste aller Geburtstage, sortiert nach Monat:
SELECT Name, Vorname, EXTRACT(MONTH FROM Geburtsdatum) AS Monat, Geburtsdatum FROM Mitarbeiter ORDER BY Monat;
NAME VORNAME MONAT GEBURTSDATUM Aagenau Karolin 1 02.01.1950 Langer Norbert 1 13.01.1968 Wagner Gaby 1 18.01.1970 Müller Kurt 1 05.01.1977 Kolic Ivana 2 14.02.1971 Schneider Daniela 2 16.02.1980 // usw.
[Bearbeiten] Unterabfragen
Diese werden ausführlich unter Unterabfragen besprochen. Hier soll deshalb ein Beispiel genügen, wie es für eine berechnete Spalte geeignet ist.
Gesucht sind alle Abteilungen zusammen mit der Anzahl ihrer Mitarbeiter:
SELECT ab.ID, ab.Kuerzel, ab.Ort, ( SELECT COUNT(*) FROM Mitarbeiter mi WHERE mi.Abteilung_ID = ab.ID ) AS Mitarbeiterzahl FROM Abteilung ab ;
Wir betrachten diese Abfrage von innen nach außen: In den Klammern werden bei jeder ab.ID die Anzahl der Einträge in Mitarbeiter mit dieser Abteilung gezählt; dieser Wert wird mit den anderen Spalten von Abteilung zusammengefasst. Weil die Spalte ID in beiden Tabellen vorkommt, muss die gewünschte Tabelle ausdrücklich erwähnt werden.
[Bearbeiten] Zusammenfassung
In diesem Kapitel bekamen wir verschiedene Erläuterungen dazu, wie aus Berechnungen, Verkettung von Zeichenketten oder als Ergebnis von Skalar- oder Spaltenfunktionen neue Spalten für die Ergebnistabelle entstehen.