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#

KategorieBedeutungBefehle
DDLData Definition Language – Struktur definierenCREATE, ALTER, DROP
DMLData Manipulation Language – Daten verändernINSERT, UPDATE, DELETE
DQLData Query Language – Daten abfragenSELECT
DCLData Control Language – Rechte verwaltenGRANT, 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#

DatentypBeschreibungBeispiel
INT / INTEGERGanze Zahl42, -5
FLOAT / DECIMAL(8,2)Dezimalzahl3.14, 1999.99
VARCHAR(n)Text mit max. n Zeichen‘Max Mustermann’
CHAR(n)Text mit genau n Zeichen‘DE’ (Ländercode)
DATEDatum‘2026-03-16’
BOOLEANWahrheitswertTRUE / FALSE
TEXTLanger Text (unbegrenzt)Beschreibungen

Constraints (Einschränkungen)#

ConstraintBedeutung
PRIMARY KEYEindeutiger Schlüssel, kein NULL
FOREIGN KEYVerweis auf PK einer anderen Tabelle
NOT NULLFeld darf nicht leer sein
UNIQUEWert muss eindeutig sein
DEFAULT wertStandardwert 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#

OperatorBedeutungBeispiel
=GleichWHERE Aktiv = TRUE
<> oder !=UngleichWHERE Status <> 'gelöscht'
<, >, <=, >=VergleichWHERE Preis >= 100
BETWEEN x AND yWertebereichWHERE Alter BETWEEN 18 AND 65
IN (a, b, c)Mehrere WerteWHERE Stadt IN ('Berlin', 'Hamburg')
LIKE 'muster'Textmuster (% = beliebig viele, _ = genau ein)WHERE Name LIKE 'M%'
IS NULLKein WertWHERE Email IS NULL
IS NOT NULLHat einen WertWHERE Email IS NOT NULL
ANDBeide BedingungenWHERE A AND B
ORMindestens eineWHERE A OR B
NOTNegationWHERE 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:

FunktionBeschreibungBeispiel
COUNT(*)Anzahl der ZeilenWie viele Kunden gibt es?
COUNT(spalte)Anzahl nicht-NULL-WerteWie viele haben eine E-Mail?
SUM(spalte)SummeGesamtumsatz
AVG(spalte)DurchschnittDurchschnittspreis
MIN(spalte)Kleinster WertGünstigstes Produkt
MAX(spalte)Größter WertTeuerster 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:

AnforderungUmsetzung in SQL
DatensparsamkeitNur notwendige Felder anlegen – kein * bei sensiblen Tabellen
Recht auf LöschungDELETE FROM Kunde WHERE KundenNr = ?
Recht auf AuskunftSELECT * FROM Kunde WHERE KundenNr = ?
Recht auf BerichtigungUPDATE Kunde SET ... WHERE KundenNr = ?
Passwort-HashingPasswö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-Hash

Prü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#