Buchgenerator (deaktivieren)

Einführung in SQL: Berechnete Spalten

Aus Wikibooks

Wechseln zu: Navigation, Suche


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:

Crystal Clear app terminal.png SQL-Quelltext:

SELECT Schadenshoehe / 1.19 AS Netto,
       *
  FROM Schadensfall;

Dieses Ergebnis kann auch für weitere Berechnungen verwendet werden, wenn auch nicht direkt mit dem Alias:

Crystal Clear action button cancel.png Der Alias-Name der neuen Spalte kann nicht verwendet werden:
Crystal Clear app terminal.png SQL-Quelltext:

SELECT Schadenshoehe         AS Brutto,
       Schadenshoehe / 1.19  AS Netto,
       Schadenshoehe - Netto AS MWSt
  FROM Schadensfall;

Crystal Clear action apply.png Aber die Berechnung kann erneut zugewiesen werden:
Crystal Clear app terminal.png 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. +:

Crystal Clear app terminal.png SQL-Quelltext:

SELECT Name || ', ' || Vorname AS Gesamtname
  FROM Mitarbeiter;

Crystal Clear app kscreensaver.png SQL-Ausgabe:  

 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:

Crystal Clear app terminal.png SQL-Quelltext:

SELECT TRIM(Name) || ', ' || TRIM(Vorname) AS Gesamtname
  FROM Mitarbeiter;

Auf diese Weise kann man auch Teile von Texten übernehmen und den Rest abschneiden:

Crystal Clear app terminal.png SQL-Quelltext:

SELECT Name || ', ' || TRIM( SUBSTRING(Vorname FROM 1 FOR 1) ) || '.' AS Name_kurz
  FROM Mitarbeiter;

Crystal Clear app kscreensaver.png SQL-Ausgabe:  

 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:

Crystal Clear app terminal.png SQL-Quelltext:

SELECT Count(Farbe) AS Anzahl_Farbe 
  FROM Fahrzeug;

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:

Crystal Clear app terminal.png SQL-Quelltext:

SELECT Name, Vorname,
       EXTRACT(MONTH FROM Geburtsdatum) AS Monat,
       Geburtsdatum
  FROM Mitarbeiter
 ORDER BY Monat;

Crystal Clear app kscreensaver.png SQL-Ausgabe:  

 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.

Aufgabe

Gesucht sind alle Abteilungen zusammen mit der Anzahl ihrer Mitarbeiter:

Crystal Clear app terminal.png SQL-Quelltext:

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.


[Bearbeiten] Übungen


Persönliche Werkzeuge