Skip to content

Kapitel 12: MySQL Funktionen ⭐

MySQL bietet viele eingebaute Funktionen, um Daten zu verarbeiten und zu transformieren.

12.1 String-Funktionen (Häufig verwendet) ⭐

1. CONCAT() - Zeichenketten verknüpfen

sql
-- Vorname und Nachname zusammenfügen
SELECT CONCAT(vorname, ' ', nachname) AS voller_name
FROM users;

-- Ergebnis: "Max Mustermann"

2. LENGTH() - Länge der Zeichenkette (in Bytes)

sql
-- Länge des Benutzernamens berechnen
SELECT username, LENGTH(username) AS name_laenge
FROM users;

-- Ergebnis: username="max", name_laenge=3

Hinweis: Bei UTF-8 Zeichen (wie Deutsch Umlaute) liefert LENGTH() die Bytezahl (nicht Zeichenzahl)!

  • Für Zeichenzahl: CHAR_LENGTH() verwenden!
sql
SELECT 
    username,
    LENGTH(username) AS byte_laenge,      -- Bytezahl
    CHAR_LENGTH(username) AS zeichen_laenge  -- Zeichenzahl
FROM users;

3. SUBSTR() / SUBSTRING() - Teilstring extrahieren

sql
-- Erste 3 Buchstaben des Benutzernamens
SELECT SUBSTR(username, 1, 3) AS kurzname
FROM users;

-- Syntax: SUBSTR(string, startposition, länge)
-- ACHTUNG: Position beginnt bei 1 (nicht 0!)

4. UPPER() / LOWER() - Groß-/Kleinschreibung

sql
-- Benutzernamen in Großbuchstaben umwandeln
SELECT UPPER(username) AS name_gross
FROM users;

-- Benutzernamen in Kleinbuchstaben umwandeln
SELECT LOWER(username) AS name_klein
FROM users;

5. TRIM() - Leerzeichen entfernen

sql
-- Führende und abschließende Leerzeichen entfernen
SELECT TRIM('   Max   ') AS bereinigt;  -- Ergebnis: "Max"

-- Nur führende (LTRIM) oder nur abschließende (RTRIM)
SELECT LTRIM('   Max') AS links_bereinigt;  -- "Max"
SELECT RTRIM('Max   ') AS rechts_bereinigt; -- "Max"

6. REPLACE() - Zeichenkette ersetzen

sql
-- "@"-Symbole in E-Mail-Adressen durch "[at]" ersetzen
SELECT REPLACE(email, '@', '[at]') AS email_versteckt
FROM users;

-- Ergebnis: "max[at]email.de"

12.2 Datums- und Zeitfunktionen ⭐

1. NOW() - Aktuelles Datum und Uhrzeit

sql
SELECT NOW();  -- Ergebnis: "2024-01-15 14:30:00"

2. CURDATE() / CURRENT_DATE() - Aktuelles Datum

sql
SELECT CURDATE();  -- Ergebnis: "2024-01-15"

3. CURTIME() / CURRENT_TIME() - Aktuelle Uhrzeit

sql
SELECT CURTIME();  -- Ergebnis: "14:30:00"

4. DATE() - Datumsteil extrahieren

sql
-- Nur das Datum aus einem DATETIME-Feld extrahieren
SELECT DATE(erstellt_am) AS datum_nur
FROM users;

-- Ergebnis: "2024-01-15" (ohne Uhrzeit)

5. YEAR() / MONTH() / DAY() - Jahr/Monat/Tag extrahieren

sql
-- Jahr aus dem Erstellungsdatum extrahieren
SELECT 
    YEAR(erstellt_am) AS jahr,
    MONTH(erstellt_am) AS monat,
    DAY(erstellt_am) AS tag
FROM users;

6. DATEDIFF() - Differenz zwischen zwei Daten berechnen

sql
-- Anzahl der Tage zwischen zwei Daten berechnen
SELECT DATEDIFF('2024-12-31', '2024-01-01') AS tage_differenz;
-- Ergebnis: 364

7. DATE_ADD() / DATE_SUB() - Datum addieren/subtrahieren

sql
-- 30 Tage zum aktuellen Datum addieren
SELECT DATE_ADD(CURDATE(), INTERVAL 30 DAY) AS in_30_tagen;

-- 1 Monat vom aktuellen Datum abziehen
SELECT DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AS vor_1_monat;

12.3 Mathematische Funktionen

1. ROUND() - Runden

sql
-- Auf 2 Nachkommastellen runden
SELECT ROUND(19.9876, 2) AS gerundet;  -- Ergebnis: 19.99

-- Ohne Dezimalstellen (ganzzahlig runden)
SELECT ROUND(19.49) AS gerundet;          -- Ergebnis: 19

2. CEIL() / CEILING() - Aufrunden

sql
SELECT CEIL(19.01);  -- Ergebnis: 20 (immer aufrunden!)

3. FLOOR() - Abrunden

sql
SELECT FLOOR(19.99);  -- Ergebnis: 19 (immer abrunden!)

4. ABS() - Absolutwert

sql
SELECT ABS(-42);   -- Ergebnis: 42
SELECT ABS(42);    -- Ergebnis: 42

5. MOD() / % - Restwert (Modulo)

sql
SELECT MOD(10, 3);  -- Ergebnis: 1 (10 durch 3 = 3 Rest 1)
SELECT 10 % 3;       -- Gleiches Ergebnis: 1

12.4 Bedingte Funktionen (IF, CASE)

1. IF() - Einfache Bedingung

sql
-- Syntax: IF(bedingung, wert_wenn_wahr, wert_wenn_falsch)
SELECT 
    username,
    IF(ist_aktiv = 1, 'Aktiv', 'Inaktiv') AS status_text
FROM users;

Ergebnis:

+----------+--------------+
| username | status_text  |
+----------+--------------+
| max      | Aktiv        |
| lisa     | Inaktiv      |
+----------+--------------+

2. CASE - Komplexe Bedingungen (wie if-else if-else)

sql
SELECT 
    produkt_name,
    preis,
    CASE 
        WHEN preis < 20 THEN 'Günstig'
        WHEN preis BETWEEN 20 AND 100 THEN 'Mittel'
        ELSE 'Teuer'
    END AS preis_kategorie
FROM products;

Ergebnis:

+----------------+-------+------------------+
| produkt_name   | preis | preis_kategorie |
+----------------+-------+------------------+
| T-Shirt       | 19.99 | Günstig         |
| Jeans          | 59.99 | Mittel           |
| Sneaker        | 89.99 | Mittel           |
| Luxus-Uhr     | 999.99| Teuer            |
+----------------+-------+------------------+

12.5 Praxisbeispiel: Funktionen anwenden

Szenario: Eine Online-Shop-Datenbank analysieren.

Schritt 1: Testdaten vorbereiten

sql
USE shop_db;

-- Tabelle "orders" hat bereits Daten von früher
-- Neue Felder hinzufügen für Übungen
ALTER TABLE orders 
ADD COLUMN bestell_datum DATETIME DEFAULT CURRENT_TIMESTAMP;

Schritt 2: Verschiedene Funktionen üben

1. Vollständige Adresse zusammenfügen (CONCAT):

sql
SELECT 
    CONCAT(vorname, ' ', nachname) AS voller_name,
    email
FROM users;

2. Benutzer registriert in diesem Jahr (YEAR, CURDATE):

sql
SELECT username, erstellt_am
FROM users
WHERE YEAR(erstellt_am) = YEAR(CURDATE());

4. Preiskategorien erstellen (CASE):

sql
SELECT 
    produkt_name,
    preis,
    CASE 
        WHEN preis < 20 THEN 'Günstig'
        WHEN preis <= 100 THEN 'Mittel'
        ELSE 'Teuer'
    END AS kategorie
FROM products
ORDER BY preis;

Häufige Fehler für Einsteiger

Fehler 1: String-Indizes verwechseln (1 vs 0)

sql
-- ❌ Falsch: Denkt, Position beginnt bei 0 (wie in vielen Programmiersprachen)
SELECT SUBSTR(username, 0, 3) FROM users;  -- Fehler oder leeres Ergebnis!

-- ✅ Richtig: Position beginnt bei 1
SELECT SUBSTR(username, 1, 3) FROM users;

Fehler 2: LENGTH vs CHAR_LENGTH verwechseln

sql
-- ❌ Falsch: LENGTH() zählt Bytes (bei Umlauten falsch!)
SELECT LENGTH('Müller');  -- Ergebnis: 7 (Byte) statt 6 (Zeichen)

-- ✅ Richtig: CHAR_LENGTH() zählt Zeichen
SELECT CHAR_LENGTH('Müller');  -- Ergebnis: 6 (Zeichen)

Fehler 3: DATEDIFF falsch verwenden

sql
-- ❌ Falsch: Reihenfolge vertauscht
SELECT DATEDIFF('2024-01-01', '2024-12-31');  -- Ergebnis: -364 (negativ!)

-- ✅ Richtig: größeres Datum zuerst
SELECT DATEDIFF('2024-12-31', '2024-01-01');  -- Ergebnis: 364

Zusammenfassung

In diesem Kapitel hast du gelernt:

  • ✅ String-Funktionen (CONCAT, LENGTH, SUBSTR, UPPER, etc.)
  • ✅ Datumsfunktionen (NOW, DATE, YEAR, DATEDIFF, etc.)
  • ✅ Mathematische Funktionen (ROUND, CEIL, FLOOR, ABS)
  • ✅ Bedingte Funktionen (IF, CASE)
  • ✅ Praxisbeispiele für Online-Shop

Übungen

  1. Praxis: Erstelle eine Tabelle employees mit Feldern id, vorname, nachname, gehalt
  2. CONCAT: Füge Vor- und Nachnamen zu "Voller Name" zusammen
  3. YEAR: Finde alle Mitarbeiter, die 2023 eingestellt wurden
  4. ROUND: Runde alle Gehälter auf 2 Nachkommastellen
  5. CASE: Erstelle Gehaltskategorien ("Niedrig", "Mittel", "Hoch")

Nächstes Kapitel

Im nächsten Kapitel beginnen wir mit Praxisprojekten - wende dein Wissen in echten Szenarien an!

Frei für alle Anfänger