Einführung in SQL: Funktionen
Aus Wikibooks
Im SQL-Standard werden verschiedene Funktionen festgelegt, die in jedem SQL-Dialekt vorkommen. In aller Regel ergänzt jedes DBMS diese Funktionen durch weitere eigene.
- Skalarfunktionen verarbeiten Werte oder Ausdrücke aus einzelne Zahlen, Zeichenketten oder Datums- und Zeitwerten. Sofern die Werte aus einer Spalte geholt werden, handelt es sich immer um einen Wert aus einer einzelnen Zeile.
- Spaltenfunktionen verarbeiten alle Werte aus einer Spalte.
- Ergänzend kann man auch benutzerdefinierte Funktionen erstellen; dies wird unter Programmierung behandelt.
Dieses Kapitel enthält als Grundlage nur die wichtigsten Skalarfunktionen. Unter Funktionen (2) gibt es viele Ergänzungen.
Inhaltsverzeichnis |
[Bearbeiten] Allgemeine Hinweise
Die Funktionen können überall dort verwendet werden, wo ein SQL-Ausdruck möglich ist. Wichtig ist, dass das Ergebnis der Funktion zu dem Datentyp passt, der an der betreffenden Stelle erwartet wird.
Auch wenn der SQL-Standard nur einige wenige Funktionen vorschreibt, können eine ganze Reihe von Funktionen als Standard angesehen werden, weil sie immer (oder fast immer) vorhanden sind. An vielen Stellen muss ich aber auf Unterschiede im Namen oder in der Art des Aufrufs hinweisen.
Bei Firebird wurden mit Version 2.1 viele Funktionen direkt eingebaut, die vorher als benutzerdefinierte Funktionen (user defined functions, UDF) manuell eingebunden werden mussten.
Schreibweise für Funktionen: Bei Funktionen müssen die Parameter (auch "Argumente" genannt) immer in Klammern gesetzt werden, auch wenn ich in den Beschreibungen darauf verzichte. Diese Klammern sind auch bei einer Funktion mit konstantem Wert wie PI erforderlich. Eine Ausnahme sind lediglich die Systemfunktionen CURRENT_DATE u.ä.
Schreibweise der Beispiele: Aus Platzgründen werden Beispiele meistens nur einfach in einem Rahmen gesetzt. Für Funktionen ohne Bezug auf Tabellen und Spalten genügt in der Regel ein einfacher SELECT-Befehl:
SELECT 2 * 3;
Nur bei Firebird und Interbase muss eine Tabelle oder eine fiktive Quelle angegeben werden:
SELECT 2 * 3 FROM rdb$database;
In diesem Kapitel werden beide Verfahren durch eine verkürzte Schreibweise zusammengefasst:
SELECT 2 * 3 [from rdb$database];
Das ist so zu lesen: Die FROM-Klausel ist für Firebird und Interbase notwendig; bei allen anderen DBMS muss sie entfallen.
[Bearbeiten] Funktionen für Zahlen
Bei allen numerischen Funktionen müssen Sie auf den Typ achten. Es ist beispielsweise ein Unterschied, ob das Ergebnis einer Division zweier ganzer Zahlen als ganze Zahl oder als Dezimalzahl behandelt werden soll.
[Bearbeiten] Operatoren
Für Zahlen stehen die üblichen Operatoren zur Verfügung:
+ Addition - Subtraktion, Negation * Multiplikation / Division
Dafür gelten die üblichen mathematischen Regeln (Punkt vor Strich, Klammern zuerst). Bitte beachten Sie auch folgende Besonderheit:
- Bei der Division ganzer Zahlen ist auch das Ergebnis eine ganze Zahl:
SELECT 3 / 5 [from rdb$database]; /* Ergebnis: 0 */
- Wenn Sie das Ergebnis als Dezimalzahl haben wollen, müssen Sie (mindestens) eine der beiden Zahlen als Dezimalzahl vorgeben:
SELECT 3.0 / 5 [from rdb$database]; /* Ergebnis: 0.6 */
- Ausnahme: MySql liefert auch in solchen Fällen eine Dezimalzahl. Für die "Integer-Division" gibt es die DIV-Funktion:
SELECT 3 DIV 5; /* Ergebnis: 0 */
- Division durch 0 liefert zunächst eine Fehlermeldung "division by zero has occurred" und danach das Ergebnis NULL.
[Bearbeiten] MOD – der Rest einer Division
Die Modulo-Funktion MOD bestimmt den Rest bei einer Division ganzer Zahlen:
MOD( <dividend>, <divisor> ) /* allgemein */ <dividend> % <divisor> /* bei MS-SQL und MySql */
Beispiel:
SELECT MOD(7, 3) [from rdb$database]; /* Ergebnis: 1 */
[Bearbeiten] CEILING, FLOOR, ROUND, TRUNCATE – die nächste ganze Zahl
Es gibt mehrere Möglichkeiten, zu einer Dezimalzahl die nächste ganze Zahl zu bestimmen.
CEILING oder CEIL liefert die nächstgrößere ganze Zahl, genauer: die kleinste Zahl, die größer oder gleich der gegebenen Zahl ist.
SELECT CEILING(7.3), CEILING(-7.3) [from rdb$database]; /* Ergebnis: 8, -7 */
FLOOR ist das Gegenstück dazu und liefert die nächstkleinere ganze Zahl, genauer: die größte Zahl, die kleiner oder gleich der gegebenen Zahl ist.
SELECT FLOOR(7.3), FLOOR(-7.3) [from rdb$database]; /* Ergebnis: 7, -8 */
TRUNCATE oder TRUNC schneidet den Dezimalanteil ab.
SELECT TRUNCATE(7.3),TRUNCATE(-7.3) [from rdb$database]; /* Ergebnis: 7, -7 */
ROUND liefert eine mathematische Rundung: ab 5 wird aufgerundet, darunter wird abgerundet.
ROUND( <Ausdruck> [ , <Genauigkeit> ] )
<Ausdruck> ist eine beliebige Zahl oder ein Ausdruck, der eine beliebige Zahl liefert.
- Wenn <Genauigkeit> nicht angegeben ist, wird 0 angenommen.
- Bei einer positiven Zahl für <Genauigkeit> wird auf entsprechend viele Dezimalstellen gerundet.
- Bei einer negativen Zahl für <Genauigkeit> wird links vom Dezimaltrenner auf entsprechend viele Nullen gerundet.
Beispiele:
SELECT ROUND(12.248,-2) [from rdb$database]; /* Ergebnis: 0,000 */ SELECT ROUND(12.248,-1) [from rdb$database]; /* Ergebnis: 10,000 */ SELECT ROUND(12.248, 0) [from rdb$database]; /* Ergebnis: 12,000 */ SELECT ROUND(12.248, 1) [from rdb$database]; /* Ergebnis: 12,200 */ SELECT ROUND(12.248, 2) [from rdb$database]; /* Ergebnis: 12,250 */ SELECT ROUND(12.248, 3) [from rdb$database]; /* Ergebnis: 12,248 */ SELECT ROUND(12.25, 1) [from rdb$database]; /* Ergebnis: 12,300 */
[Bearbeiten] Funktionen für Zeichenketten
Zur Bearbeitung und Prüfung von Zeichenketten (Strings) werden viele Funktionen angeboten.
[Bearbeiten] Verknüpfen von Strings
Als Operatoren, um mehrere Zeichenketten zu verbinden, stehen zur Verfügung:
|| als SQL-Standard + für MS-SQL oder MySql CONCAT für MySql oder Oracle
Der
senkrechte Strich wird als "Verkettungszeichen" bezeichnet und oft auch "Pipe"-Zeichen genannt. Es wird auf der deutschen PC-Tastatur unter Windows durch die Tastenkombination Alt Gr + < > erzeugt.
Ein Beispiel in diesen Varianten:
SELECT Name || ', ' || Vorname from Mitarbeiter; SELECT Name + ', ' + Vorname from Mitarbeiter; SELECT CONCAT(Name, ', ', Vorname) from Mitarbeiter;
Alle diese Varianten liefern das gleiche Ergebnis: Für jeden Datensatz der Tabelle Mitarbeiter werden Name und Vorname verbunden und dazwischen ein weiterer String gesetzt, bestehend aus Komma und Leerzeichen.
[Bearbeiten] Länge von Strings
Um die Länge einer Zeichenkette zu erfahren, gibt es die folgenden Funktionen:
CHARACTER_LENGTH( <string> ) SQL-Standard CHAR_LENGTH( <string> ) SQL-Standard Kurzfassung LEN( <string> ) nur für MS-SQL
Beispiel:
SELECT CHAR_LENGTH('Hello World') [from rdb$database]; /* Ergebnis: 11 */
SELECT CHAR_LENGTH(’’) [from rdb$database]; /* Ergebnis: 0 */
SELECT CHAR_LENGTH( NULL ) [from rdb$database]; /* Ergebnis: <null> */
[Bearbeiten] UPPER, LOWER – Groß- und Kleinbuchstaben
UPPER konvertiert den gegebenen String zu Großbuchstaben; LOWER gibt einen String zurück, der nur aus Kleinbuchstaben besteht.
SELECT UPPER('Abc Äöü Xyzß ÀÉÇ àéç') [from rdb$database]; /* Ergebnis: 'ABC ÄÖÜ XYZß ÀÉÇ ÀÉÇ' */
SELECT LOWER('Abc Äöü Xyzß ÀÉÇ àéç') [from rdb$database]; /* Ergebnis: 'abc äöü xyzß àéç àéç' */
Ob die Konvertierung bei Umlauten richtig funktioniert, hängt vom verwendeten Zeichensatz ab.
[Bearbeiten] SUBSTRING – Teile von Zeichenketten
SUBSTRING ist der SQL-Standard, um aus einem String einen Teil herauszuholen:
SUBSTRING( <text> FROM <start> FOR <anzahl> ) /* SQL-Standard */ SUBSTRING( <text> , <start> , <anzahl> ) /* MS-SQL, MySql, Oracle */
Diese Funktion heißt unter Oracle SUBSTR und kann auch bei MySql so bezeichnet werden.
Der Ausgangstext wird von Position 1 an gezählt. Der Teilstring beginnt an der hinter FROM genannten Position und übernimmt so viele Zeichen wie hinter FOR angegeben ist:
SELECT SUBSTRING('Abc Def Ghi' FROM 6 FOR 4) [from rdb$database]; /* Ergebnis: 'ef G' */
Wenn der <anzahl>-Parameter fehlt, wird alles bis zum Ende von <text> übernommen:
SELECT SUBSTRING('Abc Def Ghi' FROM 6) [from rdb$database]; /* Ergebnis: 'ef Ghi' */
Wenn der <anzahl>-Parameter 0 lautet, werden 0 Zeichen übernommen, man erhält also einen leeren String.
MySql bietet noch eine Reihe weiterer Varianten.
Hinweis: Nach SQL-Standard liefert das Ergebnis von SUBSTRING seltsamerweise einen Text von gleicher Länge wie der ursprüngliche Text; die jetzt zwangsläufig folgenden Leerzeichen müssen ggf. mit TRIM entfernt werden.
[Bearbeiten] Funktionen für Datums- und Zeitwerte
Bei den Datums- und Zeitfunktionen gilt das gleiche wie für Datum und Zeit als Datentypen: Jeder SQL-Dialekt hat sich seinen eigenen "Standard" ausgedacht. Ich muss mich deshalb auf die wichtigsten Funktionen beschränken, die es so oder ähnlich "immer" gibt, und kann nur auf die Dokumentation zum jeweiligen DBMS verweisen.
Vor allem MySql bietet viele zusätzliche Funktionen an. Teilweise sind es nur verkürzte und spezialisierte Schreibweisen der Standardfunktionen, teilweise liefern sie zusätzliche Möglichkeiten.
[Bearbeiten] Systemdatum und -uhrzeit
Nach SQL-Standard werden die aktuelle Uhrzeit und das aktuelle Datum abgefragt:
CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP
In Klammern kann als <precision> die Anzahl der Dezimalstellen bei den Sekunden angegeben werden. Es ist mir aber nicht klar, inwieweit das in der Praxis wirklich benutzt wird.
Beispiel:
SELECT CURRENT_TIMESTAMP [from rdb$database]; /* Ergebnis: '19.09.2009 13:47:49' */
Bei MS-SQL gibt es nur CURRENT_TIMESTAMP, aber dafür andere Funktionen mit höherer Genauigkeit.
[Bearbeiten] Teile von Datum oder Uhrzeit bestimmen
Für diesen Zweck gibt es vor allem EXTRACT als Standardfunktion:
EXTRACT ( <part> FROM <value> )
<value> ist der Wert des betreffenden Datums und/oder der Uhrzeit, die aufgeteilt werden soll. Als <part> wird angegeben, welcher Teil des Datums gewünscht wird:
YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | MILLISECOND
Bei einem DATE-Feld ohne Uhrzeit sind HOUR usw. natürlich unzulässig, bei einem TIME-Feld nur mit Uhrzeit die Bestandteile YEAR usw. Beispiele:
SELECT ID, Datum, EXTRACT(YEAR FROM Datum) AS Jahr, EXTRACT(MONTH FROM Datum) AS Monat FROM Schadensfall ORDER BY Jahr, Monat
SELECT 'Stunde = ' || EXTRACT(HOUR FROM CURRENT_TIME) [from rdb$database]; /* Ergebnis: 'Stunde = 14' */
Bei MS-SQL heißt diese Standardfunktion DATEPART. Als <part> können viele weitere Varianten genutzt werden.
Sehr oft gibt es weitere Funktionen, die direkt einen Bestandteil abfragen, zum Beispiel:
YEAR( <value> ) liefert das Jahr MONTH( <value> ) liefert den Monat usw. MINUTE( <value> ) liefert die Minute usw. DAYOFWEEK( <value> ) gibt den Wochentag (als Zahl, 1 für Sonntag usw.) an
Wie gesagt: Lesen Sie in der DBMS-Dokumentation nach, was es sonst noch gibt.
[Bearbeiten] Funktionen für logische und NULL-Werte
Wenn man es genau nimmt, gehören dazu auch Prüfungen wie "ist ein Wert NULL?". Der SQL-Standard hat dazu und zu anderen Prüfungen verschiedene spezielle Ausdrücke vorgesehen. Diese gehören vor allem zur WHERE-Klausel des SELECT-Befehls; sie werden deshalb bei der WHERE-Klausel behandelt:
= < > usw. Größenvergleich zweier Werte BETWEEN AND Werte zwischen zwei Grenzen LIKE Ähnlichkeiten (1) CONTAINS u.a. Ähnlichkeiten (2) IS NULL null-Werte prüfen IN genauer Vergleich mit einer Liste EXISTS schneller Vergleich mit einer Liste
Alle diese Ausdrücke liefern einen der logischen Werte TRUE, VALSE – also WAHR oder FALSCH – und ggf. NULL – also <unbekannt> – zurück und können als boolescher Wert weiterverarbeitet oder ausgewertet werden.
[Bearbeiten] Operatoren
Zur Verknüpfung logischer Werte gibt es die
booleschen Operatoren NOT, AND, OR (nur bei MySql auch XOR):
NOT als Negation AND als Konjunktion OR als Adjunktion XOR als Kontravalenz
Auch diese Operatoren werden bei der WHERE-Klausel behandelt.
Zur Verknüpfung von NULL-Werten gibt es vielfältige Regeln, je nach dem Zusammenhang, in dem das von Bedeutung ist. Man kann sich aber folgende Regel merken:
- Wenn ein Ausgangswert NULL ist, also <unbekannt>, und dieser "Wert" mit etwas verknüpft wird (z.B. mit einer Zahl addiert wird), kann das Ergebnis nur <unbekannt> sein, also NULL lauten.
[Bearbeiten] Konvertierungen
In der EDV – also auch bei SQL-Datenbanken – ist der verwendete Datentyp immer von Bedeutung. Mit Zahlen kann gerechnet werden, mit Zeichenketten nicht. Größenvergleiche von Zahlen gelten immer und überall; bei Zeichenketten hängt die Reihenfolge auch von der Sprache ab. Ein Datum wird in Deutschland durch '20.09.2009' beschrieben, in England durch '20/09/2009' und in den USA durch '09/20/2009'. Wenn wir etwas aufschreiben (z.B. einen SQL-Befehl), dann benutzen wir zwangsläufig immer Zeichen bzw. Zeichenketten, auch wenn wir Zahlen oder ein Datum meinen.
In vielen Fällen "versteht" das DBMS, was wir mit einer solchen Schreibweise meinen; dann werden durch "implizite Konvertierung" die Datentypen automatisch ineinander übertragen. In anderen Fällen muss der Anwender dem DBMS durch eine Konvertierungsfunktion vorschreiben, was wie zu verstehen ist.
[Bearbeiten] Implizite Konvertierung
Datentypen, die problemlos vergleichbar sind, werden "automatisch" ineinander übergeführt.
- Die Zahl 17 kann je nach Situation ein INTEGER, ein SMALLINT, ein BIGINT, aber auch NUMERIC oder FLOAT sein.
- Die Zahl 17 kann in einem SELECT-Befehl auch als String '17' erkannt und verarbeitet werden.
SELECT ID, Name, Vorname FROM Mitarbeiter WHERE ID = '17';
- Je nach DBMS kann ein String wie '20.09.2009' als Datum erkannt und verarbeitet werden. Vielleicht verlangt es aber auch eine andere Schreibweise wie '20/09/2009'.
Es gibt bereits durch den SQL-Standard ausführliche Regeln, welche Typen immer, unter bestimmten Umständen oder niemals ineinander übergeführt werden können. Jedes DBMS ergänzt diese allgemeinen Regeln durch eigene.
Wenn es einen solchen Befehl ausführt, dürfte es niemals Missverständnisse geben, sondern er wird "mit an Sicherheit grenzender Wahrscheinlichkeit" korrekt erledigt. Wenn ein Befehl nicht eindeutig ist, wird das DBMS eher zu früh als zu spät mit einer Fehlermeldung wie "conversion error from string ..." reagieren. Dann ist es Zeit für eine explizite Konvertierung, meistens durch CAST.
[Bearbeiten] CAST
Die CAST-Funktion ist der SQL-Standard für die Überführung eines Wertes von einem Datentyp in einen anderen.
CAST ( <expression> AS <type> )
Als <expression> ist etwas angegeben, was den "falschen" Typ hat, nämlich ein Wert oder Ausdruck. Mit <type> wird der Datentyp angegeben, der an der betreffenden Stelle gewünscht oder benötigt wird. Das Ergebnis des CASTings (der Konvertierung) ist dann genau von diesem Typ.
Beispiele für Datum:
SELECT DATEADD(DAY, 2, '07.14.2009') [from rdb$database];
/* expression evaluation not supported */
SELECT DATEADD(DAY, 2, CAST('07.14.2009' as date)) [from rdb$database];
/* conversion error from string "07.14.2009" */
SELECT DATEADD(DAY, 2, CAST('14.07.2009' as date)) [from rdb$database];
/* Ergebnis: '16.07.2009' */
SELECT Name, Vorname, CAST(Geburtsdatum AS CHAR(10)) from Versicherungsnehmer;
/* Ergebnis wird in der Form '1953-01-13' angezeigt */
Kürzere Zeichenketten können schnell verlängert werden, wennn es nötig ist:
SELECT ID, CAST(Kuerzel AS CHAR(20)) FROM Abteilung; -- 20 Zeichen Länge statt eigentlich 10 Zeichen
Das Verkürzen funktioniert nicht immer so einfach. Ob bei Überschreitung einer Maximallänge einfach abgeschnitten wird oder ob es zu einer Fehlermeldung "string truncation" kommt, hängt vom DBMS ab; dann müssen Sie eine SUBSTRING-Variante benutzen.
-- vielleicht funktioniert es so: SELECT CAST(Name AS CHAR(15)) || Vorname from Versicherungsnehmer; -- aber sicher klappt es so: SELECT SUBSTRING(Name FROM 1 FOR 15) || Vorname from Versicherungsnehmer;
Bitte beachten Sie dazu auch den Hinweis bei SUBSTRING.
Bitte lesen Sie in Ihrer SQL-Dokumentation nach, zwischen welchen Datentypen implizite Konvertierung möglich ist und wie die explizite Konvertierung mit CAST ausgeführt wird.
[Bearbeiten] CONVERT
Nach dem SQL-Standard ist CONVERT vorgesehen zum Konvertieren von Zeichenketten in verschiedenen Zeichensätzen:
CONVERT ( <text> USING <transcoding name> ) SQL-Standard CONVERT ( <text>, <transcoding name> ) alternative Schreibweise
Firebird kennt diese Funktion überhaupt nicht. MS-SQL benutzt eine andere Syntax und bietet vor allem für Datums- und Zeitformate viele weitere Möglichkeiten:
CONVERT ( <type>, <text> [ , <style> ] )
Wegen dieser starken Abweichungen verzichte ich auf nähere Erläuterungen und verweise auf die jeweilige Dokumentation.
[Bearbeiten] Spaltenfunktionen
Die Spaltenfunktionen werden auch als Aggregatfunktionen bezeichnet, weil sie eine Menge von Werten – nämlich aus allen Zeilen einer bestimmten Spalte – zusammenfassen und einen gemeinsamen Wert bestimmen. In der Regel wird dazu eine Spalte aus einer der beteiligten Tabellen verwendet; es kann aber auch ein sonstiger gültiger SQL-Ausdruck sein, der als Ergebnis einen einzelnen Wert liefert. Das Ergebnis der Funktion ist dann ein Wert, der aus allen passenden Zeilen der Abfrage berechnet wird.
Bei Abfragen kann das Ergebnis einer Spaltenfunktion auch nach den Werten einer oder mehrerer Spalten oder Berechnung=en gruppiert werden. Die Aggregatfunktionen liefern dann für jede Gruppe ein Ergebnis. Näheres siehe unter Gruppierungen.
[Bearbeiten] COUNT – Anzahl
Die Funktion Count zählt alle Zeilen, die einen eindeutigen Wert enthalten, also nicht
NULL sind. Die Funktion COUNT kann auf alle Datentypen angewendet werden, da für jeden Datentyp NULL definiert ist. Beispiel:
Die Spalte Farbe ist als VARCHAR(30), also als Text variabler Länge, definiert und optional. Hier werden also alle Zeilen gezählt, die in dieser Spalte einen Eintrag haben. Dasselbe funktioniert auch mit einer Spalte, die numerisch ist:
Hier ist die Spalte numerisch und optional. Die "0" ist bekanntlich nicht NULL. Wenn in der Spalte eine "0" steht, wird sie mitgezählt.
Ein Spezialfall ist der Asterisk "*" als Parameter. Dies bezieht sich dann nicht auf eine einzelne Spalte, sondern auf eine ganze Zeile. So wird also die Anzahl der Zeilen in der Tabelle gezählt.:
Die Funktion COUNT liefert immer eine Zahl zurück, auch wenn alle Werte in einer Zeile NULL sind.
[Bearbeiten] SUM – Summe
Die Funktion SUM kann (natürlich) nur auf numerische Datentypen angewendet werden. Im Gegensatz zu COUNT liefert SUM nur dann einen Wert zurück, wenn wenigstens ein Eingabewert nicht NULL ist. Als Parameter kann nicht nur eine einzelne numerische Spalte, sondern auch eine Berechnung übergeben werden, die als Ergebnis eine einzelne Zahl liefert. Ein Beispiel für eine einzelne numerische Spalte wäre:
Als Ergebnis würden alle Werte in der Spalte Schadenshoehe aufsummiert. Als Parameter kann aber auch eine Berechnung übergeben werden.
Hier werden DM-Beträge in Schadenshoehe zuerst in Euro umgerechnet und danach aufsummiert.
Eine Besonderheit ist das Berechnen von Vergleichen. Ein Vergleich wird als WAHR oder FALSCH ausgewertet. Sofern das DBMS (wie bei MySql oder Access) das Ergebnis als Zahl benutzt, ist das Ergebnis eines Vergleichs daher 1 oder 0 (bei Access -1 oder 0). Um alle Fälle zu zählen, deren Schadenshöhe > 1000 ist, müsste der Befehl so aussehen:
Dabei werden nicht etwa die Schäden aufsummiert, sondern nur das Ergebnis des Vergleichs, also 0 oder 1, im Grunde also gezählt. Die Funktion COUNT kann hier nicht genommen werden, da sie sowohl die 1 als auch die 0 zählen würde.
Einige DBMS (z.B. DB2, Oracle) haben eine strengere Typenkontrolle; Firebird nimmt eine Zwischenstellung ein. Dabei haben Vergleichsausdrücke grundsätzlich ein boolesches Ergebnis, das nicht summiert werden kann. Dann kann man sich mit der CASE-Funktion behelfen, die dem Wahrweitswert TRUE eine 1 zuordnet und dem Wert FALSE eine 0:
SELECT Sum(case when Schadenshoehe > 1000 then 1 else 0 end) AS Anzahl_Schadenshoehe_gt_1000 FROM Schadensfall;
[Bearbeiten] MAX, MIN – Maximum, Minimum
Diese Funktionen können auf jeden Datentyp angewendet werden, für den ein Vergleich ein gültiges Ergebnis liefert. Dies gilt für numerische Werte, Datumswerte und Textwerte, nicht aber für z.B. BLOBs (binary large objects). Bei Textwerten ist zu bedenken, dass die Sortierreihenfolge je nach verwendetem Betriebssystem, DBMS und Zeichensatzeinstellungen der Tabelle oder Spalte unterschiedlich ist, die Funktion demnach auch ein unterschiedliches Ergebnis liefert.
Suche den kleinsten, von NULL verschiedenen Schadensfall.
Kommen nur NULL-Werte vor, wird NULL zurückgegeben. Gibt es mehrere Zeilen, die den kleinsten Wert haben, wird trotzdem nur ein Wert zurückgegeben. Welche Zeile diesen Wert liefert, ist nicht definiert.
Für MAX gilt entsprechendes wie für MIN.
[Bearbeiten] AVG – Mittelwert
AVG (average = Durchschnitt) kann nur auf numerische Werte angewendent werden. Das für SUM gesagte gilt analog auch für AVG. Um die mittlere Schadenshöhe zu berechnen, müsste man folgendes schreiben:
NULL-Werte fließen dabei nicht mit in die Berechnung ein, Nullen aber sehr wohl.
[Bearbeiten] STDDEV – Standardabweichung
Die Standardabweichung STDDEV oder STDEV kann auch nur für numerische Werte berechnet werden. NULL-Werte fließen nicht mit in die Berechnung ein, Nullen schon. Wie bei SUM können auch Berechnungen als Werte genommen werden. Um die Standardabweichung der Schadensfälle zu berechnen, würde man schreiben:
[Bearbeiten] Zusammenfassung
In diesem Kapitel lernten wir die wichtigsten "eingebauten" Funktionen kennen:
- Für Zahlen gibt es vor allem die Operatoren, dazu die modulo-Funktionen und Möglichkeiten für Rundungen.
- Für Zeichenketten gibt es vor allem das Verknüpfen und Aufteilen, dazu die Längenbestimmung und die Umwandlung in Groß- und Kleinbuchstaben.
- Für Datums- und Zeitwerte gibt es neben Systemfunktionen die Verwendung einzelner Teile.
- Für logische und NULL-Werte gibt es vor allem Vergleiche und Kombinationen durch Operatoren.
- Konvertierungen – implizite, CAST, CONVERT – dienen dazu, dass ein Wert des einen Datentyps anstelle eines anderen Typs verwendet werden kann.
- Mit den Spaltenfunktionen werden alle Werte einer Spalte gemeinsam ausgewertet.