Block 01 · Datenbanken

Immer 9/9 Prüfungen · Ø 54 von 200 Punkten · Teil 1 + Teil 2 · Kürzel DB · 12 Unterthemen · 36 Aufgaben · 345 Punkte · Lösungen: 01_Datenbanken_Loesungen.html
So arbeitest du mit diesem Block Erst den Erklärungssatz lesen, dann die Aufgaben mit dem Belegsatz daneben lösen (Belegsatz am besten separat ausdrucken). Zeitrichtwert: 1 Punkt ≈ 0,9 Minuten. Lösungen erst danach in der separaten Lösungsdatei nachsehen. Alle SQL-Aufgaben laufen auf der Datenbank in Anlage 2/3; die Daten gibt es zum Ausprobieren als Skript sql/01_Datenbanken.sql (MySQL/SQLite).

A · Erklärungssatz

Die Beispiele in diesem Teil verwenden bewusst andere Szenarien (Musikschule, Fitnessstudio) als die Aufgaben in Teil C (Fahrradverleih VeloPunkt). So lernst du die Methode, ohne die Lösung schon zu kennen.

DB-01 · ER-/Relationenmodell Immer

Vorkommen: 9/9 · Prüfungen: alle (W21–S26) · meist Teil 2, Aufgabe 3 (16–25 P), zusätzlich in Teil 1 (W21, S23, W23, S24, W25)

Worum geht es?

Eine Datenbank wird in zwei Stufen entworfen:

  1. Konzeptionell – ER-Modell (Entity-Relationship-Modell): beschreibt den Ausschnitt der Realität mit Entitäten, Beziehungen und Attributen – unabhängig davon, welches Datenbanksystem später verwendet wird.
  2. Logisch – Relationenmodell (relationales Datenmodell): Tabellen mit Spalten, Primärschlüsseln (PK) und Fremdschlüsseln (FK). Es lässt sich direkt in CREATE TABLE-Befehle umsetzen.

In der Prüfung wird meist das Relationenmodell in 3. Normalform verlangt („Erstellen Sie ein relationales Datenmodell in 3NF …“), seltener ein ER-Modell (W21 T1, W23 T1, S24 T1).

Begriffe

BegriffBedeutungBeispiel (Musikschule)
Entitäteinzelnes, eindeutig unterscheidbares Objektdie Schülerin Mia Kramer
EntitätstypZusammenfassung gleichartiger Entitäten → wird zur TabelleSchüler
AttributEigenschaft eines Entitätstyps → wird zur SpalteGeburtsdatum
Schlüsselattributidentifiziert jede Entität eindeutig (im ERM unterstrichen) → wird zum PrimärschlüsselSchülerNr
Beziehung(styp)Zusammenhang zwischen Entitätstypen, mit einem Verb benanntSchüler belegt Kurs
Kardinalitätwie viele Entitäten der einen Seite mit einer Entität der anderen Seite in Beziehung stehen können1:1, 1:n, m:n
BeziehungsattributEigenschaft, die erst durch die Beziehung entsteht und zu keiner Entität allein gehörtAnmeldedatum (eines Schülers zu einem Kurs)

Notation (Chen-Notation wie im IHK-Belegsatz)

Der Belegsatz zeigt nur die drei Symbole: Rechteck = Entität, Raute = Beziehung, Ellipse = Attribut. Die Kardinalitäten stehen nicht im Belegsatz – die musst du kennen. Man schreibt sie als 1, n oder m an die Verbindungslinien.

Person besitzt Personalausweis 1 1 1 : 1 Abteilung beschäftigt Mitarbeiter 1 n 1 : n Student besucht Vorlesung m n m : n
Abb. A-1: Die drei Kardinalitäten in Chen-Notation – die Zahl steht jeweils an der Entität, deren Anzahl sie angibt

So liest du eine Beziehung: Von einer Entität über die Raute zur Zahl auf der anderen Seite: „Eine Abteilung beschäftigt n Mitarbeiter“ und „Ein Mitarbeiter wird von 1 Abteilung beschäftigt.“ Die Zahl steht also an der Entität, deren Anzahl sie angibt.

KardinalitätBedeutungBestimmung durch zwei Fragen
1:1Zu jedem A gehört höchstens ein B und umgekehrt.Wie viele Ausweise hat eine Person? Einen. Wie vielen Personen gehört ein Ausweis? Einer.
1:nEin A hat mehrere B, jedes B gehört zu genau einem A.Wie viele Mitarbeiter hat eine Abteilung? Mehrere. In wie vielen Abteilungen arbeitet ein Mitarbeiter? In einer.
m:nEin A hat mehrere B und ein B hat mehrere A.Wie viele Vorlesungen besucht ein Student? Mehrere. Wie viele Studenten besuchen eine Vorlesung? Mehrere.
MerkeKardinalität immer mit zwei Fragen bestimmen – einmal von links nach rechts, einmal von rechts nach links („Wie viele B kann ein A haben?“ / „Wie viele A kann ein B haben?“). Zweimal „einer“ → 1:1, einmal „mehrere“ → 1:n, zweimal „mehrere“ → m:n.

Ergänzung: Manche Lehrbücher nutzen die modifizierte Chen-Notation mit c (0 oder 1) und mc (0 bis viele) oder die Min-Max-Notation (0,1), (1,*). In den IHK-Lösungen genügen 1, n, m.

Besondere Beziehungen

Beispiel Musikschule: Eine Lehrkraft leitet mehrere Kurse, jeder Kurs hat genau eine Lehrkraft. Schüler belegen beliebig viele Kurse, ein Kurs hat viele Schüler; gespeichert wird das Anmeldedatum. Erfahrene Lehrkräfte betreuen als Mentor mehrere neue Lehrkräfte, jede Lehrkraft hat höchstens einen Mentor. Ein Schüler kann höchstens ein Leihinstrument ausleihen, ein Leihinstrument ist höchstens an einen Schüler verliehen.

Lehrkraft Kurs Schüler Leihinstrument leitet belegt leiht betreut 1 n n m 1 1 n 1 Mentor Mentee LehrerNr Name KursNr Titel Anmeldedatum SchülerNr Name InstrumentNr Bezeichnung
Abb. A-2: ER-Modell „Musikschule“ (Chen-Notation, Schlüsselattribute unterstrichen)

Vom ER-Modell zum Relationenmodell

Begriff im RelationenmodellBedeutung
Relation / Tabelleentspricht einem Entitätstyp (oder einer aufgelösten m:n-Beziehung)
Tupel / Datensatz / Zeileeine Entität
Primärschlüssel (PK)Spalte(n), die jede Zeile eindeutig identifizieren; nie NULL, nie doppelt
Zusammengesetzter SchlüsselPK aus mehreren Spalten, typisch in Zwischentabellen
Surrogatschlüsselkünstliche, fortlaufende Nummer (ID) ohne fachliche Bedeutung
Fremdschlüssel (FK)Spalte, die auf den PK einer anderen (oder derselben) Tabelle verweist und so die Beziehung herstellt

Zwei übliche Darstellungen (beide werden in der Prüfung akzeptiert):

  1. Textnotation: Kurs(KursNr, Titel, Wochentag, ↑LehrerNr) – PK unterstrichen, FK mit ↑ (alternativ # oder „(FK)“) gekennzeichnet.
  2. Tabellen-Kästen (so zeichnen die IHK-Lösungen): Tabellenname als Kopf, darunter die Attribute mit „(PK)“/„(FK)“, Verbindungslinien zwischen den Tabellen mit 1 und n an den Enden.
Typische FalleDie Notation des Relationenmodells (PK/FK-Kennzeichnung, Kardinalitäten an den Linien) steht nicht im Belegsatz. Du musst sie selbst beherrschen.

Überführungsregeln

Im ER-ModellUmsetzung im Relationenmodell
Entitätstypeigene Tabelle; das Schlüsselattribut wird PK
AttributSpalte; zusammengesetzte Attribute zerlegen (Anschrift → Straße, Hausnummer, PLZ, Ort; Name → Vorname, Nachname)
1:nPK der 1-Seite wird als FK in die Tabelle der n-Seite aufgenommen
1:1FK in eine der beiden Tabellen – am besten in die Tabelle, deren Datensätze immer einen Partner haben (dann ist der FK nie NULL) – und zusätzlich UNIQUE, damit jeder Wert nur einmal vorkommt; alternativ beide Tabellen zusammenlegen
m:neigene Zwischentabelle (Verbindungstabelle) mit den PKs beider Seiten als FKs; beide zusammen bilden den PK. Beziehungsattribute kommen in die Zwischentabelle. Aus einer m:n werden zwei 1:n-Beziehungen.
rekursiv 1:nFK in derselben Tabelle, der auf den eigenen PK zeigt (MentorNr → LehrerNr)
rekursiv m:nZwischentabelle mit zwei FKs auf dieselbe Tabelle, z. B. Stückliste(↑OberteilNr, ↑UnterteilNr, Menge)
mehrere Beziehungen zwischen denselben Tabellenje Beziehung ein eigener FK mit sprechendem Namen, z. B. Spiel(SpielNr, ↑HeimTeamNr, ↑GastTeamNr)
Lehrkraft LehrerNr (PK) Name Telefon MentorNr (FK) Kurs KursNr (PK) Titel Wochentag LehrerNr (FK) Leihinstrument InstrumentNr (PK) Bezeichnung SchuelerNr (FK, UNIQUE) Belegung SchuelerNr (PK, FK) KursNr (PK, FK) Anmeldedatum Schueler SchuelerNr (PK) Vorname Nachname Geburtsdatum 1 n 1 n 1 n 1 n 1 1
Abb. A-3: Relationenmodell „Musikschule“ als Tabellen-Kästen (IHK-Darstellung)

Dasselbe Modell in Textnotation:

Lehrkraft(LehrerNr, Name, Telefon, ↑MentorNr)

Kurs(KursNr, Titel, Wochentag, ↑LehrerNr)

Schueler(SchuelerNr, Vorname, Nachname, Geburtsdatum)

Belegung(↑SchuelerNr, ↑KursNr, Anmeldedatum)

Leihinstrument(InstrumentNr, Bezeichnung, ↑SchuelerNr) – SchuelerNr ist UNIQUE (1:1)

Merke Der Fremdschlüssel steht immer auf der n-Seite. Eine m:n-Beziehung gibt es im Relationenmodell nicht – sie wird immer über eine Zwischentabelle aufgelöst, deren PK aus den beiden FKs besteht.

So gehst du vor (Teil 2, Aufgabe 3)

  1. Text/Formular durcharbeiten: Substantive → Kandidaten für Tabellen und Attribute, Verben → Beziehungen.
  2. Je Tabelle alle genannten Attribute sammeln. „Übernehmen Sie alle genannten Attribute“ bringt Punkte – nichts weglassen.
  3. PK festlegen (vorhandene Nummer oder künstliche ID).
  4. Kardinalität jeder Beziehung mit den zwei Fragen bestimmen.
  5. 1:n → FK auf die n-Seite; m:n → Zwischentabelle; 1:1 → FK + UNIQUE.
  6. Beziehungsattribute (Menge, Datum, Anzahl, Note) in die Zwischentabelle.
  7. 3NF prüfen (→ DB-02): keine Mehrfachwerte, keine berechneten Werte, keine transitiven Abhängigkeiten.
  8. Zeichnen: jede Linie mit 1/n beschriften, FKs kennzeichnen. Ein vorgegebenes ERM vollständig übernehmen – auch die schon gegebenen Beziehungen bringen Punkte.
Typische Fallen
So wird es in der Prüfung gefragt

DB-02 · Normalisierung 1NF–3NF Immer

Vorkommen: 8/9 · Prüfungen: alle außer S24 · Teil 2, Aufgabe 3 und Teil 1 (S23, W25)

Warum normalisieren?

Redundanz = dieselbe Information ist mehrfach gespeichert. Das kostet Speicher, vor allem aber führt es zu Inkonsistenzen (widersprüchlichen Daten), weil Änderungen nicht überall nachgezogen werden. Ziel der Normalisierung: jede Information genau einmal speichern und so Anomalien verhindern.

Beispiel – unnormalisierte Kursliste einer Musikschule (Excel):

KursNrKurstitelLehrerNrLehrerRaumTeilnehmer
K1Gitarre AnfängerL7Petra LangR2101 Mia Kramer, 102 Noah Ernst
K2KlavierL3Uwe BrandlR1101 Mia Kramer
K3Gitarre Fortgeschr.L7Petra LangR2103 Lea Fink, 102 Noah Ernst

Anomalien

AnomalieBedeutungBeispiel aus der Kursliste
EinfügeanomalieEin Sachverhalt kann nicht gespeichert werden, ohne dass gleichzeitig ein anderer, noch nicht vorhandener Sachverhalt erfasst wird.Eine neue Lehrkraft kann erst gespeichert werden, wenn sie einen Kurs hat (die Zeile braucht eine KursNr).
ÄnderungsanomalieEine Änderung muss an mehreren Stellen erfolgen; wird eine Stelle vergessen, ist der Bestand widersprüchlich.Petra Lang heißt nach der Heirat Petra Roos → in K1 und K3 ändern; wird K3 vergessen, gibt es zwei Namen für L7.
LöschanomalieBeim Löschen eines Datensatzes gehen ungewollt weitere Informationen verloren.Wird Kurs K2 gelöscht, ist auch jede Information über Uwe Brandl weg.
So wird es in der Prüfung gefragt „Erläutern Sie die Änderungsanomalie …“ heißt: Begriff erklären UND am konkreten Datensatz der Anlage zeigen (welche Zeilen, welcher Wert). Eine reine Definition gibt nur die Hälfte der Punkte (W25 T1 4b: drei Anomalien, 6 P; S23 T1 4ca: Änderungsanomalie, 3 P; W25 T1 4a: Redundanz an einem Beispiel, 2 P).

Grundbegriffe

Die drei Normalformen

NFRegelTypischer VerstoßLösung
1NFAlle Attributwerte sind atomar (ein Wert pro Feld), keine Wiederholungsgruppen.„101 Mia Kramer, 102 Noah Ernst“ in einem Feld; „Petra Lang“ statt Vor- und Nachname getrenntMehrfachwerte in eigene Zeilen bzw. eigene Tabelle; zusammengesetzte Felder zerlegen
2NF1NF und jedes Nichtschlüsselattribut ist voll funktional vom gesamten PK abhängig.Teilnahme(KursNr, SchuelerNr, Kurstitel): Kurstitel hängt nur von KursNr abteilabhängige Attribute mit ihrem Teilschlüssel in eine eigene Tabelle
3NF2NF und kein Nichtschlüsselattribut hängt transitiv (über ein anderes Nichtschlüsselattribut) vom PK ab.Kurs(KursNr, LehrerNr, Lehrer): Lehrer hängt von LehrerNr abtransitiv abhängige Attribute in eigene Tabelle; das „Zwischenattribut“ wird dort PK und bleibt in der Ursprungstabelle als FK
Merke Jedes Nichtschlüsselattribut hängt vom Schlüssel ab (1NF), vom ganzen Schlüssel (2NF) und von nichts als dem Schlüssel (3NF).
Die 2NF kann nur bei einem zusammengesetzten PK verletzt sein. Eine Tabelle in 1NF mit einspaltigem PK ist automatisch in 2NF.

Durchgerechnetes Beispiel: Kursliste → 3NF

1NF: Je Kurs und Teilnehmer eine eigene Zeile, Namen zerlegt. Schlüssel: (KursNr, SchuelerNr).

Kursliste(KursNr, SchuelerNr, Kurstitel, LehrerNr, LehrerVorname, LehrerNachname, Raum, SchuelerVorname, SchuelerNachname)

2NF: Kurstitel, LehrerNr, Lehrername und Raum hängen nur von KursNr ab, die Schülernamen nur von SchuelerNr → auslagern.

Kurs(KursNr, Kurstitel, LehrerNr, LehrerVorname, LehrerNachname, Raum)

Schueler(SchuelerNr, Vorname, Nachname)

Belegung(↑KursNr, ↑SchuelerNr)

3NF: In Kurs hängen die Lehrernamen transitiv über LehrerNr vom PK ab → eigene Tabelle.

Lehrkraft(LehrerNr, Vorname, Nachname)

Kurs(KursNr, Kurstitel, Raum, ↑LehrerNr)

Schueler(SchuelerNr, Vorname, Nachname)

Belegung(↑KursNr, ↑SchuelerNr)

Hätte ein Raum weitere Eigenschaften (Größe, Etage), bekäme auch er eine eigene Tabelle Raum(RaumNr, …) und Kurs einen FK RaumNr.

Formular/Beleg → 3NF: So gehst du vor

  1. Alle Felder des Formulars als Attributliste aufschreiben – auch Kopf- und Fußdaten.
  2. Berechnete Felder streichen (Positionsbetrag, Summe, Steuerbetrag, Alter) – sie werden bei Bedarf per SQL berechnet.
  3. Zusammengesetzte Felder zerlegen (Name, Anschrift).
  4. Wiederholgruppen (z. B. Positionen) erkennen → eigene Tabelle mit FK zum Kopf (1NF).
  5. Für jede Attributgruppe fragen: „Wovon hängt dieser Wert ab?“ → je „Ding“ (Person, Artikel, Ort …) eine Tabelle (2NF/3NF).
  6. Historische Werte bewusst speichern: Ein Preis, der zum Zeitpunkt des Belegs galt, gehört in die Positionstabelle, weil sich der aktuelle Preis ändern kann. Das ist keine Redundanz im Sinne der Normalisierung.
  7. Beziehungen, Kardinalitäten und FKs eintragen.
Typische Fallen
So wird es in der Prüfung gefragt
Beispieldatenbank für die SQL-Erklärungen (DB-03 bis DB-11): Fitnessstudio Alle Beispielabfragen und -ergebnisse in diesem Erklärungssatz beziehen sich auf diese vier Tabellen (Kurs.TrainerNr → Trainer, Buchung.MitgliedNr → Mitglied, Buchung.KursNr → Kurs). Kurs „Boxen“ hat (noch) keinen Trainer, Trainer „Jan Ott“ keinen Kurs, Mitglied „Wolf“ keine Buchung.

Mitglied

MitgliedNrVornameNachnameOrtEintritt
1AnnaBergBonn2024-01-15
2BenKurzKöln2025-03-01
3CemAydinBonn2025-09-10
4DanaWolfSiegburg2026-02-01

Trainer

TrainerNrName
1Lisa Stein
2Omar Haddad
3Jan Ott

Kurs

KursNrTitelTrainerNrPreis
10Yoga18.00
11Spinning210.00
12Pilates19.00
13BoxenNULL12.00

Buchung

BuchungNrMitgliedNrKursNrDatum
11102026-03-02
21112026-03-04
32102026-03-02
43112026-04-07
51102026-04-06
62122026-04-08

DB-03 · SQL: SELECT mit JOIN Immer

Vorkommen: 9/9 · Prüfungen: alle · Teil 2, Aufgabe 4 (die SQL-Aufgabe ist in allen 9 Prüfungen Aufgabe 4 von Teil 2)

Aufbau einer Abfrage

SELECT   Spalten / Ausdrücke [AS Alias]   -- was wird angezeigt?
FROM     Tabelle [Alias]
  [INNER | LEFT] JOIN Tabelle2 ON Bedingung
WHERE    Bedingung für einzelne Zeilen
GROUP BY Spalten
HAVING   Bedingung für Gruppen
ORDER BY Spalte [ASC | DESC], …;
Merke Die Schreibreihenfolge ist fest: SELECT – FROM – (JOIN) – WHERE – GROUP BY – HAVING – ORDER BY.
Die Ausführungsreihenfolge ist eine andere: FROM/JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. Darum darf ein Spaltenalias aus dem SELECT in ORDER BY verwendet werden, aber nicht in WHERE.

Bedingungen in WHERE

OperatorBeispielBedeutung
= <> < > <= >=Preis >= 9Vergleich (<> = ungleich)
AND, OR, NOTOrt = 'Bonn' AND Eintritt >= '2025-01-01'Verknüpfung; AND bindet stärker als OR → Klammern setzen
BETWEEN … AND …Datum BETWEEN '2026-03-01' AND '2026-03-31'Bereich, beide Grenzen inklusive
IN (…)Ort IN ('Bonn', 'Köln')einer der aufgezählten Werte
LIKENachname LIKE 'B%', Code LIKE 'A_7%'Muster: % = beliebig viele Zeichen (auch keins), _ = genau ein Zeichen
IS NULL / IS NOT NULLTrainerNr IS NULLprüft auf „kein Wert“ – niemals = NULL

Texte und Datumswerte stehen in einfachen Anführungszeichen, Zahlen ohne. Dezimalpunkt statt Komma (9.50). Datumsliterale im Format 'JJJJ-MM-TT'.

Funktionen, berechnete Spalten, Alias

Funktion (MySQL)Ergebnis
YEAR(d), MONTH(d), DAY(d)Jahr, Monat (1–12), Tag aus einem Datum
CURDATE(), NOW()heutiges Datum bzw. Datum mit Uhrzeit
DATEDIFF(d1, d2)Anzahl Tage d1 − d2 (DATEDIFF('2026-04-08', '2026-04-06') = 2)
Preis * 10 AS Zehnerkarteberechnete Spalte mit Alias

Dialekt-Hinweis: Im IHK-Belegsatz (z. B. S22) steht DATEDIFF(Datumsteil, Anfangsdatum, Enddatum) sowie TODAY/CURRENT (SQL-Server-Stil). Verwende in der Prüfung die Schreibweise aus dem Belegsatz deiner Prüfung; sinnvolle Varianten werden akzeptiert.

SELECT Nachname, Ort, YEAR(Eintritt) AS Jahr
FROM   Mitglied
WHERE  YEAR(Eintritt) >= 2025 AND (Ort = 'Bonn' OR Ort = 'Siegburg')
ORDER BY Eintritt;
NachnameOrtJahr
AydinBonn2025
WolfSiegburg2026
SELECT Titel, Preis, Preis * 10 AS Zehnerkarte, Preis * 10 * 0.9 AS ZehnerkarteRabatt
FROM   Kurs
WHERE  Titel LIKE '%ing%' OR Titel LIKE 'Y%';
TitelPreisZehnerkarteZehnerkarteRabatt
Yoga8.0080.0072.00
Spinning10.00100.0090.00

JOIN-Arten

Ein JOIN verbindet Tabellen über ihre Beziehung, fast immer FK = PK. Fehlt die ON-Bedingung, entsteht das kartesische Produkt (jede Zeile mit jeder).

JOIN-Artliefert
[INNER] JOINnur Zeilen, die auf beiden Seiten einen Partner haben
LEFT [OUTER] JOINalle Zeilen der linken Tabelle (vor dem JOIN), dazu die passenden der rechten; fehlt ein Partner, sind die rechten Spalten NULL
RIGHT [OUTER] JOINumgekehrt: alle Zeilen der rechten Tabelle (selten nötig – man kann die Tabellen tauschen und LEFT JOIN nehmen)
SELECT k.Titel, t.Name
FROM   Kurs k
  INNER JOIN Trainer t ON t.TrainerNr = k.TrainerNr;   -- bzw. LEFT JOIN / RIGHT JOIN

INNER JOIN (Boxen fehlt)

TitelName
YogaLisa Stein
SpinningOmar Haddad
PilatesLisa Stein

LEFT JOIN (alle Kurse)

TitelName
YogaLisa Stein
SpinningOmar Haddad
PilatesLisa Stein
BoxenNULL

RIGHT JOIN (alle Trainer)

TitelName
YogaLisa Stein
PilatesLisa Stein
SpinningOmar Haddad
NULLJan Ott

Mehrere Tabellen verbindet man als Kette entlang der Fremdschlüssel. Tabellenaliase (m, b, k) sparen Schreibarbeit und machen Spaltennamen eindeutig:

SELECT m.Nachname, k.Titel, b.Datum
FROM   Mitglied m
  INNER JOIN Buchung b ON b.MitgliedNr = m.MitgliedNr
  INNER JOIN Kurs k    ON k.KursNr     = b.KursNr
WHERE  m.Ort = 'Bonn'
ORDER BY b.Datum;
NachnameTitelDatum
BergYoga2026-03-02
BergSpinning2026-03-04
BergYoga2026-04-06
AydinSpinning2026-04-07

Die ältere Schreibweise FROM Mitglied m, Buchung b, Kurs k WHERE b.MitgliedNr = m.MitgliedNr AND … ist gleichwertig zum INNER JOIN und wird akzeptiert. Für einen LEFT JOIN braucht man aber die JOIN-Syntax.

Die LEFT-JOIN-Falle: Bedingung in ON oder in WHERE?

Aufgabe: „Alle Mitglieder mit ihren Buchungen im April – auch Mitglieder ohne April-Buchung sollen erscheinen.“

Richtig – Bedingung in ON

SELECT m.Nachname, b.Datum
FROM   Mitglied m
  LEFT JOIN Buchung b
    ON  b.MitgliedNr = m.MitgliedNr
    AND MONTH(b.Datum) = 4
ORDER BY m.Nachname;
NachnameDatum
Aydin2026-04-07
Berg2026-04-06
Kurz2026-04-08
WolfNULL

Falsch – Bedingung in WHERE

SELECT m.Nachname, b.Datum
FROM   Mitglied m
  LEFT JOIN Buchung b
    ON  b.MitgliedNr = m.MitgliedNr
WHERE  MONTH(b.Datum) = 4
ORDER BY m.Nachname;
NachnameDatum
Aydin2026-04-07
Berg2026-04-06
Kurz2026-04-08

WHERE wird nach dem Join ausgewertet. Für „Wolf“ ist b.Datum NULL, MONTH(NULL) = 4 ist nicht wahr → die Zeile fällt heraus. Der LEFT JOIN wirkt dann wie ein INNER JOIN. Ebenso würden Mitglieder fehlen, die nur im März gebucht haben.

Merke „Auch X ohne Y“ / „alle X, auch wenn …“ → LEFT JOIN, die Tabelle mit „allen“ Zeilen steht links (nach FROM).
Bedingungen auf die rechte (optionale) Tabelle gehören in die ON-Klausel; Bedingungen auf die linke Tabelle dürfen in WHERE stehen.
Typische Fallen
So wird es in der Prüfung gefragt

DB-04 · SQL: Aggregatfunktionen, GROUP BY und HAVING Immer

Vorkommen: 8/9 · Prüfungen: alle außer W24 · Teil 2, Aufgabe 4

Aggregatfunktionen

FunktionliefertNULL-Werte
COUNT(*)Anzahl Zeilenwerden mitgezählt
COUNT(Spalte)Anzahl Werte in der Spaltewerden nicht gezählt
COUNT(DISTINCT Spalte)Anzahl verschiedener Wertenicht gezählt
SUM, AVGSumme, Durchschnittignoriert (AVG teilt nur durch die Anzahl der Nicht-NULL-Werte)
MIN, MAXkleinster, größter Wert (auch bei Text und Datum)ignoriert
SELECT COUNT(*) AS Anzahl, MIN(Preis) AS Min, MAX(Preis) AS Max,
       SUM(Preis) AS Summe, AVG(Preis) AS Schnitt
FROM   Kurs;
AnzahlMinMaxSummeSchnitt
48.0012.0039.009.7500
SELECT COUNT(*) AS alle, COUNT(TrainerNr) AS mitTrainer, COUNT(DISTINCT TrainerNr) AS versch
FROM   Kurs;
allemitTrainerversch
432

GROUP BY

Ohne GROUP BY fasst eine Aggregatfunktion die ganze (gefilterte) Tabelle zu einer Zeile zusammen. Mit GROUP BY entsteht je Gruppe eine Zeile.

Merke – GROUP-BY-Regel Jede Spalte im SELECT, die nicht in einer Aggregatfunktion steht, muss auch im GROUP BY stehen. (MySQL ist je nach Einstellung toleranter – die Prüfung erwartet die Regel.)

Beispiel: Anzahl Buchungen je Kurs – auch Kurse ohne Buchung:

SELECT k.Titel, COUNT(b.BuchungNr) AS Anzahl, COUNT(*) AS Zeilen
FROM   Kurs k
  LEFT JOIN Buchung b ON b.KursNr = k.KursNr
GROUP BY k.KursNr, k.Titel
ORDER BY Anzahl DESC;
TitelAnzahlZeilen
Yoga33
Spinning22
Pilates11
Boxen01

„Boxen“ hat keine Buchung. Nach dem LEFT JOIN existiert trotzdem eine Zeile (mit NULL in den Buchungsspalten). COUNT(*) zählt diese Zeile mit (1), COUNT(b.BuchungNr) zählt nur echte Buchungen (0).

WHERE oder HAVING?

WHEREHAVING
filterteinzelne ZeilenGruppen
Zeitpunktvor der Gruppierungnach der Gruppierung
Aggregatfunktionen erlaubt?neinja
BeispielWHERE YEAR(b.Datum) = 2026HAVING COUNT(*) >= 2
SELECT m.MitgliedNr, m.Nachname, COUNT(*) AS Buchungen
FROM   Mitglied m
  INNER JOIN Buchung b ON b.MitgliedNr = m.MitgliedNr
WHERE  YEAR(b.Datum) = 2026          -- Zeilenfilter
GROUP BY m.MitgliedNr, m.Nachname
HAVING COUNT(*) >= 2;                -- Gruppenfilter
MitgliedNrNachnameBuchungen
1Berg3
2Kurz2

So gehst du vor

  1. „je …“, „pro …“, „für jede(n) …“ → das ist die GROUP-BY-Spalte (plus die Spalten, die dazu angezeigt werden sollen).
  2. „Anzahl“ → COUNT, „Summe/Umsatz/Gesamt“ → SUM, „Durchschnitt“ → AVG, „höchste/niedrigste/letzte“ → MAX/MIN.
  3. Bedingung an Einzelzeilen (Jahr, Status, Ort) → WHERE. Bedingung an das Gruppenergebnis („mehr als 3“, „Summe über 100 €“) → HAVING.
  4. „auch … ohne …“ / „mit 0“ → LEFT JOIN und COUNT(Spalte der rechten Tabelle).
  5. Sortieren nach dem Aggregat: ORDER BY Anzahl DESC (Alias) oder ORDER BY COUNT(*) DESC.
Typische Fallen
So wird es in der Prüfung gefragt

DB-05 · SQL: INSERT, UPDATE, DELETE Meistens

Vorkommen: 7/9 · Prüfungen: W21, S22, W22, W23, S24, W25, S26 · Teil 2, Aufgabe 4

INSERT – Datensätze einfügen

INSERT INTO Mitglied (MitgliedNr, Vorname, Nachname, Ort, Eintritt)
VALUES (5, 'Eva', 'Lorenz', 'Bonn', '2026-10-01');

-- mehrere Zeilen auf einmal
INSERT INTO Trainer (TrainerNr, Name)
VALUES (4, 'Kai Brehm'), (5, 'Ina Vogt');

UPDATE – Werte ändern

UPDATE Kurs
SET    Preis = Preis * 1.05              -- Preis um 5 % erhöhen
WHERE  TrainerNr = 1;

-- mit Unterabfrage (die Nummer ist nicht bekannt, nur der Name)
UPDATE Kurs
SET    Preis = Preis - 1
WHERE  TrainerNr = (SELECT TrainerNr FROM Trainer WHERE Name = 'Omar Haddad');

-- MySQL-Variante: UPDATE mit JOIN
UPDATE Kurs k
  INNER JOIN Trainer t ON t.TrainerNr = k.TrainerNr
SET    k.Preis = k.Preis - 1
WHERE  t.Name = 'Omar Haddad';
MerkeUPDATE und DELETE ohne WHERE betreffen alle Zeilen der Tabelle. Mehrere Spalten trennt man im SET mit Komma: SET Preis = 9.50, TrainerNr = 2.

DELETE – Datensätze löschen

DELETE FROM Buchung
WHERE  Datum < '2026-04-01';

Referenzielle Integrität: Ein Datensatz, auf den noch ein Fremdschlüssel zeigt, kann (ohne ON DELETE CASCADE) nicht gelöscht werden. Deshalb gilt:

-- Mitglied 2 vollständig löschen
DELETE FROM Buchung  WHERE MitgliedNr = 2;   -- 1. Kind
DELETE FROM Mitglied WHERE MitgliedNr = 2;   -- 2. Eltern
BefehlWirkung
DELETE FROM t WHERE …löscht ausgewählte Zeilen (DML), Struktur bleibt
TRUNCATE TABLE tleert die ganze Tabelle schnell (DDL), Struktur bleibt
DROP TABLE tlöscht die Tabelle samt Struktur und Daten

Archivierungsmuster: INSERT … SELECT + DELETE

Alte Datensätze werden aus der Arbeitstabelle in eine Archivtabelle verschoben: Die Arbeitstabelle bleibt klein und schnell, die Historie bleibt erhalten.

START TRANSACTION;

INSERT INTO Buchung_Archiv (BuchungNr, MitgliedNr, KursNr, Datum)
SELECT BuchungNr, MitgliedNr, KursNr, Datum
FROM   Buchung
WHERE  Datum < '2026-04-01';

DELETE FROM Buchung
WHERE  Datum < '2026-04-01';

COMMIT;
Merke Gleiche WHERE-Bedingung im INSERT…SELECT und im DELETE · erst kopieren, dann löschen · beides in einer Transaktion · bei INSERT…SELECT kein VALUES.

Hat die Archivtabelle eine andere Struktur (Klartext statt Fremdschlüssel, berechnete Werte), wird im SELECT gejoint und gerechnet:

INSERT INTO Kurs_Archiv (KursNr, Titel, Trainer, AnzahlBuchungen)
SELECT k.KursNr, k.Titel, t.Name, COUNT(b.BuchungNr)
FROM   Kurs k
  LEFT JOIN Trainer t ON t.TrainerNr = k.TrainerNr
  LEFT JOIN Buchung b ON b.KursNr   = k.KursNr
WHERE  k.KursNr = 12
GROUP BY k.KursNr, k.Titel, t.Name;
KursNrTitelTrainerAnzahlBuchungen
12PilatesLisa Stein1
Typische Fallen
So wird es in der Prüfung gefragt

DB-06 · Datenbank-Theorie: ACID, Transaktion, Integrität, Index, NoSQL Meistens

Vorkommen: 6/9 · Prüfungen: S22, W22, S23, W23, W24, W25 · meist Teil 1

Transaktion und ACID

Eine Transaktion ist eine Folge von Datenbankoperationen, die als logische Einheit ganz oder gar nicht ausgeführt wird. START TRANSACTION beginnt sie, COMMIT macht die Änderungen dauerhaft, ROLLBACK nimmt alle Änderungen seit Beginn zurück.

Beispiel: Ein Mitglied wird von Kurs A nach Kurs B umgebucht (DELETE der alten + INSERT der neuen Buchung). Fällt nach dem DELETE der Server aus, wäre das Mitglied ohne Transaktion in gar keinem Kurs mehr.

EigenschaftBedeutungBeispiel Fitnessstudio
Atomicity – Atomaritätalles oder nichts; bei Fehler wird alles zurückgesetztUmbuchung wird komplett oder gar nicht ausgeführt
Consistency – KonsistenzDie DB geht von einem konsistenten in einen konsistenten Zustand über; alle Integritätsbedingungen (PK, FK, CHECK) sind danach erfüllt.keine Buchung auf einen nicht existierenden Kurs
IsolationGleichzeitig laufende Transaktionen beeinflussen sich nicht – das Ergebnis ist so, als liefen sie nacheinander.Zwei Mitglieder buchen gleichzeitig den letzten freien Platz → nur eines bekommt ihn.
Durability – DauerhaftigkeitNach dem COMMIT bleiben die Änderungen erhalten, auch bei Absturz oder Stromausfall.Bestätigte Buchung ist nach dem Neustart noch da.

Referenzielle Integrität

Jeder Fremdschlüsselwert muss als Primärschlüsselwert in der referenzierten Tabelle existieren (oder NULL sein, wenn erlaubt). Das DBMS verhindert daher

RegelWirkung beim Löschen des Eltern-Datensatzes
ON DELETE RESTRICT / NO ACTIONLöschen wird verweigert (Standard)
ON DELETE CASCADEabhängige Datensätze werden automatisch mitgelöscht
ON DELETE SET NULLFK in den abhängigen Datensätzen wird auf NULL gesetzt
FOREIGN KEY (TrainerNr) REFERENCES Trainer (TrainerNr) ON DELETE SET NULL

Index

Ein Index ist eine zusätzliche, sortierte Datenstruktur (meist ein B-Baum) über eine oder mehrere Spalten – vergleichbar mit dem Stichwortverzeichnis eines Buches. Ohne Index muss das DBMS bei einer Suche die ganze Tabelle lesen (Full Table Scan).

VorteileNachteile
schnelleres Suchen (WHERE), Verknüpfen (JOIN) und Sortieren (ORDER BY)
UNIQUE-Index stellt Eindeutigkeit sicher
zusätzlicher Speicherplatz
INSERT, UPDATE und DELETE werden langsamer, weil der Index mitgepflegt werden muss

Sinnvoll für Spalten, die oft in WHERE, JOIN (Fremdschlüssel!) oder ORDER BY vorkommen, bei großen Tabellen und Spalten mit vielen verschiedenen Werten. Wenig sinnvoll bei kleinen Tabellen, bei Spalten mit wenigen verschiedenen Werten (z. B. ja/nein) und bei Tabellen mit sehr vielen Schreibzugriffen. Der Primärschlüssel ist automatisch indiziert.

CREATE INDEX idx_buchung_datum ON Buchung (Datum);

Redundanz und Anomalien

Siehe DB-02. Ergänzung: Gewollte Redundanz gibt es z. B. in Archiv- und Auswertungstabellen (Data Warehouse), bei bewusster Denormalisierung für schnellere Abfragen und bei Datensicherungen.

NoSQL und dokumentenorientierte Datenbanken

NoSQL („not only SQL“) bezeichnet Datenbanken ohne festes Tabellenschema. Arten: Dokumentenorientiert (JSON-Dokumente, z. B. MongoDB), Key-Value (Schlüssel → Wert, z. B. Cache, Sitzungsdaten), spaltenorientiert (Wide Column, sehr große verteilte Datenmengen), Graph (Knoten und Kanten, z. B. soziale Netze, Routen).

RelationalDokumentenorientiert
TabelleCollection (Sammlung)
Zeile / DatensatzDocument (Dokument)
Spalte / AttributField (Feld, Schlüssel-Wert-Paar)
Primärschlüssel_id (Dokument-ID)
Fremdschlüssel + JOINReferenz (gespeicherte ID eines anderen Dokuments) oder Einbettung (Embedding)

Einbettung vs. Referenz am Beispiel „Mitglied mit Buchungen“:

Einbettung (Embedding)

{
  "_id": 1,
  "vorname": "Anna",
  "nachname": "Berg",
  "ort": "Bonn",
  "buchungen": [
    { "datum": "2026-03-02", "kurs": "Yoga" },
    { "datum": "2026-03-04", "kurs": "Spinning" }
  ]
}

Referenz

// Collection "mitglieder"
{ "_id": 1, "vorname": "Anna",
  "nachname": "Berg", "ort": "Bonn" }

// Collection "buchungen"
{ "_id": 1, "mitgliedId": 1,
  "kursId": 10, "datum": "2026-03-02" }
EinbettungReferenz
Vorteilein Lesezugriff liefert alles; Änderung eines Dokuments ist atomarkeine Duplikate; Daten unabhängig voneinander änderbar
NachteilDaten werden dupliziert (Kursname in vielen Dokumenten); Dokumente wachsenmehrere Abfragen bzw. Verknüpfung (Lookup) nötig
geeignet für„gehört zu“, wird zusammen gelesen, 1:wenigem:n, große oder unabhängig geänderte Daten

JSON-Regeln: Objekt { "schlüssel": wert, … }, Array [ wert, wert ]; Schlüssel und Strings in doppelten Anführungszeichen; Zahlen, true, false, null ohne; kein Komma nach dem letzten Element; Datum als String.

KriteriumRelationale DBDokumentenorientierte DB
Schemafest, vorab definiertflexibel, Dokumente einer Collection dürfen unterschiedlich aufgebaut sein
Strukturnormalisierte Tabellenverschachtelte Dokumente
BeziehungenFK + JOINEinbettung oder Referenz, kaum Joins
KonsistenzACID über beliebig viele Tabellenoft nur je Dokument atomar; verteilt häufig „eventual consistency“ (BASE)
Skalierungeher vertikal (größerer Server)horizontal (viele Server, Sharding)
Abfragestandardisiertes SQLproduktspezifische Abfragesprache/API
typischer EinsatzBuchhaltung, Verwaltung, viele Beziehungen, strenge Konsistenzgroße, wechselnd strukturierte Datenmengen: Logs, Sensordaten, Kataloge, Inhalte
So wird es in der Prüfung gefragt

DB-07 · SQL: Unterabfragen Oft

Vorkommen: 5/9 · Prüfungen: W21, S22, W22, W23, S26 · Teil 2, Aufgabe 4

Eine Unterabfrage (Subquery) ist ein SELECT in Klammern innerhalb einer anderen Anweisung (SELECT, UPDATE, DELETE, INSERT).

Artliefertverwendet mit
skalare Unterabfragegenau einen Wert= < > …, auch im SELECT oder SET
Listen-Unterabfrageeine Spalte, mehrere ZeilenIN, NOT IN
EXISTS-Unterabfragewahr/falsch (gibt es mindestens eine Zeile?)EXISTS, NOT EXISTS
Tabellen-Unterabfrageeine (Zwischen-)Tabellein FROM (…) AS alias

Vergleich mit einem Aggregat – Kurse, die teurer sind als der Durchschnitt:

SELECT Titel, Preis
FROM   Kurs
WHERE  Preis > (SELECT AVG(Preis) FROM Kurs);
TitelPreis
Spinning10.00
Boxen12.00

IN – Mitglieder, die Spinning (Kurs 11) gebucht haben:

SELECT Nachname
FROM   Mitglied
WHERE  MitgliedNr IN (SELECT MitgliedNr FROM Buchung WHERE KursNr = 11);
Nachname
Berg
Aydin

NOT EXISTS – Mitglieder ohne jede Buchung:

SELECT m.Nachname
FROM   Mitglied m
WHERE  NOT EXISTS (SELECT * FROM Buchung b WHERE b.MitgliedNr = m.MitgliedNr);
Nachname
Wolf

Korreliert oder nicht korreliert?

Korreliertes Beispiel – die jeweils letzte Buchung jedes Mitglieds:

SELECT b.BuchungNr, b.MitgliedNr, b.Datum
FROM   Buchung b
WHERE  b.Datum = (SELECT MAX(b2.Datum)
                  FROM   Buchung b2
                  WHERE  b2.MitgliedNr = b.MitgliedNr)
ORDER BY b.MitgliedNr;
BuchungNrMitgliedNrDatum
512026-04-06
622026-04-08
432026-04-07

Unterabfrage in FROM – „Wie viele Buchungen hat der meistgebuchte Kurs?“ (Aggregat über ein Aggregat):

SELECT MAX(Anzahl) AS Maximum
FROM   (SELECT KursNr, COUNT(*) AS Anzahl
        FROM   Buchung
        GROUP BY KursNr) AS tbl;
Maximum
3

Alternative zu NOT IN/NOT EXISTS: LEFT JOIN … WHERE rechts.PK IS NULL (alle linken Zeilen ohne Partner).

Typische Fallen
So wird es in der Prüfung gefragt

DB-08 · SQL: DDL (CREATE, ALTER, DROP, INDEX) Oft

Vorkommen: 5/9 · Prüfungen: W21, S22, W22, W25, S26 · Teil 2, Aufgabe 3/4

SQL-Teilsprachen und CRUD

TeilspracheZweckBefehle
DDL – Data Definition LanguageStruktur definierenCREATE, ALTER, DROP (auch TRUNCATE)
DML – Data Manipulation LanguageDaten bearbeiten (und abfragen)INSERT, UPDATE, DELETE, SELECT (SELECT wird teils als DQL – Data Query Language – geführt)
DCL – Data Control LanguageRechte vergeben/entziehenGRANT, REVOKE
TCL – Transaction Control LanguageTransaktionen steuernCOMMIT, ROLLBACK

CRUD (Create, Read, Update, Delete) sind die vier Grundoperationen auf Daten: Create → INSERT, Read → SELECT, Update → UPDATE, Delete → DELETE – also alles DML. (Nicht verwechseln: CREATE TABLE und DROP TABLE sind DDL.)

Datentypen

DatentypVerwendungBeispiel
INTEGER (INT)Ganzzahlen, IDs, MengenMitgliedNr, Anzahl
DECIMAL(p,s)exakte Festkommazahl: p Stellen insgesamt, davon s Nachkommastellen – für GeldPreis DECIMAL(6,2) → max. 9999.99
DOUBLE / FLOATGleitkommazahl (Rundungsfehler möglich) – für MesswerteTemperatur, Koordinaten
CHAR(n)Text fester LängeLändercode CHAR(2)
VARCHAR(n)Text variabler Länge (höchstens n Zeichen)Nachname VARCHAR(40)
TEXTlange TexteBemerkung
DATE, TIME, DATETIMEDatum, Uhrzeit, beidesEintritt DATE
BOOLEANwahr/falsch (in MySQL intern TINYINT(1))aktiv
Merke PLZ, Telefonnummer, Hausnummer, IBAN als Text (CHAR/VARCHAR): Es gibt führende Nullen (01067), Sonderzeichen (+49, 12a) und es wird nicht damit gerechnet.
Geldbeträge als DECIMAL, nicht als DOUBLE (keine Rundungsfehler).

CREATE TABLE mit Einschränkungen (Constraints)

ConstraintBedeutung
PRIMARY KEY (Spalte[, …])Primärschlüssel (eindeutig, nicht NULL); mehrere Spalten = zusammengesetzter PK
FOREIGN KEY (Spalte) REFERENCES Tabelle (Spalte)Fremdschlüssel (referenzielle Integrität)
NOT NULLPflichtfeld
UNIQUEWert darf nur einmal vorkommen (NULL ist mehrfach erlaubt)
DEFAULT WertStandardwert, wenn beim INSERT nichts angegeben wird
CHECK (Bedingung)Wertebereich prüfen, z. B. CHECK (Preis >= 0)
AUTO_INCREMENT (MySQL)fortlaufende Nummer automatisch vergeben
CREATE TABLE Kurs (
  KursNr      INTEGER      NOT NULL,
  Titel       VARCHAR(30)  NOT NULL UNIQUE,
  TrainerNr   INTEGER,                          -- darf NULL sein
  Preis       DECIMAL(5,2) NOT NULL DEFAULT 8.00,
  MaxPlaetze  INTEGER      CHECK (MaxPlaetze > 0),
  PRIMARY KEY (KursNr),
  FOREIGN KEY (TrainerNr) REFERENCES Trainer (TrainerNr)
);

Reihenfolge: Die referenzierte Tabelle (Trainer) muss vorher existieren; beim Löschen mit DROP TABLE umgekehrt. Der Datentyp des FK muss zum PK passen. Zusammengesetzter PK: PRIMARY KEY (MitgliedNr, KursNr, Datum).

ALTER TABLE, DROP, CREATE INDEX

ALTER TABLE Mitglied ADD COLUMN Email VARCHAR(80);
ALTER TABLE Mitglied DROP COLUMN Ort;
ALTER TABLE Mitglied MODIFY COLUMN Nachname VARCHAR(60) NOT NULL;   -- MySQL
ALTER TABLE Mitglied ADD CONSTRAINT uq_mitglied_email UNIQUE (Email);
ALTER TABLE Kurs ADD FOREIGN KEY (TrainerNr) REFERENCES Trainer (TrainerNr);
DROP TABLE Buchung_Alt;
CREATE INDEX idx_mitglied_nachname ON Mitglied (Nachname);

Spalte aus vorhandenen Daten ableiten (Muster aus W25): neue Spalte anlegen → per UPDATE mit Textfunktion füllen → ggf. alte Spalte löschen. Beispiel: Die ersten zwei Zeichen eines Mitgliedscodes wie 'BN-2024-001' geben den Standort an:

ALTER TABLE Mitglied ADD COLUMN Standort CHAR(2);
UPDATE Mitglied SET Standort = LEFT(Mitgliedscode, 2);     -- oder SUBSTRING(Mitgliedscode, 1, 2)

Textfunktionen (MySQL): LEFT(t, n), RIGHT(t, n), SUBSTRING(t, start, länge) (Zählung ab 1), LENGTH(t), CONCAT(t1, t2, …), UPPER(t)/LOWER(t), TRIM(t).

Typische Fallen
So wird es in der Prüfung gefragt

DB-09 · SQL: UNION Sonstige

Vorkommen: 1/9 · Prüfung: S24 (T2 4d, 12 P)

UNION hängt die Ergebnisse zweier SELECT-Anweisungen untereinander (ein JOIN verbindet dagegen nebeneinander).

UNIONUNION ALL
Duplikatewerden entfernt (wie DISTINCT)bleiben erhalten
Geschwindigkeitlangsamer (Vergleich aller Zeilen)schneller
verwenden, wenn …eine Liste ohne Wiederholungen gewünscht istjede Zeile ein eigener Datensatz ist, der gezählt/summiert werden soll
SELECT Nachname AS Name, 'Mitglied' AS Rolle FROM Mitglied WHERE Ort = 'Bonn'
UNION
SELECT Name, 'Trainer' FROM Trainer
ORDER BY Name;
NameRolle
AydinMitglied
BergMitglied
Jan OttTrainer
Lisa SteinTrainer
Omar HaddadTrainer

Typisches Muster: aktuelle Tabelle + Archivtabelle gemeinsam auswerten. Soll über die vereinigte Menge gruppiert werden, kommt die UNION in eine Unterabfrage in FROM:

SELECT Jahr, COUNT(*) AS Anzahl
FROM   (SELECT YEAR(Datum) AS Jahr FROM Buchung
        UNION ALL
        SELECT YEAR(Datum) FROM Buchung_Archiv) AS alle
GROUP BY Jahr
ORDER BY Jahr;

Sind die Gruppen in den beiden Tabellen sicher getrennt (z. B. alle alten Jahre nur im Archiv), kann man auch jede Tabelle einzeln gruppieren und die beiden Gruppenergebnisse mit UNION ALL verbinden. Überschneiden sich die Gruppen, entstehen dabei aber zwei Ergebniszeilen für dieselbe Gruppe.

Typische FalleUNION statt UNION ALL beim Zählen oder Summieren: Zwei verschiedene Datensätze mit zufällig identischen Werten in allen ausgewählten Spalten werden zu einer Zeile zusammengefasst – das Ergebnis ist zu klein.
So wird es in der Prüfung gefragtS24 T2 4d (12 P): Auswertung je Jahr (MIN, MAX, COUNT) über eine aktuelle Tabelle und ihre Archivtabelle mit UNION ALL, GROUP BY YEAR(…) und ORDER BY … DESC. Vorher (4c) wurde ins Archiv verschoben – die Aufgaben bauen aufeinander auf.

DB-10 · SQL: Benutzer und Rechte (CREATE USER, GRANT, REVOKE) Sonstige

Vorkommen: 1/9 · Prüfung: S23 (T2 4d, 4 P)

CREATE USER rezeption IDENTIFIED BY 'Passwort';           -- MySQL genauer: 'rezeption'@'localhost'
GRANT SELECT, INSERT, UPDATE ON fitness.Mitglied TO rezeption;
GRANT SELECT ON fitness.Kurs TO rezeption;                  -- je Tabelle ein GRANT (oder fitness.* für alle)
REVOKE UPDATE ON fitness.Mitglied FROM rezeption;

CREATE ROLE trainer_rolle;                                 -- Rolle = Bündel von Rechten
GRANT SELECT ON fitness.* TO trainer_rolle;
GRANT trainer_rolle TO lisa;                               -- Benutzer erhält die Rolle
DROP USER rezeption;
Rechterlaubt
SELECT, INSERT, UPDATE, DELETElesen, einfügen, ändern, löschen (UPDATE auch spaltenweise: GRANT UPDATE (Email) ON …)
ALL PRIVILEGESalle Rechte auf dem Objekt
WITH GRANT OPTIONBenutzer darf seine Rechte an andere weitergeben – nur sehr sparsam vergeben
Merke – Prinzip der minimalen Rechte (Least Privilege) Jeder Benutzer und jede Anwendung erhält nur die Rechte, die für die jeweilige Aufgabe zwingend nötig sind – nicht mehr. So wird der Schaden bei Fehlbedienung, gestohlenen Zugangsdaten oder SQL-Injection begrenzt, und personenbezogene Daten sind nur für Berechtigte sichtbar (Datenschutz, DSGVO).
So wird es in der Prüfung gefragtS23 T2 4d (4 P): Benutzer anlegen und ihm ein Leserecht geben. Die Syntax (CREATE … IDENTIFIED BY, GRANT … ON … TO, REVOKE … ON … FROM) steht im Belegsatz.

DB-11 · Trigger, Stored Procedure, View Sonstige

Vorkommen: 1/9 · Prüfung: S22 (T2 4aa/4ab, je 2 P)

View (Sicht)Stored ProcedureTrigger
Was?gespeicherte SELECT-Abfrage, die wie eine (virtuelle) Tabelle benutzt wird; speichert selbst keine Datenin der Datenbank gespeicherte, benannte Folge von SQL-Anweisungen mit Parametern (auch Variablen, Verzweigungen)SQL-Code, der automatisch bei einem Ereignis (INSERT, UPDATE, DELETE) auf einer Tabelle ausgeführt wird
AuslösungSELECT * FROM v_nameexpliziter Aufruf CALL name(…)durch das Ereignis, BEFORE oder AFTER, je Zeile (FOR EACH ROW); Zugriff auf alte/neue Werte mit OLD/NEW
Zweckkomplexe Abfragen vereinfachen; Zugriffsschutz (nur bestimmte Spalten/Zeilen freigeben); stabile Schnittstelle trotz TabellenänderungGeschäftslogik zentral in der DB; weniger Netzwerkverkehr; Rechte nur auf die Prozedur statt auf TabellenProtokollierung (Audit), Plausibilitätsprüfungen, abgeleitete Werte aktuell halten, Integritätsregeln
CREATE VIEW v_kursuebersicht AS
SELECT k.Titel, t.Name AS Trainer, k.Preis
FROM   Kurs k
  LEFT JOIN Trainer t ON t.TrainerNr = k.TrainerNr;

DELIMITER //
CREATE PROCEDURE kurs_buchen(IN p_mitglied INT, IN p_kurs INT)
BEGIN
  INSERT INTO Buchung (MitgliedNr, KursNr, Datum)
  VALUES (p_mitglied, p_kurs, CURDATE());
END //
DELIMITER ;
CALL kurs_buchen(4, 12);

CREATE TRIGGER trg_preis_protokoll
AFTER UPDATE ON Kurs
FOR EACH ROW
INSERT INTO Preis_Log (KursNr, PreisAlt, PreisNeu, Zeitpunkt)
VALUES (OLD.KursNr, OLD.Preis, NEW.Preis, NOW());

Ein BEFORE-Trigger kann eine Änderung auch verhindern, in MySQL mit SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '…'. DELIMITER ist nur im MySQL-Client nötig, damit das Semikolon im Rumpf die Anweisung nicht vorzeitig beendet.

Logik in der DB (Trigger/Procedure)
Vorteilegilt für alle Anwendungen, die auf die DB zugreifen; Datenintegrität unabhängig vom Client; weniger Datenübertragung; Performance
Nachteileherstellerspezifische Syntax (Bindung an ein DBMS); schwerer zu testen, zu debuggen und zu versionieren; Trigger laufen „unsichtbar“ – Seiteneffekte werden leicht übersehen; Last liegt auf dem DB-Server
So wird es in der Prüfung gefragtS22 T2 4aa/4ab (je 2 P): „Erläutern Sie, was man unter einer Stored Procedure / einem Trigger versteht.“ Die Syntax steht nicht im Belegsatz – gefragt ist vor allem die Erklärung (Was? Wann ausgelöst? Wozu?).

DB-12 · Datenqualität beim Import von Altdaten Sonstige

Vorkommen: 1/9 · Prüfung: W24 (T2 3b, 13 P)

Kriterien der Datenqualität

KriteriumFrage
VollständigkeitSind alle Pflichtangaben vorhanden?
Korrektheit (Richtigkeit)Stimmen die Werte mit der Realität überein (keine Tippfehler)?
KonsistenzSind die Daten widerspruchsfrei (gleiche Sache überall gleich)?
EinheitlichkeitSind Formate und Schreibweisen einheitlich (Datum, Zahlen, Einheiten)?
EindeutigkeitGibt es keine Dubletten?
AtomaritätSteht in jedem Feld genau ein Wert?
Gültigkeit / PlausibilitätLiegen die Werte im zulässigen Bereich (kein 31.02., kein negativer Preis)?
AktualitätSind die Daten auf dem neuesten Stand?

Typische Probleme manuell gepflegter Altdaten

Beispiel: Mitgliederliste eines Sportvereins (Excel):

NameGeburtstagAbteilungBeitrag
Meier, Anna03.04.1990Tennis120 €
Jan Schulz1985Tennis, Fußball12o
A. Meier3.4.90Tennis120,00
Kemal ÖztürkFussballfrei
ProblemBeispielFolge beim Import
uneinheitliche Formate und Schreibweisen03.04.1990 / 3.4.90 / 1985; Fußball / Fussball; „120 €“ / „120,00“Import in DATE/DECIMAL schlägt fehl oder liefert falsche Werte; Auswertungen je Abteilung werden falsch, weil „Fussball“ als eigene Abteilung gilt
mehrere Werte in einem Feld (nicht atomar)„Tennis, Fußball“; Vor- und Nachname in einem Feld, mal „Nachname, Vorname“, mal umgekehrtkeine Zuordnung zu einem Fremdschlüssel möglich; Suchen/Sortieren nach Nachname unmöglich
fehlende Werteleeres GeburtsdatumVerletzung von NOT NULL, unvollständige Datensätze
Dubletten„Meier, Anna“ und „A. Meier“dieselbe Person doppelt im System → doppelte Rechnungen, falsche Statistik, PK-/UNIQUE-Verletzung
ungültige Werte, Tippfehler, Text statt Wert„12o“ (Buchstabe o), „frei“Typfehler beim Import; Werte müssen per Regel übersetzt werden („frei“ → 0)

ETL und Vorgehen beim Import

ETL = Extract (Daten aus der Quelle lesen, z. B. CSV-Export der Excel-Datei) – Transform (bereinigen, vereinheitlichen, aufteilen, Dubletten zusammenführen, Schlüssel zuordnen, prüfen) – Load (in die Zieltabellen laden, Reihenfolge der Fremdschlüssel beachten).

  1. Analyse (Profiling): Formate, Leerwerte, Ausreißer und Dubletten feststellen und zählen.
  2. Zielstruktur festlegen (Tabellen in 3NF, Datentypen).
  3. Rohdaten unverändert in eine Staging-Tabelle laden (alle Spalten als Text).
  4. Transformationsregeln festlegen und per Skript/SQL anwenden: Datum parsen, Felder aufteilen, Zuordnungstabellen für Schreibweisen („Fussball“ → „Fußball“), Zahlen normieren.
  5. Nicht automatisch lösbare Fälle in eine Fehlerliste → manuelle Klärung durch die Fachabteilung.
  6. Prüfen: Plausibilitätsregeln, Stichproben, Summen-/Anzahlabgleich; erst Testimport, dann produktiver Import.

Bewertung: Lohnt sich der Import?

Abzuwägen sind Aufwand (Datenmenge, Fehlerquote, Anteil manueller Nacharbeit) und Nutzen (Bedeutung der Historie für Auswertungen, Gewährleistung, gesetzliche Aufbewahrungspflichten, Risiko falscher Daten im neuen System). Mögliche Ergebnisse: vollständiger Import nach Bereinigung, Teilimport (z. B. nur Stammdaten oder nur die letzten Jahre) oder kein Import (Altdaten schreibgeschützt archivieren, Neuerfassung).

MerkeBei „Beurteilen Sie …“ zählt die begründete Entscheidung. Ob du für oder gegen den Import argumentierst, ist egal – es müssen Argumente aus der Situation kommen (Datenmenge, Fehlerarten, Nutzen).
So wird es in der Prüfung gefragtW24 T2 3ba (9 P): Drei Probleme bezüglich der Datenqualität beschreiben und je eine Folge des Imports nennen (3 × 3 P). 3bb (2 P): Einen Weg aufzeigen, wie die Daten dennoch importiert werden können. 3bc (2 P): Die Importidee beurteilen.

B · Belegsatz

Enthält nur, was dir auch die IHK beilegen würde: Notationshilfen und Anlagen (Ausgangssituation, Tabellen, Formulare, Texte). Keine Erklärungen. Tipp: Diesen Teil separat ausdrucken und beim Lösen daneben legen.

Notationshilfen

Entity-Relationship-Modell (ER-Modell)

Entität Beziehung Attribut
Entity-Relationship-Modell (ER-Modell): Notation

SQL-Syntax (Auszug)

SyntaxBeschreibung
Tabellen und Objekte
CREATE TABLE Tabellenname ( Spaltenname Datentyp [NOT NULL] [DEFAULT Wert] [UNIQUE], …, PRIMARY KEY (Spaltenname[, …]), FOREIGN KEY (Spaltenname) REFERENCES Tabellenname (Spaltenname), CHECK (Bedingung) )Erzeugt eine neue, leere Tabelle
ALTER TABLE Tabellenname ADD COLUMN Spaltenname Datentyp DROP COLUMN Spaltenname MODIFY COLUMN Spaltenname Datentyp ADD CONSTRAINT Name UNIQUE (Spaltenname) ADD FOREIGN KEY (Spaltenname) REFERENCES Tabellenname (Spaltenname)Ändert die Struktur einer Tabelle:
Spalte hinzufügen
Spalte entfernen
Datentyp ändern
Eindeutigkeit festlegen
Fremdschlüssel festlegen
DROP TABLE TabellennameLöscht eine Tabelle
CREATE [UNIQUE] INDEX Indexname ON Tabellenname (Spaltenname[, …])Erzeugt einen Index
CREATE VIEW Viewname AS SELECT …Erzeugt eine Sicht
INTEGER DECIMAL(p, s) DOUBLE CHAR(n) / VARCHAR(n) DATE / DATETIME BOOLEANGanzzahl
Festkommazahl (p Stellen, davon s Nachkommastellen)
Gleitkommazahl
Text fester / variabler Länge
Datum (JJJJ-MM-TT) / Datum mit Uhrzeit
Wahrheitswert
Abfragen
SELECT [DISTINCT] * | Spalte [AS Alias][, …]Auswahl der Spalten; DISTINCT entfernt doppelte Zeilen
FROM Tabellenname [[AS] Alias][, …]Tabelle(n), aus denen die Daten stammen
[INNER] JOIN Tabellenname ON BedingungNur Datensätze mit passendem Partner in beiden Tabellen
LEFT [OUTER] JOIN Tabellenname ON BedingungAlle Datensätze der linken Tabelle und die passenden der rechten
RIGHT [OUTER] JOIN Tabellenname ON BedingungAlle Datensätze der rechten Tabelle und die passenden der linken
WHERE BedingungAuswahl von Datensätzen
GROUP BY Spaltenname[, …]Gruppierung
HAVING BedingungAuswahl von Gruppen
ORDER BY Spaltenname [ASC | DESC][, …]Sortierung aufsteigend / absteigend
SELECT … UNION [ALL] SELECT …Vereinigung zweier Ergebnismengen (ALL: mit Duplikaten)
WHERE Spalte [NOT] IN (SELECT …)Wert ist (nicht) in der Ergebnismenge der Unterabfrage
WHERE [NOT] EXISTS (SELECT …)Unterabfrage liefert (k)eine Zeile
WHERE Spalte > (SELECT …)Vergleich mit dem Ergebnis einer Unterabfrage
SELECT … FROM (SELECT … ) AS tblUnterabfrage als Tabelle
Datenmanipulation
INSERT INTO Tabellenname [(Spalte1, Spalte2, …)] VALUES (Wert1, Wert2, …)[, (…)] oder SELECT … FROM … WHERE …Fügt Datensätze ein – mit festen Werten oder als Ergebnis einer Abfrage
UPDATE Tabellenname SET Spalte = Wert[, …] [WHERE Bedingung]Ändert Datensätze
DELETE FROM Tabellenname [WHERE Bedingung]Löscht Datensätze
START TRANSACTION / COMMIT / ROLLBACKTransaktion beginnen / bestätigen / zurücksetzen
Berechtigungen
CREATE USER Benutzer IDENTIFIED BY 'Passwort' CREATE ROLE RolleErzeugt einen Benutzer mit Passwort
Erzeugt eine Rolle
GRANT Recht[, …] | ALL ON Datenbank.Objekt | Datenbank.* TO Benutzer | Rolle [WITH GRANT OPTION] GRANT Rolle TO BenutzerVergibt Rechte (SELECT, INSERT, UPDATE, DELETE) auf ein Objekt

Weist einem Benutzer eine Rolle zu
REVOKE Recht[, …] ON Datenbank.Objekt FROM Benutzer | RolleEntzieht Rechte
Aggregatfunktionen
COUNT(* | Spalte | DISTINCT Spalte)Anzahl Zeilen / Nicht-NULL-Werte / verschiedener Werte
SUM(Spalte | Formel), AVG(Spalte | Formel)Summe, arithmetisches Mittel
MIN(Spalte | Formel), MAX(Spalte | Formel)kleinster, größter Wert
Funktionen
YEAR(Datum), MONTH(Datum), DAY(Datum)Jahr, Monat, Tag eines Datums
CURDATE(), NOW()aktuelles Datum, aktuelles Datum mit Uhrzeit
DATEDIFF(Datum1, Datum2)Anzahl Tage Datum1 − Datum2
DATE_ADD(Datum, INTERVAL n DAY | MONTH | YEAR)addiert ein Intervall zu einem Datum
LEFT(Text, n), RIGHT(Text, n)n Zeichen von links / rechts
SUBSTRING(Text, Start, Länge)Teilzeichenkette ab Position Start (erstes Zeichen = 1)
LENGTH(Text), CONCAT(Text1, Text2, …), UPPER(Text), LOWER(Text), TRIM(Text)Länge, Verketten, Groß-/Kleinschreibung, Leerzeichen entfernen
ROUND(Zahl, n), COALESCE(Wert1, Wert2, …)Runden auf n Stellen; erster Wert, der nicht NULL ist
Operatoren
=, <>, <, >, <=, >=Vergleich (<>: ungleich)
AND, OR, NOTlogisches UND, ODER, NICHT
BETWEEN Wert1 AND Wert2Wert im Bereich (Grenzen eingeschlossen)
IN (Wert1, Wert2, …)Wert ist in der Liste enthalten
LIKE 'Muster'Textvergleich mit Platzhaltern: % beliebig viele Zeichen, _ genau ein Zeichen
IS NULL, IS NOT NULLÜberprüfung auf NULL
+, −, *, /Grundrechenarten

Anlagen

Anlage 1 · Ausgangssituation

Die VeloPunkt GmbH mit Sitz in Freiburg im Breisgau vermietet an fünf Stationen in Südbaden E-Bikes, E-Lastenräder und Kinderräder an Privat- und Firmenkunden. Zum Unternehmen gehören außerdem eine Werkstatt, die die eigene Flotte wartet und Fahrräder von Privatkunden repariert, sowie ein Angebot an geführten E-Bike-Touren.

Bisher werden Ausleihen, Wartungen, Schichtpläne und Kundendaten in mehreren Excel-Listen und auf Papierformularen geführt. Die DataWerk Software GmbH, Ihr Ausbildungsbetrieb, wurde beauftragt, das webbasierte Verleih- und Werkstattsystem „VeloManager“ mit Online-Buchung zu entwickeln. Kernstück ist eine relationale Datenbank (MySQL). Ein Teil der Datenbank ist bereits im Testbetrieb (Anlagen 2 und 3).

Sie arbeiten im Projektteam mit und sind für den Datenbankentwurf, die SQL-Abfragen und die Übernahme der Altdaten zuständig.

Hinweise: Heute ist der 10.10.2026. Datumswerte sind im Format JJJJ-MM-TT gespeichert, Geldbeträge in Euro.

Anlage 2 · Datenbank „VeloManager“ – Tabellen mit Beispieldaten

Tabelle: Station

StationNrNamePLZOrt
1Hauptbahnhof79098Freiburg
2Messe79108Freiburg
3Titisee79822Titisee-Neustadt
4Kaiserstuhl79235Vogtsburg
5Schauinsland79254Oberried

Tabelle: Kategorie

KategorieNrBezeichnungTagespreis
1City-E-Bike25.00
2Trekking-E-Bike30.00
3E-Mountainbike39.00
4E-Lastenrad45.00
5Kinderrad12.00
6Tandem35.00

Tabelle: Fahrrad

FahrradNrRahmennummerModellKategorieNrStationNrKaufdatumKaufpreis
101WAW-23-0017Urban C5112023-03-152499.00
102WAW-23-0018Urban C5112023-03-152499.00
103KTX-24-1120Tour T7222024-04-023199.00
104KTX-24-1121Tour T7232024-04-023199.00
105MTN-22-0456Trail X9332022-05-204290.00
106MTN-25-0811Trail X9342025-03-104490.00
107CRG-24-0033Cargo L2412024-06-125390.00
108CRG-25-0090Cargo L2422025-04-285590.00
109KID-23-0301Kiddy 20532023-05-02649.00
110WAW-26-0002Urban C6142026-02-202799.00

Tabelle: Kunde

KundenNrVornameNachnamePLZOrtEmail
1001LenaHoffmann79098Freiburglena.hoffmann@mail.de
1002JonasAlbrecht79102Freiburgj.albrecht@web.de
1003MiraSchulze79211DenzlingenNULL
1004PaulWagner79822Titisee-Neustadtpaul.wagner@gmx.de
1005SofiaKeller79100Freiburgs.keller@posteo.de
1006TimBrandt77933Lahrtim.brandt@mail.de
1007EmmaVogel79098FreiburgNULL
1008DavidRoth01067Dresdend.roth@web.de
1009HannahKrüger79194Gundelfingenhannah.k@gmx.de
1010FelixNeumann79108Freiburgf.neumann@mail.de

Tabelle: Ausleihe

AusleiheNrKundenNrFahrradNrBeginnEndeKilometerBetrag
500110011012025-08-022025-08-036450.00
500210021052025-09-132025-09-133839.00
500310041072025-10-042025-10-0641135.00
500410011032026-03-212026-03-229260.00
500510031092026-04-112026-04-111212.00
500610051072026-05-012026-05-0357135.00
500710021062026-05-302026-06-01118117.00
500810061042026-06-142026-06-20315210.00
500910011082026-07-182026-07-182345.00
501010061052026-08-082026-08-097678.00
501110071022026-08-222026-08-244975.00
501210051032026-10-08NULLNULLNULL

Ende, Kilometer und Betrag sind NULL, solange das Fahrrad noch nicht zurückgegeben wurde. Abholung und Rückgabe am selben Tag zählen als ein Miettag.

Tabelle: Wartung

WartungNrFahrradNrDatumArtKosten
11012025-11-20Inspektion89.00
21052025-11-25Bremsen145.50
31072026-01-14Inspektion119.00
41032026-02-03Inspektion89.00
51052026-04-20Akku-Check35.00
61092026-05-07Reifen42.90
71072026-07-01Bremsen168.00
81042026-09-15Reifen55.00
91052026-09-30InspektionNULL

Kosten = NULL: Werkstattauftrag noch nicht abgerechnet.

Primärschlüssel (jeweils erste Spalte): StationNr, KategorieNr, FahrradNr, KundenNr, AusleiheNr, WartungNr.
Fremdschlüssel (ohne ON DELETE CASCADE): Fahrrad.KategorieNr → Kategorie.KategorieNr · Fahrrad.StationNr → Station.StationNr · Ausleihe.KundenNr → Kunde.KundenNr · Ausleihe.FahrradNr → Fahrrad.FahrradNr · Wartung.FahrradNr → Fahrrad.FahrradNr

Anlage 3 · Archivtabellen

Abgeschlossene Ausleihen werden regelmäßig archiviert, ausgemusterte Fahrräder in Fahrrad_Archiv übernommen. Die Archivtabellen haben keine Fremdschlüssel.

Tabelle: Ausleihe_Archiv (gleiche Struktur wie Ausleihe)

AusleiheNrKundenNrFahrradNrBeginnEndeKilometerBetrag
400110011012024-05-102024-05-115550.00
400210091052024-06-222024-06-238178.00
400310021022024-07-062024-07-063125.00
400410041092024-08-152024-08-172036.00
400510091072024-09-282024-09-281845.00
400610061032024-10-122024-10-1310460.00
400710031042025-04-192025-04-206660.00
400810011012025-06-072025-06-086450.00

Tabelle: Fahrrad_Archiv

FahrradNrRahmennummerModellKategorieKaufdatumAusmusterungGesamtKm
95WAW-21-0004Urban C4City-E-Bike2021-04-012025-12-314120
98MTN-21-0102Trail X8E-Mountainbike2021-06-152026-01-152875

Kategorie enthält die Bezeichnung der Kategorie im Klartext, GesamtKm die Summe der Kilometer aller Ausleihen des Fahrrads.

Anlage 4 · Werkstattrechnung (bisheriges Papierformular)

VeloPunkt GmbH – Werkstatt
Freiburg im Breisgau
RECHNUNG
Rechnungs-Nr.: W-2026-0815
Rechnungsdatum: 18.09.2026
KundeKunden-Nr. 3307 · Frau Julia Hartmann · Wiesenweg 4 · 79117 Freiburg · Tel. 0761 28349911
FahrradHersteller: Stadtrad · Modell: Avanti E8 · Rahmennummer: STR-19-77812
Bearbeitet vonMechaniker-Nr. 7 · Erik Petersen
Pos.Art.-Nr.BezeichnungMengeEinheitEinzelpreisGesamt
1L-100Arbeitszeit Werkstatt1,5Std.64,00 €96,00 €
2E-2201Bremsbelag Scheibenbremse2Stück18,90 €37,80 €
3E-3105Kette 11-fach1Stück29,90 €29,90 €
4E-4410Schlauch 28 Zoll2Stück7,50 €15,00 €
Nettobetrag178,70 €
zzgl. 19 % Umsatzsteuer33,95 €
Rechnungsbetrag212,65 €

Zahlungsart: EC-Karte

Informationen aus dem Gespräch mit der Werkstattleitung:

Anlage 5 · Schichtplan der Stationen (bisherige Excel-Liste, Auszug)

DatumPersNrMitarbeiterTelefonStationNrStationOrtSchichtStunden
01.09.202612Weber, Tom0761 445-121HauptbahnhofFreiburgFrüh6,0
01.09.202615Sanchez, Ana0761 445-152MesseFreiburgFrüh6,0
01.09.202617Yilmaz, Can0761 445-171HauptbahnhofFreiburgSpät7,5
02.09.202612Weber, Tom0761 445-123TitiseeTitisee-NeustadtFrüh6,0
02.09.202615Sanchez, Ana0761 445-151HauptbahnhofFreiburgSpät7,5
02.09.202621Frey, Lisa0761 445-214KaiserstuhlVogtsburgFrüh6,0
03.09.202617Yilmaz, Can0761 445-172MesseFreiburgFrüh6,0
03.09.202612Weber, Tom0761 445-121HauptbahnhofFreiburgSpät7,5

Ein Mitarbeiter arbeitet pro Tag höchstens eine Schicht. Eine Frühschicht dauert immer 6,0 Stunden, eine Spätschicht immer 7,5 Stunden.

Anlage 6 · Werkstattbuch (Excel-Datei seit 2019, ca. 1.800 Zeilen, Auszug)

DatumRadMechanikerArbeitenKosten
03.02.2025101WeberInspektion89,00 €
4.2.Urban C5 blauT. WeberBremsen vorne + hinten145,5
2025-02-07WAW-23-0018Weber, SanchezInsp. + Reifenca. 130
11.02.25105Akku geprüftinkl.
11.02.25105Akku geprüftinkl.
Feb 25103/104SanchezInspektion2x 89 €
14.13.2025Tour T7A. SanchezKette gewechselt29.90 EUR

Anlage 7 · Kundenkartei (Excel-Datei, ca. 950 Zeilen, Auszug)

NrNameAdresseTelefonE-MailKunde seitBemerkung
1Hoffmann, LenaKartäuserstr. 12, 79098 Freiburg0761/1234567lena.hoffmann@mail.de04/2024
2Jonas AlbrechtHabsburgerstraße 3 79102 Freiburg+49 761 7654321j.albrecht@web,de2024Stammkunde
3Schulze MiraDenzlingen–2.8.24Tel. folgt
4Wagner, PaulSeestr. 5, Titisee-Neustadt07651-4711; 0170 5551234paul.wagner@gmx.de10.08.2024
5Hoffmann, L.Kartäuserstraße 12, Freiburg0761 1234567lena.hoffmann@mail.de18.04.2024doppelt?
6Keller, SofiaWiehre, Freiburgs.keller(at)posteo.deMai 25
7Brandt Tim77933 Lahr07821/99880Firma?

Die Daten sollen in die Tabelle Kunde (Anlage 2) übernommen werden.

Anlage 8 · Fachtext (Auszug aus einem Whitepaper)

Document Databases at a Glance

A document database stores data as self-describing documents, usually in JSON or a binary variant of it. Related documents are grouped in collections. Unlike the rows of a table in a relational database, the documents in one collection do not have to share the same structure: a new field can be added to some documents without changing a schema or migrating existing data.

Data that is read together is often stored together. Instead of splitting an order into several tables and joining them at query time, the order lines can be embedded directly in the order document. This makes typical read operations fast and simple. On the other hand, embedded data may be duplicated in many documents, and changing it later means updating every copy.

Document databases are designed to scale horizontally: a large collection can be distributed across many servers (sharding). Many products guarantee atomic writes only for a single document; transactions that span several documents are either not available or noticeably slower. For data with many relationships and strict consistency requirements, such as accounting, a relational database is often the better choice.

C · Aufgaben

Alle Aufgaben beziehen sich auf die Ausgangssituation in Anlage 1. SQL-Anweisungen in Standard-SQL/MySQL wie im Belegsatz. Gehen Sie – wenn nichts anderes angegeben ist – immer vom Datenbestand in den Anlagen 2 und 3 aus (Aufgaben bauen nicht aufeinander auf).

DB-01 · ER-/Relationenmodell

Aufgabe DB-01.1 ★☆☆ Grundlagen 6 Punkte

Für den VeloManager werden Sachverhalte aus dem Fachkonzept modelliert.

3 Pa) Bestimmen Sie für die folgenden Sachverhalte jeweils die Kardinalität (1:1, 1:n oder m:n) und begründen Sie Ihre Angabe kurz.
Nr.SachverhaltKardinalitätBegründung
1Fahrrad – Station: Jedes Fahrrad ist genau einer Heimatstation zugeordnet; an einer Station sind mehrere Fahrräder stationiert.
2Station – Mitarbeiter (Stationsleitung): Jede Station wird von genau einem Mitarbeiter geleitet; ein Mitarbeiter leitet höchstens eine Station.
3Ausleihe – Zubehör: Zu einer Ausleihe können mehrere Zubehörteile (Helm, Schloss, Kindersitz) gebucht werden; jedes Zubehörteil wird bei vielen Ausleihen gebucht.
3 Pb) Gegeben ist folgender Ausschnitt aus dem ER-Modell. Die Entität Kategorie hat die Attribute KategorieNr (Schlüssel), Bezeichnung und Tagespreis, die Entität Fahrrad die Attribute FahrradNr (Schlüssel), Modell und Kaufpreis.
Kategorie umfasst Fahrrad 1 n
ER-Modell-Ausschnitt zu Aufgabe DB-01.1 b

Geben Sie das zugehörige Relationenmodell in Textnotation an (Primärschlüssel unterstrichen, Fremdschlüssel mit ↑) und begründen Sie, in welche Tabelle der Fremdschlüssel aufgenommen wird.

Angelehnt an: W21 Teil 1, Aufgabe 2b; W23 Teil 1, Aufgabe 4a (Kardinalitäten)

Aufgabe DB-01.2 ★★☆ Anwendung 12 Punkte

VeloPunkt bietet künftig geführte E-Bike-Touren an. Aus einem Gespräch mit der Tourenleitung liegen folgende Informationen vor:

12 PErstellen Sie ein ER-Modell in der Notation des Belegsatzes mit allen Entitätstypen, Attributen (Schlüsselattribute unterstrichen), Beziehungen und Kardinalitäten.

Angelehnt an: W21 Teil 1, Aufgabe 2b (rekursive Beziehung, m:n); W23 Teil 1, Aufgabe 4a (m:n mit Attributen)

Aufgabe DB-01.3 ★★★ Prüfungsniveau 22 Punkte

Die Online-Buchung des VeloManagers soll um Zubehör (z. B. Helm, Kindersitz, Packtasche) erweitert werden. Für die Datenhaltung liegt folgendes ER-Modell vor:

Kunde bucht Buchung umfasst Zubehör 1 n m n
Gegebenes ER-Modell (Online-Buchung mit Zubehör)

Informationen aus der Ist-Analyse:

18 Pa) Überführen Sie das ER-Modell in ein relationales Datenmodell in der 3. Normalform und erweitern Sie es anhand der Ist-Analyse. Übernehmen Sie alle genannten Attribute, kennzeichnen Sie Primärschlüssel (PK) und Fremdschlüssel (FK) und stellen Sie alle Beziehungen zwischen den Tabellen mit ihren Kardinalitäten dar.
2 Pb) Erläutern Sie, wie im Datenmodell technisch sichergestellt werden kann, dass ein Gutschein nur ein einziges Mal eingelöst wird.
2 Pc) Begründen Sie, warum das Attribut „Anzahl“ weder in der Tabelle Buchung noch in der Tabelle Zubehör gespeichert werden kann.

Angelehnt an: S26 Teil 2, Aufgabe 3a (ER-Modell überführen und erweitern)

DB-02 · Normalisierung

Aufgabe DB-02.1 ★☆☆ Grundlagen 6 Punkte
2 Pa) Erläutern Sie den Begriff „funktionale Abhängigkeit“ und geben Sie ein Beispiel aus der Tabelle Kunde (Anlage 2) an.
3 Pb) Jede der folgenden Aussagen beschreibt einen Verstoß gegen eine Normalform. Geben Sie jeweils die verletzte Normalform an.
Nr.Aussageverletzte NF
1In einer Kundentabelle stehen bei manchen Kunden zwei Telefonnummern im Feld „Telefon“, getrennt durch ein Semikolon.
2Tabelle AusleiheKunde(AusleiheNr, Beginn, KundenNr, Nachname): Nachname hängt von KundenNr ab.
3Tabelle Zubehoerbuchung(AusleiheNr, ZubehoerNr, Anzahl, Bezeichnung): Bezeichnung hängt nur von ZubehoerNr ab.
1 Pc) Begründen Sie, warum eine Tabelle in der 1NF, deren Primärschlüssel aus genau einem Attribut besteht, immer auch in der 2NF ist.
Aufgabe DB-02.2 ★★☆ Anwendung 12 Punkte

Der Schichtplan der Stationen (Anlage 5) wird bisher als Excel-Liste geführt und soll in den VeloManager übernommen werden.

2 Pa) Erläutern Sie anhand von Anlage 5, was man unter Redundanz versteht.
6 Pb) Beschreiben Sie jeweils an einem konkreten Beispiel aus Anlage 5, wie es zu einer Einfüge-, einer Änderungs- und einer Löschanomalie kommen kann.
4 Pc) Überführen Sie die Daten in die 3. Normalform. Geben Sie die Tabellen in Textnotation an (Primärschlüssel unterstrichen, Fremdschlüssel mit ↑).

Angelehnt an: W25 Teil 1, Aufgabe 4a/4b; S23 Teil 1, Aufgabe 4ca

Aufgabe DB-02.3 ★★★ Prüfungsniveau 20 Punkte

Die Werkstatt soll ihre Rechnungen künftig im VeloManager erstellen. Grundlage sind das bisherige Rechnungsformular und die Informationen der Werkstattleitung in Anlage 4.

2 Pa) Nennen Sie zwei Angaben des Formulars, die nicht als Attribut gespeichert werden sollten, und begründen Sie dies.
18 Pb) Erstellen Sie ein relationales Datenmodell in der 3. Normalform für die Werkstattrechnungen. Geben Sie alle Tabellen mit ihren Attributen an, kennzeichnen Sie Primär- und Fremdschlüssel und stellen Sie die Beziehungen mit ihren Kardinalitäten dar.

Angelehnt an: W21 Teil 2, Aufgabe 3; S22 Teil 2, Aufgabe 3; W25 Teil 1, Aufgabe 4c (Datenmodell in 3NF aus Beleg bzw. Beispieldaten)

DB-03 · SQL: SELECT mit JOIN

Aufgabe DB-03.1 ★☆☆ Grundlagen 6 Punkte

Erstellen Sie jeweils eine SQL-Anweisung für die folgenden Auswertungen (Anlage 2).

2 Pa) KundenNr, Vorname und Nachname aller Kunden, für die keine E-Mail-Adresse gespeichert ist.
2 Pb) FahrradNr, Modell und Kaufpreis aller Fahrräder, die im Jahr 2024 gekauft wurden, absteigend nach Kaufpreis sortiert (bei gleichem Preis aufsteigend nach FahrradNr).
2 Pc) KundenNr, Nachname, PLZ und Ort aller Kunden, deren Postleitzahl mit „791“ beginnt.

Angelehnt an: W22 Teil 2, Aufgabe 4c (LIKE-Muster PLZ); S23 Teil 2, Aufgabe 4a (YEAR, IS NULL)

Aufgabe DB-03.2 ★★☆ Anwendung 9 Punkte
5 Pa) Erstellen Sie eine SQL-Abfrage, die alle Ausleihen ausgibt, die im Juli oder August 2026 begonnen haben: AusleiheNr, Beginn, Nachname des Kunden und Modell des Fahrrads, aufsteigend nach Beginn sortiert.
4 Pb) Erstellen Sie eine Liste aller Fahrräder (FahrradNr, Modell) mit Datum und Art ihrer Wartungen. Fahrräder, die noch nie gewartet wurden, sollen ebenfalls aufgeführt werden. Sortieren Sie nach FahrradNr und Datum.

Angelehnt an: W21 Teil 2, Aufgabe 4e (Join über mehrere Tabellen); S22 Teil 2, Aufgabe 4bc (LEFT JOIN)

Aufgabe DB-03.3 ★★★ Prüfungsniveau 14 Punkte

Die Geschäftsführung möchte die abgerechneten Mietbeträge kontrollieren und einen Überblick über die Kundenaktivität im Jahr 2026 erhalten.

6 Pa) Erstellen Sie eine SQL-Abfrage, die für alle abgeschlossenen Ausleihen, die im Jahr 2026 begonnen haben, folgende Spalten ausgibt: AusleiheNr, Nachname des Kunden, Modell, Bezeichnung der Kategorie, Mietdauer in Tagen, Tagespreis und Sollbetrag (Mietdauer × Tagespreis). Abholung und Rückgabe am selben Tag zählen als ein Miettag. Sortieren Sie absteigend nach dem Sollbetrag.
5 Pb) Erstellen Sie eine Liste aller Kunden (KundenNr, Nachname) mit AusleiheNr und Beginn ihrer Ausleihen, die im Jahr 2026 begonnen haben. Kunden ohne Ausleihe im Jahr 2026 sollen ebenfalls (mit leeren Feldern) aufgeführt werden. Sortieren Sie nach KundenNr.
3 Pc) Ein Kollege schreibt in b) die Bedingung für das Jahr 2026 in die WHERE-Klausel. Erläutern Sie, welche Kunden aus Anlage 2 dann im Ergebnis fehlen, und begründen Sie dies.

Angelehnt an: W24 Teil 2, Aufgabe 4c (Datumsdifferenz); W22 Teil 2, Aufgabe 4a und S26 Teil 2, Aufgabe 4b (LEFT JOIN)

DB-04 · SQL: Aggregatfunktionen, GROUP BY, HAVING

Aufgabe DB-04.1 ★☆☆ Grundlagen 6 Punkte
2 Pa) Ermitteln Sie mit einer SQL-Abfrage für alle abgeschlossenen Ausleihen der Tabelle Ausleihe die Anzahl, die Summe der gefahrenen Kilometer und den Durchschnitt der Kilometer.
2 Pb) Erläutern Sie den Unterschied zwischen WHERE und HAVING.
2 Pc) Geben Sie das Ergebnis der Abfrage SELECT COUNT(*), COUNT(Kosten) FROM Wartung; an und begründen Sie den Unterschied.
Aufgabe DB-04.2 ★★☆ Anwendung 10 Punkte
5 Pa) Erstellen Sie eine SQL-Abfrage, die für jede Kategorie, in der es Ausleihen gibt, die Bezeichnung, die Anzahl der Ausleihen und den Umsatz (Summe der Beträge) ausgibt – absteigend nach Umsatz sortiert.
5 Pb) Erstellen Sie eine SQL-Abfrage, die alle Kunden mit mindestens zwei Ausleihen in der Tabelle Ausleihe ausgibt: KundenNr, Vorname, Nachname und Anzahl der Ausleihen – absteigend nach Anzahl, bei Gleichstand alphabetisch nach Nachname.

Angelehnt an: W25 Teil 2, Aufgabe 4c (HAVING) und 4e (SUM je Kategorie)

Aufgabe DB-04.3 ★★★ Prüfungsniveau 16 Punkte

Für die Planung der Flotte und der Werkstatt werden Auswertungen benötigt.

5 Pa) Erstellen Sie eine SQL-Abfrage, die für jede Station die StationNr, den Namen und die Anzahl der dort stationierten Fahrräder ausgibt. Stationen ohne Fahrräder sollen mit der Anzahl 0 erscheinen.
6 Pb) Erstellen Sie eine SQL-Abfrage, die für jedes Fahrrad, das im Jahr 2026 gewartet wurde, FahrradNr, Modell, die Anzahl der Wartungen 2026 und die Summe ihrer Kosten ausgibt – aber nur, wenn diese Summe 50 € übersteigt. Sortieren Sie absteigend nach der Kostensumme.
5 Pc) Die folgende Abfrage soll alle Kunden liefern, die keine Ausleihe in der Tabelle Ausleihe haben. Sie erzeugt jedoch einen Fehler.
SELECT k.KundenNr, k.Nachname, COUNT(a.AusleiheNr) AS Anzahl
FROM   Kunde k
  LEFT JOIN Ausleihe a ON k.KundenNr = a.KundenNr
WHERE  COUNT(a.AusleiheNr) = 0
GROUP BY k.KundenNr;

Nennen Sie zwei Fehler und geben Sie die korrigierte Abfrage an. Erläutern Sie außerdem, welches Ergebnis entstünde, wenn in der korrigierten Abfrage COUNT(*) statt COUNT(a.AusleiheNr) verwendet würde.

Angelehnt an: S22 Teil 2, Aufgabe 4bc (LEFT JOIN mit COUNT); W21 Teil 2, Aufgabe 4d (HAVING)

DB-05 · SQL: INSERT, UPDATE, DELETE

Aufgabe DB-05.1 ★☆☆ Grundlagen 5 Punkte
2 Pa) Die Kundin Clara Fischer, 79104 Freiburg, E-Mail c.fischer@mail.de, soll mit der KundenNr 1011 gespeichert werden. Erstellen Sie die SQL-Anweisung.
1 Pb) Paul Wagner (KundenNr 1004) hat die neue E-Mail-Adresse paul.wagner@posteo.de. Erstellen Sie die SQL-Anweisung.
2 Pc) Die Anweisung DELETE FROM Kunde WHERE KundenNr = 1004; wird vom Datenbanksystem abgewiesen. Erläutern Sie den Grund und nennen Sie eine Möglichkeit, den Kunden dennoch zu löschen.

Angelehnt an: W25 Teil 2, Aufgabe 4a; S24 Teil 2, Aufgabe 4a

Aufgabe DB-05.2 ★★☆ Anwendung 10 Punkte
5 Pa) Die Tagespreise aller Kategorien, in denen im Jahr 2026 mindestens zwei Ausleihen begonnen haben, sollen um 10 % erhöht werden. Erstellen Sie die SQL-Anweisung.
5 Pb) Alle Fahrräder der Kategorie „E-Lastenrad“ werden an die Station „Messe“ verlegt. Erstellen Sie die SQL-Anweisung. KategorieNr und StationNr dürfen dabei nicht als feste Werte verwendet werden.

Angelehnt an: W21 Teil 2, Aufgabe 4c (UPDATE mit Unterabfrage); W23 Teil 2, Aufgabe 4c (UPDATE mit JOIN)

Aufgabe DB-05.3 ★★★ Prüfungsniveau 16 Punkte

Die Tabelle Ausleihe soll regelmäßig bereinigt werden. Gehen Sie bei allen Teilaufgaben vom Datenbestand der Anlagen 2 und 3 aus.

6 Pa) Alle Ausleihen, die vor dem 01.01.2026 beendet wurden, sollen in die Tabelle Ausleihe_Archiv übertragen und anschließend aus der Tabelle Ausleihe gelöscht werden. Erstellen Sie die SQL-Anweisungen.
2 Pb) Begründen Sie, warum die Anweisungen aus a) in einer Transaktion und in genau dieser Reihenfolge ausgeführt werden sollten.
5 Pc) Das Fahrrad 105 wird am 10.10.2026 ausgemustert. Erstellen Sie eine SQL-Anweisung, die das Fahrrad in die Tabelle Fahrrad_Archiv überträgt. Die Kategorie ist als Bezeichnung zu speichern, GesamtKm als Summe der Kilometer aller Ausleihen des Fahrrads aus den Tabellen Ausleihe und Ausleihe_Archiv.
3 Pd) Anschließend sollen das Fahrrad 105 und alle Datensätze, die darauf verweisen, gelöscht werden. Geben Sie die DELETE-Anweisungen in der richtigen Reihenfolge an und begründen Sie die Reihenfolge.

Angelehnt an: W22 Teil 2, Aufgabe 4b; S24 Teil 2, Aufgabe 4c; S26 Teil 2, Aufgabe 4ca/4cb (Archivierung)

DB-06 · Datenbank-Theorie

Aufgabe DB-06.1 ★☆☆ Grundlagen 6 Punkte
4 Pa) Nennen und erläutern Sie die vier ACID-Eigenschaften von Transaktionen.
2 Pb) Nennen Sie je einen Vorteil und einen Nachteil eines Datenbankindex.

Angelehnt an: W23 Teil 1, Aufgabe 3a (ACID); S22 Teil 2, Aufgabe 4ac (Index)

Aufgabe DB-06.2 ★★☆ Anwendung 10 Punkte

Bei der Rückgabe eines Fahrrads führt der VeloManager drei Schritte aus: (1) In der Ausleihe werden Ende, Kilometer und Betrag eingetragen. (2) Eine Rechnung wird erzeugt. (3) Hat das Fahrrad seit der letzten Wartung mehr als 1.000 km zurückgelegt, wird automatisch ein Wartungsauftrag angelegt.

4 Pa) Erläutern Sie den Begriff Transaktion und beschreiben Sie, was passieren könnte, wenn die Rückgabe nicht als Transaktion ausgeführt wird und der Server nach Schritt 1 abstürzt.
4 Pb) Erläutern Sie den Begriff referenzielle Integrität am Beispiel der Tabellen Ausleihe und Fahrrad (Anlage 2). Nennen Sie außerdem zwei Möglichkeiten, wie das Datenbanksystem reagieren kann, wenn ein Fahrrad gelöscht werden soll, auf das noch Ausleihen verweisen.
2 Pc) Im Kundenportal wird sehr häufig die Abfrage „alle Ausleihen eines Kunden“ ausgeführt. Nennen Sie die Spalte, für die ein Index angelegt werden sollte, und begründen Sie Ihre Wahl.
Aufgabe DB-06.3 ★★★ Prüfungsniveau 16 Punkte

Für eine geplante Smartphone-App wird überlegt, Kundendaten und Ausleihen zusätzlich in einer dokumentenorientierten Datenbank bereitzustellen.

3 Pa) Ordnen Sie den Begriffen einer relationalen Datenbank die entsprechenden Begriffe einer dokumentenorientierten Datenbank zu.
Relationale DatenbankDokumentenorientierte Datenbank
Tabelle
Datensatz (Zeile)
Spalte (Attribut)
7 Pb) Stellen Sie die Kundin mit der KundenNr 1001 mit allen ihren Ausleihen aus der Tabelle Ausleihe (Anlage 2) als JSON-Dokument dar. Die Ausleihen sollen als Array eingebettet werden und neben AusleiheNr, Beginn, Ende, Kilometer und Betrag auch das Modell des Fahrrads enthalten.
6 Pc) Erläutern Sie mithilfe des Fachtextes in Anlage 8 zwei Vorteile und einen Nachteil einer dokumentenorientierten Datenbank für den VeloManager.

Angelehnt an: W23 Teil 1, Aufgabe 3b/3c (Begriffe, JSON, Einbettung); S22 Teil 1, Aufgabe 2c (NoSQL aus englischem Text)

DB-07 · SQL: Unterabfragen

Aufgabe DB-07.1 ★☆☆ Grundlagen 5 Punkte
3 Pa) Erstellen Sie eine SQL-Abfrage, die FahrradNr und Modell aller Fahrräder ausgibt, die noch nie ausgeliehen wurden (Tabelle Ausleihe). Verwenden Sie eine Unterabfrage mit NOT IN.
2 Pb) Erläutern Sie den Unterschied zwischen einer korrelierten und einer nicht korrelierten Unterabfrage.
Aufgabe DB-07.2 ★★☆ Anwendung 9 Punkte
4 Pa) Erstellen Sie eine SQL-Abfrage, die alle Ausleihen ausgibt, bei denen mehr Kilometer gefahren wurden als im Durchschnitt aller Ausleihen der Tabelle Ausleihe: AusleiheNr, KundenNr und Kilometer.
5 Pb) Erstellen Sie eine SQL-Abfrage, die KundenNr, Vorname und Nachname aller Kunden ausgibt, die mindestens einmal ein Fahrrad der Kategorie „E-Lastenrad“ ausgeliehen haben (Tabelle Ausleihe). Lösen Sie die Aufgabe mit Unterabfragen; die KategorieNr darf nicht als fester Wert verwendet werden.

Angelehnt an: W23 Teil 2, Aufgabe 4d (Vergleich mit AVG); S22 Teil 2, Aufgabe 4bb (Unterabfrage mit IN)

Aufgabe DB-07.3 ★★★ Prüfungsniveau 14 Punkte
6 Pa) Erstellen Sie eine SQL-Abfrage, die alle Fahrräder ausgibt, deren Kaufpreis über dem durchschnittlichen Kaufpreis der Fahrräder ihrer eigenen Kategorie liegt: FahrradNr, Modell und Kaufpreis.
5 Pb) Im Rahmen der Datenpflege sollen alle Kunden gelöscht werden, die weder in der Tabelle Ausleihe noch in der Tabelle Ausleihe_Archiv vorkommen. Erstellen Sie die SQL-Anweisung mit NOT EXISTS und geben Sie an, welche Kunden aus Anlage 2 gelöscht werden.
3 Pc) Ermitteln Sie, wie viele Ausleihen ein Kunde im Durchschnitt hat. Berücksichtigt werden nur Kunden mit mindestens einer Ausleihe in der Tabelle Ausleihe. Verwenden Sie eine Unterabfrage in der FROM-Klausel.

Angelehnt an: W23 Teil 2, Aufgabe 4d (korrelierte Unterabfrage); S22 Teil 2, Aufgabe 4bb (DELETE mit NOT EXISTS)

DB-08 · SQL: DDL

Aufgabe DB-08.1 ★☆☆ Grundlagen 5 Punkte
2 Pa) Ordnen Sie die SQL-Befehle CREATE TABLE, UPDATE, GRANT, ALTER TABLE, DELETE und REVOKE den Teilsprachen DDL, DML und DCL zu.
DDLDMLDCL
3 Pb) Legen Sie für die Spalten Kunde.PLZ, Fahrrad.Kaufpreis und Ausleihe.Beginn geeignete Datentypen fest und begründen Sie Ihre Wahl für die Spalte PLZ.
SpalteDatentyp
Kunde.PLZ
Fahrrad.Kaufpreis
Ausleihe.Beginn

Angelehnt an: S26 Teil 2, Aufgabe 4a; W22 Teil 2, Aufgabe 3c

Aufgabe DB-08.2 ★★☆ Anwendung 9 Punkte
6 Pa) Erstellen Sie die SQL-Anweisung, mit der die Tabelle Wartung (Anlage 2) angelegt wird. Anforderungen: WartungNr ist Primärschlüssel, FahrradNr ist Fremdschlüssel auf die Tabelle Fahrrad; FahrradNr, Datum und Art sind Pflichtfelder; Art hat den Standardwert 'Inspektion'; Kosten dürfen nicht negativ sein. Wählen Sie geeignete Datentypen.
3 Pb) Die Mitarbeiter an den Stationen suchen Kunden häufig über den Nachnamen. Erstellen Sie einen passenden Index und nennen Sie einen Nachteil, der durch den Index entsteht.

Angelehnt an: W21 Teil 2, Aufgabe 4a (CREATE TABLE); S22 Teil 2, Aufgabe 4ba (CREATE INDEX)

Aufgabe DB-08.3 ★★★ Prüfungsniveau 13 Punkte

Die Datenbank soll erweitert werden. Erstellen Sie jeweils die SQL-Anweisung(en).

2 Pa) Die Tabelle Fahrrad wird um die Spalte Hersteller erweitert (Herstellerkürzel aus genau drei Zeichen).
3 Pb) Die ersten drei Zeichen der Rahmennummer sind das Herstellerkürzel. Füllen Sie die neue Spalte für alle vorhandenen Fahrräder.
2 Pc) Künftig darf jede E-Mail-Adresse nur bei einem Kunden vorkommen. Ergänzen Sie eine entsprechende Einschränkung und erläutern Sie kurz, ob die Kunden 1003 und 1007 (ohne E-Mail-Adresse) dabei ein Problem darstellen.
6 Pd) Für die Vermietung von Zubehör (Helm, Schloss, Kindersitz …) werden zwei neue Tabellen benötigt: Zubehoer mit ZubehoerNr, Bezeichnung und Tagespreis sowie Ausleihe_Zubehoer, in der gespeichert wird, wie viele Stück eines Zubehörs zu einer Ausleihe gehören (Standardwert 1). Erstellen Sie beide Tabellen mit allen Primär- und Fremdschlüsseln.

Angelehnt an: W25 Teil 2, Aufgabe 4d (ALTER TABLE ADD/DROP und UPDATE mit SUBSTRING)

DB-09 · SQL: UNION

Aufgabe DB-09.1 ★☆☆ Grundlagen 3 Punkte
2 Pa) Erläutern Sie den Unterschied zwischen UNION und UNION ALL.
1 Pb) Nennen Sie eine Voraussetzung, die zwei SELECT-Anweisungen erfüllen müssen, damit sie mit UNION verbunden werden können.
Aufgabe DB-09.2 ★★☆ Anwendung 7 Punkte
4 Pa) Erstellen Sie eine SQL-Abfrage, die alle Ausleihen der Kundin 1001 aus den Tabellen Ausleihe und Ausleihe_Archiv ausgibt: AusleiheNr, FahrradNr, Beginn und Betrag, sortiert nach Beginn.
3 Pb) Geben Sie an, wie viele Zeilen die Abfrage SELECT KundenNr FROM Ausleihe UNION SELECT KundenNr FROM Ausleihe_Archiv; liefert und wie viele es mit UNION ALL wären. Begründen Sie den Unterschied.
Aufgabe DB-09.3 ★★★ Prüfungsniveau 13 Punkte

Für den Jahresbericht wird eine Statistik über alle Ausleihen benötigt – aktuelle und archivierte (Anlagen 2 und 3).

8 Pa) Erstellen Sie eine SQL-Abfrage, die je Jahr (Jahr des Beginns) die Anzahl der Ausleihen, den Umsatz (Summe der Beträge) und die gefahrenen Kilometer aus beiden Tabellen ausgibt, aufsteigend nach Jahr sortiert. Jedes Jahr soll genau einmal erscheinen.
2 Pb) Begründen Sie, warum in a) UNION ALL und nicht UNION verwendet werden muss. Nennen Sie ein konkretes Beispiel aus den Anlagen.
3 Pc) Ein Kollege schlägt folgende Abfrage vor:
SELECT YEAR(Beginn) AS Jahr, COUNT(*), SUM(Betrag), SUM(Kilometer)
FROM   Ausleihe
GROUP BY YEAR(Beginn)
UNION ALL
SELECT YEAR(Beginn), COUNT(*), SUM(Betrag), SUM(Kilometer)
FROM   Ausleihe_Archiv
GROUP BY YEAR(Beginn)
ORDER BY Jahr;

Erläutern Sie, warum diese Abfrage die Anforderung aus a) mit den vorliegenden Daten nicht erfüllt.

Angelehnt an: S24 Teil 2, Aufgabe 4d (UNION ALL mit GROUP BY YEAR)

DB-10 · SQL: Benutzer und Rechte

Aufgabe DB-10.1 ★☆☆ Grundlagen 3 Punkte
2 Pa) Erläutern Sie das Prinzip der minimalen Rechte.
1 Pb) Nennen Sie den SQL-Befehl, mit dem einem Benutzer ein Recht wieder entzogen wird.
Aufgabe DB-10.2 ★★☆ Anwendung 6 Punkte

Die Werkstatt erhält einen eigenen Zugang zur Datenbank velomanager. Erstellen Sie die SQL-Anweisungen.

1 Pa) Legen Sie den Benutzer werkstatt mit einem Passwort an.
3 Pb) Der Benutzer soll die Tabellen Fahrrad und Kategorie lesen sowie in der Tabelle Wartung Datensätze lesen, einfügen und ändern dürfen.
1 Pc) Das Recht, Datensätze der Tabelle Wartung zu ändern, soll wieder entzogen werden.
1 Pd) Begründen Sie, warum der Benutzer kein DELETE-Recht auf die Tabelle Wartung erhalten sollte.

Angelehnt an: S23 Teil 2, Aufgabe 4d (CREATE USER, GRANT SELECT)

Aufgabe DB-10.3 ★★★ Prüfungsniveau 10 Punkte

Im VeloManager arbeiten verschiedene Personengruppen. Folgende Anforderungen wurden aufgenommen:

4 Pa) Vervollständigen Sie die Rechtematrix (S = SELECT, I = INSERT, U = UPDATE, D = DELETE; kein Recht = –).
RolleKundeFahrradAusleiheWartung
Stationspersonal
Werkstatt
Controlling
4 Pb) Erstellen Sie die SQL-Anweisungen, mit denen die Rolle stationspersonal angelegt, mit den Rechten aus a) ausgestattet und dem Mitarbeiter mit dem (bereits vorhandenen) Benutzernamen mueller zugewiesen wird.
2 Pc) Erläutern Sie zwei Vorteile der Rechtevergabe über Rollen gegenüber der Vergabe an einzelne Benutzer.

DB-11 · Trigger, Stored Procedure, View

Aufgabe DB-11.1 ★☆☆ Grundlagen 4 Punkte
2 Pa) Erläutern Sie, was man unter einer Stored Procedure versteht.
2 Pb) Erläutern Sie, was man unter einem Trigger versteht.

Angelehnt an: S22 Teil 2, Aufgabe 4aa/4ab

Aufgabe DB-11.2 ★★☆ Anwendung 6 Punkte
4 Pa) Erstellen Sie eine View v_laufende_ausleihen, die für alle noch nicht beendeten Ausleihen die AusleiheNr, den Beginn, den Nachnamen des Kunden, das Modell und den Namen der Heimatstation des Fahrrads (Spaltenname „Station“) enthält. Geben Sie außerdem an, welche Zeile(n) die View mit den Daten aus Anlage 2 liefert.
2 Pb) Nennen Sie zwei Vorteile von Views.
Aufgabe DB-11.3 ★★★ Prüfungsniveau 10 Punkte
4 Pa) Ein Trigger soll verhindern, dass ein Fahrrad ausgeliehen wird, das noch nicht zurückgegeben wurde. Beschreiben Sie den Trigger, indem Sie die Tabelle ausfüllen.
TabelleEreignisZeitpunkt (BEFORE/AFTER)
BedingungAktion
4 Pb) Gegeben ist folgende Stored Procedure (MySQL):
CREATE PROCEDURE rueckgabe(IN p_nr INT, IN p_km INT)
BEGIN
  UPDATE Ausleihe a
    INNER JOIN Fahrrad f   ON f.FahrradNr   = a.FahrradNr
    INNER JOIN Kategorie k ON k.KategorieNr = f.KategorieNr
  SET a.Ende      = CURDATE(),
      a.Kilometer = p_km,
      a.Betrag    = (DATEDIFF(CURDATE(), a.Beginn) + 1) * k.Tagespreis
  WHERE a.AusleiheNr = p_nr
    AND a.Ende IS NULL;
END

Beschreiben Sie, was die Prozedur bewirkt. Geben Sie den Aufruf für die Rückgabe der laufenden Ausleihe 5012 mit 84 gefahrenen Kilometern an und berechnen Sie den Betrag, der bei einer Rückgabe am heutigen Tag (10.10.2026) gespeichert wird.

2 Pc) Nennen Sie je einen Vorteil und einen Nachteil, Geschäftslogik als Trigger oder Stored Procedure in der Datenbank statt im Anwendungsprogramm umzusetzen.

Angelehnt an: S22 Teil 2, Aufgabe 4a (Trigger, Stored Procedure)

DB-12 · Datenqualität beim Import

Aufgabe DB-12.1 ★☆☆ Grundlagen 5 Punkte
2 Pa) Nennen Sie vier Kriterien der Datenqualität.
3 Pb) Beim Import von Altdaten wird häufig nach dem ETL-Prinzip vorgegangen. Erläutern Sie die drei Schritte.
Aufgabe DB-12.2 ★★☆ Anwendung 9 Punkte

Die Werkstatt möchte die Einträge ihres bisherigen Werkstattbuchs (Anlage 6) in die Tabelle Wartung (Anlage 2) importieren.

9 PBeschreiben Sie drei Probleme bezüglich der Qualität der Daten in Anlage 6 und nennen Sie jeweils eine Folge, die sich durch den Import der mangelhaften Daten ergeben würde.

Angelehnt an: W24 Teil 2, Aufgabe 3ba

Aufgabe DB-12.3 ★★★ Prüfungsniveau 12 Punkte

Die Kundenkartei (Anlage 7) soll in die Tabelle Kunde (Anlage 2) übernommen werden.

6 Pa) Beschreiben Sie für die Spalten „Name“, „Adresse“ und „E-Mail“ der Kundenkartei jeweils das Problem und die notwendige Transformation (Bereinigungsregel) für den Import.
SpalteProblemTransformation
Name
Adresse
E-Mail
3 Pb) Beschreiben Sie ein Vorgehen, mit dem Dubletten wie in den Zeilen 1 und 5 erkannt und bereinigt werden können.
3 Pc) Beurteilen Sie, ob die Kundenkartei importiert oder die Kunden neu erfasst werden sollten, und begründen Sie Ihre Entscheidung.

Angelehnt an: W24 Teil 2, Aufgabe 3bb/3bc

Originalaufgaben zum Üben

Alle Dateien liegen im Ordner Prüfungsvorbereitung. Lösungen gibt es nur für 2023 Sommer, 2023 Winter, 2024 Sommer und 2025 Winter. Den originalen SQL-Syntax-Auszug findest du in den Belegsätzen von W21, S22, W22, S24 und W25 (z. B. 2024/sommer/AE Sommer 2024 Belegsatz.pdf).

PrüfungAufgaben (Block Datenbanken)DateiLösung
Winter 2021/22T1 A2b: ER-Modell (rekursiv, m:n), 16 P · T2 A3: Relationenmodell 3NF, 25 P · T2 A4: CREATE TABLE, SELECT, UPDATE mit Unterabfrage, GROUP BY/HAVING, Join über 4 Tabellen, 25 P2021/winter/AE 2021 Winter Teil 1.pdf, … Teil 2.pdf–
Sommer 2022T1 A2c: NoSQL aus engl. Text, 9 P · T2 A3: 3NF aus Tarifübersicht, 20 P · T2 A4: Stored Procedure, Trigger, Index, CREATE INDEX, DELETE mit NOT IN, LEFT JOIN + COUNT, 30 P2022/sommer/AE 2022 Sommer Teil 1.pdf, … Teil 2.pdf–
Winter 2022/23T1 A4c: NoSQL vs. relational, 5 P · T2 A3: ER-Modell erweitern, 3NF, Datentypen, 25 P · T2 A4: LEFT JOIN + GROUP BY, INSERT…SELECT + DELETE (Archiv), LIKE, 25 P2022/winter/AE 2022 Winter Teil 1.pdf, … Teil 2.pdf–
Sommer 2023T1 A4c: Änderungsanomalie, Relationenmodell 3NF mit JSON-Daten, 16 P · T2 A4: COUNT/YEAR/IS NULL, 3-Tabellen-Join, LEFT JOIN + COUNT, CREATE USER/GRANT, 25 P2023/sommer/AE Sommer 2023 Teil 1.pdf, … Teil 2.pdf2023/sommer/AE Sommer 2023 Teil 1+2 Lösungen.pdf
Winter 2023/24T1 A3: ACID, Dokument-DB, JSON, 25 P · T1 A4a: ER-Diagramm m:n mit Attributen, 14 P · T2 A3a: Relationenmodell 3NF, 18 P · T2 A4: BETWEEN, GROUP BY, UPDATE mit JOIN, korrelierte Unterabfrage, 25 P2023/winter/AE Winter 2023 Teil 1.pdf, … Teil 2.pdf2023/winter/AE Winter 2023 Teil 1 Lösungen.pdf, … Teil 2 Lösungen.pdf
Sommer 2024T1 A4a: ER-Modell erweitern (Soft Delete, m:n), 10 P · T2 A4: DELETE, MIN/MAX/AVG/COUNT je Gruppe, Archiv INSERT…SELECT + DELETE, UNION ALL + GROUP BY YEAR, 30 P2024/sommer/AE Sommer 2024 Teil 1+2+3.pdf2024/sommer/AE Sommer 2024 Teil 1 Lösungen.pdf, … Teil 2 Lösungen.pdf
Winter 2024/25T2 A3a: Relationenmodell 3NF (m:n), 16 P · T2 A3b: Datenqualität beim Import, 13 P · T2 A4: SELECT/JOIN, Datumsdifferenz, 21 P2024/winter/AE Winter 2024 Teil 2.pdf–
Winter 2025/26T1 A4: Redundanz, Anomalien, Tabelle in 3NF, 24 P · T2 A4: INSERT, SUM über 4 Tabellen, HAVING, ALTER TABLE + UPDATE mit SUBSTRING, SUM je Kategorie, 25 P2025/winter/AE Winter 2025 Teil 1.pdf, … Teil 2.pdf2025/winter/AE Winter 2025 Lösungserleuterungen.pdf
Sommer 2026T2 A3a: ER-Modell → Relationenmodell 3NF erweitern, 20 P · T2 A4: CRUD → DDL/DML, LEFT JOIN + GROUP BY (MAX/AVG), Archiv INSERT…SELECT, DELETE-Reihenfolge (FK), 25 P2026/sommer/AE Sommer 2026 Teil 2.pdf–