EMZETT.
Login

Kurz: || verkettet Texte (MySQL: CONCAT()), substr heißt in anderen Systemen SUBSTRING.

Teil des Kurses SQL

Kapitel 5 von 15 im Kurs SQL. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Textfunktionen

SELECT upper('Hallo') AS gross, lower('Hallo') AS klein, length('Hallo') AS laenge,
       substr('Datenbank', 1, 5) AS teil, replace('a-b-c', '-', '+') AS ersetzt,
       trim('  x  ') AS getrimmt, 'Mia' || ' ' || 'Müller' AS verkettet,
       instr('Datenbank', 'ban') AS position;

Ausgabe:

gross  klein  laenge  teil   ersetzt  getrimmt  verkettet   position
-----  -----  ------  -----  -------  --------  ----------  --------
HALLO  hallo  5       Daten  a+b+c    x         Mia Müller  6

|| verkettet Texte (MySQL: CONCAT()), substr heißt in anderen Systemen SUBSTRING.

Zahlenfunktionen

SELECT abs(-5) AS betrag, round(3.14159, 2) AS gerundet, round(2.5) AS r,
       max(3, 9, 5) AS groesstes, min(3, 9, 5) AS kleinstes,
       7 / 2 AS ganzzahl, 7 / 2.0 AS komma, 7 % 3 AS rest, 2 * 3 + 4 AS rechnung;

Ausgabe:

betrag  gerundet  r    groesstes  kleinstes  ganzzahl  komma  rest  rechnung
------  --------  ---  ---------  ---------  --------  -----  ----  --------
5       3.14      3.0  9          3          3         3.5    1     10

Achtung

Ganzzahl durch Ganzzahl ergibt in SQLite (und vielen Systemen) wieder eine Ganzzahl: 7 / 2 = 3.

CASE: Bedingungen im Ergebnis

CREATE TABLE kunden (id INTEGER PRIMARY KEY, name TEXT NOT NULL, ort TEXT, punkte INTEGER);
CREATE TABLE bestellungen (id INTEGER PRIMARY KEY, kunde_id INTEGER, produkt TEXT, preis REAL, menge INTEGER, datum TEXT);
INSERT INTO kunden VALUES (1,'Mia','Berlin',120),(2,'Tom','Hamburg',80),(3,'Zoe','Berlin',200),(4,'Ben','München',NULL),(5,'Eva','Köln',150);
INSERT INTO bestellungen VALUES
 (1,1,'Laptop',999.00,1,'2025-01-10'),(2,1,'Maus',25.50,2,'2025-01-12'),(3,2,'Monitor',189.90,1,'2025-02-01'),
 (4,3,'Tastatur',49.00,1,'2025-02-15'),(5,3,'Maus',25.50,1,'2025-03-03'),(6,3,'Laptop',999.00,1,'2025-03-20'),
 (7,NULL,'Kabel',5.00,3,'2025-03-21');
SELECT name, punkte,
       CASE
           WHEN punkte IS NULL THEN 'unbekannt'
           WHEN punkte >= 150 THEN 'Gold'
           WHEN punkte >= 100 THEN 'Silber'
           ELSE 'Bronze'
       END AS stufe
FROM kunden
ORDER BY punkte DESC;

Ausgabe:

name  punkte  stufe
----  ------  ---------
Zoe   200     Gold
Eva   150     Gold
Mia   120     Silber
Tom   80      Bronze
Ben           unbekannt

NULL behandeln

CREATE TABLE kunden (id INTEGER PRIMARY KEY, name TEXT NOT NULL, ort TEXT, punkte INTEGER);
CREATE TABLE bestellungen (id INTEGER PRIMARY KEY, kunde_id INTEGER, produkt TEXT, preis REAL, menge INTEGER, datum TEXT);
INSERT INTO kunden VALUES (1,'Mia','Berlin',120),(2,'Tom','Hamburg',80),(3,'Zoe','Berlin',200),(4,'Ben','München',NULL),(5,'Eva','Köln',150);
INSERT INTO bestellungen VALUES
 (1,1,'Laptop',999.00,1,'2025-01-10'),(2,1,'Maus',25.50,2,'2025-01-12'),(3,2,'Monitor',189.90,1,'2025-02-01'),
 (4,3,'Tastatur',49.00,1,'2025-02-15'),(5,3,'Maus',25.50,1,'2025-03-03'),(6,3,'Laptop',999.00,1,'2025-03-20'),
 (7,NULL,'Kabel',5.00,3,'2025-03-21');
SELECT name, punkte, COALESCE(punkte, 0) AS ohne_null, IFNULL(ort, '?') AS ort,
       NULLIF(ort, 'Berlin') AS nicht_berlin
FROM kunden;

Ausgabe:

name  punkte  ohne_null  ort      nicht_berlin
----  ------  ---------  -------  ------------
Mia   120     120        Berlin
Tom   80      80         Hamburg  Hamburg
Zoe   200     200        Berlin
Ben           0          München  München
Eva   150     150        Köln     Köln
  • COALESCE(a, b, c): erster Wert, der nicht NULL ist
  • NULLIF(a, b): NULL, wenn beide gleich sind (praktisch gegen Division durch 0)

Datum und Zeit

SQLite speichert Daten als Text im ISO-Format YYYY-MM-DD. Die Funktionen date, time, datetime, strftime rechnen damit:

SELECT date('2025-03-15', '+1 month') AS naechster_monat,
       date('2025-03-15', '-10 days') AS vor_10_tagen,
       strftime('%Y', '2025-03-15') AS jahr,
       strftime('%m', '2025-03-15') AS monat,
       strftime('%w', '2025-03-15') AS wochentag_0_so,
       julianday('2025-12-24') - julianday('2025-03-15') AS tage_bis_weihnachten,
       date('2025-01-31', 'start of month', '+1 month', '-1 day') AS monatsende;

Ausgabe:

naechster_monat  vor_10_tagen  jahr  monat  wochentag_0_so  tage_bis_weihnachten  monatsende
---------------  ------------  ----  -----  --------------  --------------------  ----------
2025-04-15       2025-03-05    2025  03     6               284.0                 2025-01-31

Andere Systeme: PostgreSQL date + interval '1 month', EXTRACT(YEAR FROM d), AGE(); MySQL DATE_ADD, YEAR(), DATEDIFF(). Aktuelles Datum: SQLite date('now'), PostgreSQL CURRENT_DATE.

Typumwandlung

SELECT CAST('42' AS INTEGER) + 1 AS a, CAST(3.99 AS INTEGER) AS b,
       CAST(42 AS TEXT) || ' Stück' AS c, typeof(CAST('7' AS REAL)) AS d;

Ausgabe:

a   b  c         d
--  -  --------  ----
43  3  42 Stück  real

Merke

  • Text: upper, lower, length, substr, replace, trim, ||
  • Zahlen: abs, round, %, Ganzzahldivision beachten
  • CASE WHEN ... THEN ... ELSE ... END ist das “if” von SQL
  • COALESCE ersetzt NULL, NULLIF erzeugt NULL
  • Datumsfunktionen unterscheiden sich je nach System am stärksten

Übungsaufgabe

Gib für jede Bestellung Produkt und Monat (aus dem Datum) aus und kennzeichne mit CASE, ob der Preis über 100 liegt.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: SELECT und WHERE

Weiter: Aggregation und GROUP BY

Alle Kapitel: SQL im Überblick