SELECT - Daten abfragen
Meistere die SELECT-Anweisung: Spalten auswählen, Berechnungen durchführen, Aliase nutzen und Ergebnisse formatieren.
SELECT ist der am haeufigsten verwendete SQL-Befehl. In diesem Tutorial lernst du alle Moeglichkeiten kennen, die dir SELECT bietet - von einfachen Abfragen bis zu fortgeschrittenen Techniken.
SELECT im Detail
Du kennst bereits die Grundform. Jetzt gehen wir tiefer:
SELECT spalte1, spalte2, ...
FROM tabelle;
Alle Spalten vs. bestimmte Spalten
-- Alle Spalten (nur zum Erkunden!)
SELECT * FROM produkte;
-- Bestimmte Spalten (Best Practice)
SELECT name, preis, kategorie
FROM produkte;
Warum nicht immer * verwenden?
- Bei grossen Tabellen werden unnoetig viele Daten geladen
- Der Code wird schwerer lesbar
- Aenderungen an der Tabellenstruktur koennen zu Problemen fuehren
Ausdruecke und Berechnungen
SELECT kann nicht nur Spalten anzeigen, sondern auch rechnen und Werte transformieren.
Mathematische Operationen
SELECT
name,
preis,
preis * 1.19 AS preis_mit_mwst,
preis * 0.8 AS rabatt_preis,
lagerbestand * preis AS lagerwert
FROM produkte;
Die wichtigsten Operatoren:
| Operator | Bedeutung | Beispiel |
|---|---|---|
+ | Addition | preis + 5 |
- | Subtraktion | preis - rabatt |
* | Multiplikation | preis * 1.19 |
/ | Division | betrag / 2 |
% | Modulo (Rest) | id % 2 |
Runden und Formatieren
-- Runden auf 2 Dezimalstellen
SELECT
name,
preis,
ROUND(preis * 1.19, 2) AS brutto_preis
FROM produkte;
Ergebnis:
name | preis | brutto_preis
---------------+--------+-------------
T-Shirt Basic | 19.99 | 23.79
Jeans Classic | 49.99 | 59.49
Sneaker Sport | 79.99 | 95.19
String-Funktionen
SQL bietet viele Funktionen zur Arbeit mit Text:
UPPER und LOWER
SELECT
UPPER(name) AS name_gross,
LOWER(email) AS email_klein
FROM kunden;
Ergebnis:
name_gross | email_klein
---------------+-------------------
ANNA SCHMIDT | anna@example.com
MAX MUELLER | max@example.com
LENGTH - Textlaenge
SELECT
name,
LENGTH(name) AS namenlaenge
FROM kunden;
SUBSTR / SUBSTRING - Teilstring
-- Die ersten 5 Zeichen des Namens
SELECT
name,
SUBSTR(name, 1, 5) AS kuerzel
FROM kunden;
REPLACE - Text ersetzen
SELECT
name,
REPLACE(name, 'Mueller', 'Meier') AS geaendert
FROM kunden;
TRIM - Leerzeichen entfernen
-- Leerzeichen am Anfang und Ende entfernen
SELECT TRIM(' Hallo Welt ') AS bereinigt;
-- Ergebnis: 'Hallo Welt'
CASE WHEN - Bedingte Logik
Mit CASE WHEN kannst du Bedingungen direkt in der Abfrage formulieren - wie ein if/else:
SELECT
name,
preis,
CASE
WHEN preis < 20 THEN 'guenstig'
WHEN preis < 50 THEN 'mittel'
WHEN preis < 100 THEN 'gehoben'
ELSE 'premium'
END AS preisklasse
FROM produkte;
Ergebnis:
name | preis | preisklasse
---------------+--------+------------
T-Shirt Basic | 19.99 | guenstig
Jeans Classic | 49.99 | mittel
Sneaker Sport | 79.99 | gehoben
Rucksack Urban | 39.99 | mittel
Muetze Winter | 14.99 | guenstig
Jacke Outdoor | 129.99 | premium
CASE mit Kategorien
SELECT
name,
kategorie,
CASE kategorie
WHEN 'Kleidung' THEN 'Mode-Abteilung'
WHEN 'Schuhe' THEN 'Schuh-Abteilung'
WHEN 'Accessoires' THEN 'Zubehoer-Abteilung'
ELSE 'Sonstiges'
END AS abteilung
FROM produkte;
COALESCE - NULL-Werte behandeln
NULL ist ein spezieller Wert in SQL - er bedeutet “kein Wert vorhanden”. COALESCE ersetzt NULL durch einen Standardwert:
-- Wenn email NULL ist, zeige 'keine E-Mail'
SELECT
name,
COALESCE(email, 'keine E-Mail') AS kontakt
FROM kunden;
NULL verstehen
-- NULL ist NICHT das gleiche wie ein leerer String!
-- NULL bedeutet: "Wert ist unbekannt"
-- Das funktioniert NICHT:
SELECT * FROM kunden WHERE email = NULL; -- FALSCH!
-- Stattdessen:
SELECT * FROM kunden WHERE email IS NULL; -- Richtig
SELECT * FROM kunden WHERE email IS NOT NULL; -- Richtig
Datumsfunktionen
SQL kann auch mit Datumsangaben arbeiten:
-- Aktuelles Datum
SELECT CURRENT_DATE AS heute;
-- Aktuelle Uhrzeit mit Datum
SELECT CURRENT_TIMESTAMP AS jetzt;
-- Bestelldatum und wie viele Tage her
SELECT
id,
bestelldatum,
CURRENT_DATE - bestelldatum AS tage_seit_bestellung
FROM bestellungen;
Datumsteile extrahieren (PostgreSQL)
-- In PostgreSQL:
SELECT
bestelldatum,
EXTRACT(YEAR FROM bestelldatum) AS jahr,
EXTRACT(MONTH FROM bestelldatum) AS monat,
EXTRACT(DAY FROM bestelldatum) AS tag
FROM bestellungen;
Datumsteile extrahieren (SQLite)
-- In SQLite:
SELECT
bestelldatum,
strftime('%Y', bestelldatum) AS jahr,
strftime('%m', bestelldatum) AS monat,
strftime('%d', bestelldatum) AS tag
FROM bestellungen;
CAST - Datentypen umwandeln
Manchmal musst du einen Wert von einem Typ in einen anderen umwandeln:
-- Zahl als Text
SELECT CAST(preis AS TEXT) || ' Euro' AS preistext
FROM produkte;
-- Text als Zahl
SELECT CAST('42' AS INTEGER) AS zahl;
-- Runden durch Typumwandlung
SELECT
name,
preis,
CAST(preis AS INTEGER) AS ganzer_preis
FROM produkte;
Mehrere Techniken kombinieren
Die wahre Staerke von SELECT zeigt sich, wenn du mehrere Techniken kombinierst:
SELECT
UPPER(name) AS produkt,
preis AS netto,
ROUND(preis * 1.19, 2) AS brutto,
lagerbestand AS stueck,
ROUND(preis * lagerbestand, 2) AS lagerwert,
CASE
WHEN lagerbestand < 25 THEN 'Nachbestellen!'
WHEN lagerbestand < 50 THEN 'Bestand ok'
ELSE 'Gut bevorratet'
END AS status
FROM produkte;
Ergebnis:
produkt | netto | brutto | stueck | lagerwert | status
---------------+--------+--------+--------+-----------+----------------
T-SHIRT BASIC | 19.99 | 23.79 | 100 | 1999.00 | Gut bevorratet
JEANS CLASSIC | 49.99 | 59.49 | 50 | 2499.50 | Bestand ok
SNEAKER SPORT | 79.99 | 95.19 | 30 | 2399.70 | Bestand ok
RUCKSACK URBAN | 39.99 | 47.59 | 25 | 999.75 | Bestand ok
MUETZE WINTER | 14.99 | 17.84 | 75 | 1124.25 | Gut bevorratet
JACKE OUTDOOR | 129.99 | 154.69 | 20 | 2599.80 | Nachbestellen!
Was kommt als Naechstes?
Im naechsten Tutorial lernst du WHERE kennen - damit kannst du Ergebnisse filtern und nur die Datensaetze anzeigen, die bestimmte Bedingungen erfuellen.
Zusammenfassung
- SELECT kann Spalten auswaehlen, rechnen und transformieren
- String-Funktionen wie UPPER, LOWER, LENGTH und SUBSTR bearbeiten Text
- CASE WHEN ermoeglicht bedingte Logik direkt in der Abfrage
- COALESCE ersetzt NULL-Werte durch Standardwerte
- NULL ist ein spezieller Wert und muss mit IS NULL / IS NOT NULL geprueft werden
- CAST wandelt Datentypen um
- Die Kombination mehrerer Techniken macht SELECT extrem maechtig
Uebungen
- String-Funktionen: Zeige alle Kunden mit ihrem Namen in Grossbuchstaben und der Laenge ihres Namens.
- CASE WHEN: Erstelle eine Abfrage, die Bestellungen nach Betrag kategorisiert: unter 50 Euro = “klein”, 50-100 Euro = “mittel”, ueber 100 Euro = “gross”.
- Berechnungen: Zeige alle Produkte mit Netto-Preis, MwSt-Betrag (19%) und Brutto-Preis, jeweils gerundet auf 2 Stellen.
- Kombination: Erstelle eine Produkt-Uebersicht mit Name (Grossbuchstaben), Preisklasse (CASE) und Lagerwert (Preis * Bestand).
-- Loesung zu Uebung 2:
SELECT
id,
betrag,
CASE
WHEN betrag < 50 THEN 'klein'
WHEN betrag <= 100 THEN 'mittel'
ELSE 'gross'
END AS kategorie
FROM bestellungen;
Pro-Tipp: Nutze CASE WHEN, um Daten direkt in der Abfrage zu kategorisieren - das spart oft einen zusaetzlichen Verarbeitungsschritt in deiner Anwendung. CASE WHEN funktioniert ueberall dort, wo auch Spaltennamen stehen koennen: in SELECT, WHERE, ORDER BY und sogar in GROUP BY.