Funktionen im SELECT-Clause (SingleRowFunctions)
https://oer-informatik.de/sql-dml-singlerowfunctions
tl/dr; (ca. 5 min Lesezeit): In der Projektion eines
SELECT
-Statements können Funktionen genutzt werden, die skalar oder aggregierend sind, die Zahlen, Zeichenketten, Datumswerte oder auch die Ablaufsteuerung betreffen. Dieser Artikel gibt eine kurze Übersicht. (zuletzt aktualisiert am 21.05.2023)
Unterschiedliche Arten von Funktionen in SQL-Statements:
Unterscheidung 1: Liefern die Funktionen bei mehrmaligem Ausführen immer das selbe Ergebnis?
deterministisch | nicht determinisisch |
---|---|
gleicher Eingabewert = gleiches Ergebnis | gleiche Parameter = ggf. unterschiedliche Ergebnisse |
Beispiel: Summe | aktuelle Zeit |
(Ein Unterpunkt wäre hier noch die Idempotenz: zahl=zahl+1
ist zwar deterministisch, aber liefert bei mehrmaliger Ausführung andere Ergebnisse als bei einmaliger Ausführung)
Unterscheidung 2: Beziehen sich die Funktionen auf unterschiedliche Datensätze?
Aggregierende Funktionen | Skalare Funktionen |
---|---|
Sogenannte multi row functions werten Attributwerte spaltenweise aus. Details dazu in diesem Artikel zu GROUP -Functions |
Das Gegenteil sind single row functions, die lediglich Attributwerte innerhalb eines Datensatzes auswerten. |
max(bruttokosten) Gibt das Maximum aller Werte dieser Spalte aus |
(anzahl*(preis-rabatt))*mwst Berechnet für einen Datensatz (eine Zeile) einen Wert |
Skalare Funktionen
Einteilung der Funktionen:
Numerische Funktionen
Zeichenkettenfunktionen
Datums- und Zeitfunktionen
Ablaufsteuerungsfunktionen
Numerische Funktionen
Datentyp | MSSQL | MySQL | OracleDB | postgreSQL | SQLite |
---|---|---|---|---|---|
Runden | ROUND(numeric_exp, integer_exp) |
ROUND |
ROUND(Zahl, (Stellen)) |
||
Gleitkommazahl formatiert ausgeben | FORMAT(value, format) |
FORMAT |
? | ||
Datum/Zeit formatiert ausgeben | FORMAT(value, format [, culture]) |
DATE_FORMAT |
strftime('%Y-%m-%d','datum') |
||
Dokumentation / Übersicht Berechnungsfunktionen (Link) | MS Doc zu numerischen Funktionen MS Doc zu Formatierungsfunktionen, T-SQL Doc | MySQL Doc zu numerischen Funktionen | Daumsfunktionen, Haupfunktionen |
Zeichenkettenfunktionen
Datentyp | MSSQL | MySQL | OracleDB | postgreSQL | SQLite |
---|---|---|---|---|---|
Zeichenkettenlänge Anzahl der Zeichen |
LEN (string_exp) |
CHAR_LENGTH(str) |
char_length ( text ) |
LENGTH |
|
Zeichenkettenlänge in Byte |
DATALENGTH (string_exp) |
LENGTH(str) |
bit_length ( text ) |
||
Substring rechts | RIGHT(RTRIM(str), pos) |
RIGHT(str,len) |
SUBSTR(X, Y) |
||
Substring links | LEFT (str, pos) |
LEFT(str,len) |
substring ( string text [ FROM start integer ] [ FOR count integer ] ) |
SUBSTR(X, -Y) |
|
Substring mitte | SUBSTRING (expression, start, length) |
SUBSTR(str, pos [, len]) |
SUBSTR(X, Y, Z) |
||
Position eines Substring finden | PATINDEX ('%pattern%', expression) |
INSTR(str,substr) LOCATE(substr,str [,pos]) |
position ( substring text IN string text ) |
INSTR |
|
Substring in Ausgabe ersetzen | REPLACE (string_exp, string_pattern, string_replacement) |
REPLACE(str, from_str, to_str) |
REPLACE |
||
Zeichenketten zusammenführen | CONCAT (string_value1, string_value2, ...) |
CONCAT(str1,str2,...) |
|||
Whitespaces entfernen | TRIM (string_exp) LTRIM (string_exp) RTRIM (string_exp) |
TRIM([{BOTH \| LEADING \| TRAILING} [remstr] FROM] str) LTRIM(str) RTRIM(str) |
LTRIM , RTRIM , TRIM |
||
Mit RegEx suchen | WHERE name REGEXP "^H.*-.*" |
|
WHERE regexp_like( text, pattern [, flags]) |
||
Mit RegEx ersetzen | | |
regexp_replace ( text, pattern, replacement) |
|||
Dokumentation / Übersicht Stringfunktionen (Link) | MS Doc | MySQL Doc | PostGreSQL-Doc | SQLite Doc |
Beispielabfragen zur Zeichenmanipulation:
Datums- und Zeitfunktionen
Datentyp | MSSQL | MySQL | OracleDB | postgreSQL | SQLite |
---|---|---|---|---|---|
das aktuelle Datum | CURRENT_DATE() , GETDATE() , CONVERT(date, SYSDATETIME()) |
CURDATE |
date('now') |
||
die aktuelle Zeit | CURRENT_TIME[(Zeit Genauigkeit)] , CONVERT(time, SYSDATETIME()) |
CURTIME |
time('now','localtime') |
||
Zeitdifferenz zweier Zeitangaben in Stunden | DATEDIFF(hour, start, end) |
TIMESTAMPDIFF(HOUR, start, end) |
SELECT CAST ((julianday(end) - julianday(start)) AS INTEGER) |
||
Zeitdifferenz zweier Datumsangaben in Tagen | DATEDIFF(day, start, end) |
TIMESTAMPDIFF(DAY, start, end) |
SELECT CAST ((julianday(end) - julianday(start)) * 24 AS INTEGER) |
||
Datum/Zeit formatiert ausgeben | CAST(exp AS data_type[(length)]) , FORMAT |
DATE_FORMAT , TIME_FORMAT |
SELECT strftime('%Y-%m-%d','datum') |
||
Dokumentation / Übersicht Datumsfunktionen(Link) | https://docs.microsoft.com/de-de/sql/odbc/reference/appendixes/time-date-and-interval-functions?view=sql-server-ver15 | https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html | https://www.sqlite.org/lang_datefunc.html |
Hinweis zur Nachnutzung als Open Educational Resource (OER)
Dieses Werk und dessen Inhalte sind - sofern nicht angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “Funktionen im SELECT-Clause (SingleRowFunctions)” von H. Stein (oer-informatik.de), Lizenz: CC BY 4.0. Die Quellen dieses Werks sind verfügbar auf https://gitlab.com/oer-informatik/db-sql/dml-select-queries.