SQL – Structured Query Language#
SQL ist die Standardsprache zur Verwaltung und Abfrage relationaler Datenbanken. Für die Zwischenprüfung relevant sind DDL, DML und einfache SELECT-Abfragen mit Aggregatfunktionen.
SQL-Kategorien#
| Kategorie | Bedeutung | Befehle |
|---|---|---|
| DDL | Data Definition Language – Struktur definieren | CREATE, ALTER, DROP |
| DML | Data Manipulation Language – Daten verändern | INSERT, UPDATE, DELETE |
| DQL | Data Query Language – Daten abfragen | SELECT |
| DCL | Data Control Language – Rechte verwalten | GRANT, REVOKE |
Prüfungsrelevant: DML + SELECT (DQL)
Datenbankstruktur – Tabellen & Datentypen#
Tabelle erstellen (DDL)#
CREATE TABLE Kunde (
KundenNr INT PRIMARY KEY,
Name VARCHAR(100) NOT NULL,
Email VARCHAR(150) UNIQUE,
Geburtsjahr INT,
Aktiv BOOLEAN DEFAULT TRUE
);Wichtige Datentypen#
| Datentyp | Beschreibung | Beispiel |
|---|---|---|
INT / INTEGER | Ganze Zahl | 42, -5 |
FLOAT / DECIMAL(8,2) | Dezimalzahl | 3.14, 1999.99 |
VARCHAR(n) | Text mit max. n Zeichen | ‘Max Mustermann’ |
CHAR(n) | Text mit genau n Zeichen | ‘DE’ (Ländercode) |
DATE | Datum | ‘2026-03-16’ |
BOOLEAN | Wahrheitswert | TRUE / FALSE |
TEXT | Langer Text (unbegrenzt) | Beschreibungen |
Constraints (Einschränkungen)#
| Constraint | Bedeutung |
|---|---|
PRIMARY KEY | Eindeutiger Schlüssel, kein NULL |
FOREIGN KEY | Verweis auf PK einer anderen Tabelle |
NOT NULL | Feld darf nicht leer sein |
UNIQUE | Wert muss eindeutig sein |
DEFAULT wert | Standardwert wenn nichts angegeben |
CHECK (bedingung) | Wertebereich einschränken |
DML – Daten einfügen, ändern, löschen#
INSERT – Datensatz einfügen#
-- Alle Felder angeben (Reihenfolge wie in der Tabelle):
INSERT INTO Kunde VALUES (1, 'Max Mustermann', 'max@mail.de', 1995, TRUE);
-- Nur bestimmte Felder angeben (empfohlen):
INSERT INTO Kunde (KundenNr, Name, Email)
VALUES (2, 'Anna Schmidt', 'anna@mail.de');
-- Mehrere Datensätze auf einmal:
INSERT INTO Kunde (KundenNr, Name)
VALUES (3, 'Tom Meier'),
(4, 'Lisa Braun');UPDATE – Datensatz ändern#
-- IMMER WHERE verwenden! Sonst werden ALLE Zeilen geändert!
UPDATE Kunde
SET Email = 'neu@mail.de'
WHERE KundenNr = 1;
-- Mehrere Felder gleichzeitig ändern:
UPDATE Kunde
SET Email = 'tom@mail.de',
Aktiv = FALSE
WHERE KundenNr = 3;Gefährlich ohne WHERE:
UPDATE Kunde SET Aktiv = FALSE;→ setzt alle Kunden auf inaktiv!
DELETE – Datensatz löschen#
-- Einen Datensatz löschen:
DELETE FROM Kunde
WHERE KundenNr = 4;
-- Alle inaktiven Kunden löschen:
DELETE FROM Kunde
WHERE Aktiv = FALSE;Gefährlich ohne WHERE:
DELETE FROM Kunde;→ löscht alle Datensätze!
SELECT – Daten abfragen#
Grundstruktur#
SELECT spalte1, spalte2 -- Welche Spalten?
FROM tabelle -- Aus welcher Tabelle?
WHERE bedingung -- Welche Zeilen? (optional)
ORDER BY spalte [ASC|DESC]; -- Sortierung (optional)Einfache Abfragen#
-- Alle Spalten aller Zeilen:
SELECT * FROM Kunde;
-- Nur bestimmte Spalten:
SELECT Name, Email FROM Kunde;
-- Mit Bedingung (WHERE):
SELECT Name, Email
FROM Kunde
WHERE Aktiv = TRUE;
-- Mehrere Bedingungen:
SELECT Name
FROM Kunde
WHERE Aktiv = TRUE AND Geburtsjahr > 1990;
-- Sortiert:
SELECT Name, Geburtsjahr
FROM Kunde
ORDER BY Geburtsjahr DESC; -- Neueste zuerst
-- Nur eindeutige Werte (kein Duplikat):
SELECT DISTINCT Geburtsjahr FROM Kunde;WHERE-Operatoren#
| Operator | Bedeutung | Beispiel |
|---|---|---|
= | Gleich | WHERE Aktiv = TRUE |
<> oder != | Ungleich | WHERE Status <> 'gelöscht' |
<, >, <=, >= | Vergleich | WHERE Preis >= 100 |
BETWEEN x AND y | Wertebereich | WHERE Alter BETWEEN 18 AND 65 |
IN (a, b, c) | Mehrere Werte | WHERE Stadt IN ('Berlin', 'Hamburg') |
LIKE 'muster' | Textmuster (% = beliebig viele, _ = genau ein) | WHERE Name LIKE 'M%' |
IS NULL | Kein Wert | WHERE Email IS NULL |
IS NOT NULL | Hat einen Wert | WHERE Email IS NOT NULL |
AND | Beide Bedingungen | WHERE A AND B |
OR | Mindestens eine | WHERE A OR B |
NOT | Negation | WHERE NOT Aktiv |
LIKE-Muster Beispiele#
WHERE Name LIKE 'M%' -- Beginnt mit M (Meier, Müller, Max...)
WHERE Name LIKE '%mann' -- Endet auf 'mann' (Mustermann, Kaufmann...)
WHERE Name LIKE '%uller%' -- Enthält 'uller' (Müller, Buller...)
WHERE PLZ LIKE '7%' -- PLZ beginnt mit 7
WHERE Name LIKE 'M_ier' -- M + ein Zeichen + ier (Meier, Maier...)Aggregatfunktionen#
Aggregatfunktionen berechnen einen Wert aus mehreren Zeilen:
| Funktion | Beschreibung | Beispiel |
|---|---|---|
COUNT(*) | Anzahl der Zeilen | Wie viele Kunden gibt es? |
COUNT(spalte) | Anzahl nicht-NULL-Werte | Wie viele haben eine E-Mail? |
SUM(spalte) | Summe | Gesamtumsatz |
AVG(spalte) | Durchschnitt | Durchschnittspreis |
MIN(spalte) | Kleinster Wert | Günstigstes Produkt |
MAX(spalte) | Größter Wert | Teuerster Artikel |
-- Anzahl aller Kunden:
SELECT COUNT(*) AS Anzahl_Kunden
FROM Kunde;
-- Nur aktive Kunden zählen:
SELECT COUNT(*) AS Aktive_Kunden
FROM Kunde
WHERE Aktiv = TRUE;
-- Durchschnittspreis aller Produkte:
SELECT AVG(Preis) AS Durchschnittspreis
FROM Produkt;
-- Teuersten und günstigsten Preis:
SELECT MAX(Preis) AS Teuerster,
MIN(Preis) AS Guenstigster
FROM Produkt;
-- Gesamtumsatz aller Bestellungen:
SELECT SUM(Betrag) AS Gesamtumsatz
FROM Bestellung;Hinweis Zwischenprüfung: Laut Lehrplan kommen Aggregatfunktionen ohne GROUP BY dran – also immer über die gesamte Tabelle (oder mit WHERE-Filter auf die gesamte Tabelle).
Spalten umbenennen (Alias)#
SELECT COUNT(*) AS Anzahl,
AVG(Preis) AS Durchschnitt,
MAX(Preis) AS Maximum
FROM Produkt;AS gibt der Spalte im Ergebnis einen lesbaren Namen.
Vollständiges Beispiel#
Datenbank: IT-Shop
Produkt(ProduktNr, Bezeichnung, Kategorie, Preis, Lagerbestand)
Kunde(KundenNr, Name, Email, Stadt)
Bestellung(BestellNr, KundenNr, Datum, Betrag)-- 1. Alle Produkte unter 500 € sortiert nach Preis:
SELECT Bezeichnung, Preis
FROM Produkt
WHERE Preis < 500
ORDER BY Preis ASC;
-- 2. Anzahl der Produkte in der Kategorie 'Notebook':
SELECT COUNT(*) AS Anzahl_Notebooks
FROM Produkt
WHERE Kategorie = 'Notebook';
-- 3. Durchschnittspreis aller Notebooks:
SELECT AVG(Preis) AS Avg_Preis_Notebook
FROM Produkt
WHERE Kategorie = 'Notebook';
-- 4. Kunden aus Berlin mit E-Mail:
SELECT Name, Email
FROM Kunde
WHERE Stadt = 'Berlin'
AND Email IS NOT NULL
ORDER BY Name ASC;
-- 5. Gesamtumsatz aller Bestellungen im März 2026:
SELECT SUM(Betrag) AS Monatsumsatz
FROM Bestellung
WHERE Datum BETWEEN '2026-03-01' AND '2026-03-31';
-- 6. Wie viele Kunden haben keine E-Mail-Adresse?
SELECT COUNT(*) AS Ohne_Email
FROM Kunde
WHERE Email IS NULL;Datenschutz in der Datenbank (LF5 + LF4)#
Bei personenbezogenen Daten in Datenbanken sind DSGVO-Anforderungen zu beachten:
| Anforderung | Umsetzung in SQL |
|---|---|
| Datensparsamkeit | Nur notwendige Felder anlegen – kein * bei sensiblen Tabellen |
| Recht auf Löschung | DELETE FROM Kunde WHERE KundenNr = ? |
| Recht auf Auskunft | SELECT * FROM Kunde WHERE KundenNr = ? |
| Recht auf Berichtigung | UPDATE Kunde SET ... WHERE KundenNr = ? |
| Passwort-Hashing | Passwörter niemals im Klartext speichern – nur Hash (bcrypt) |
-- Falsch: Passwort im Klartext
INSERT INTO Benutzer (Name, Passwort) VALUES ('Max', 'geheim123');
-- Richtig: Nur den Hash speichern (Hashing in der Anwendung!)
INSERT INTO Benutzer (Name, Passwort_Hash)
VALUES ('Max', '$2b$12$abc...xyz'); -- bcrypt-HashPrüfungsbeispiele#
„Schreibe eine SQL-Abfrage, die alle Kunden aus München ausgibt, alphabetisch nach Name sortiert."
SELECT Name, Email
FROM Kunde
WHERE Stadt = 'München'
ORDER BY Name ASC;„Wie viele Produkte kosten mehr als 1.000 €?"
SELECT COUNT(*) AS Anzahl
FROM Produkt
WHERE Preis > 1000;„Ändere die E-Mail-Adresse des Kunden mit KundenNr 5 auf ’neu@mail.de’."
UPDATE Kunde
SET Email = 'neu@mail.de'
WHERE KundenNr = 5;„Lösche alle Produkte mit einem Lagerbestand von 0."
DELETE FROM Produkt
WHERE Lagerbestand = 0;„Was passiert, wenn man UPDATE ohne WHERE ausführt?"
→ Alle Zeilen der Tabelle werden geändert – einer der gefährlichsten SQL-Fehler! Immer WHERE prüfen vor dem Ausführen.
Siehe auch#
- erm — ERM & Relationenschreibweise als Grundlage für das Datenbankdesign mit SQL
- [[../07_softwareentwicklung/datenformate]] — SQL-Ergebnisse werden häufig als CSV oder JSON exportiert/weitergegeben
- [[../07_softwareentwicklung/softwaredokumentation]] — Datenbankschema als Bestandteil der technischen Dokumentation
- [[../10_recht/dsgvo]] — DSGVO-konforme Datenhaltung und SQL-Operationen (Auskunft, Löschung)
Ressourcen#
- Wikipedia: SQL
- Wikipedia: Datenbankabfragesprache
- Studyflix: SQL einfach erklärt
- SimpleClub: SQL SELECT WHERE GROUP BY auf YouTube suchen