← Alle LernbereicheLernfelder 5 und 8

Datenbanken & SQL

Daten sinnvoll modellieren, Beziehungen verstehen und mit SQL zuverlässig abfragen.

01

Vom Bedarf zum Datenmodell

Ein Datenmodell beschreibt fachliche Objekte, ihre Eigenschaften und Beziehungen. Kläre zuerst, welche Fragen das System beantworten soll. Für ein Supportportal sind Benutzer und Tickets unterschiedliche Entitäten. Ein Datenbanktabellenmodell ist nicht mit einem UML-Klassendiagramm identisch: Verhalten und Operationen gehören nicht in Tabellen.

Benutzer(id, name, abteilung)
Ticket(id, benutzer_id, titel, status, minuten)
02

Schlüssel und Beziehungen

Ein Primärschlüssel identifiziert jede Zeile eindeutig und darf nicht NULL sein. Ein Fremdschlüssel verweist auf einen zulässigen Schlüssel einer anderen Tabelle und schützt Beziehungen. Bei 1:n steht der Fremdschlüssel typischerweise auf der n-Seite. Eine n:m-Beziehung benötigt eine Zuordnungstabelle. Regeln für Löschungen müssen fachlich festgelegt werden.

Ticket.benutzer_id → Benutzer.id
Projekt_Mitarbeiter(projekt_id, mitarbeiter_id)
03

Normalisierung

Die erste Normalform vermeidet wiederholte Gruppen und verlangt für das Modell atomare Attributwerte. In der zweiten Normalform hängen Nichtschlüsselattribute vom ganzen Kandidatenschlüssel ab. Die dritte Normalform beseitigt problematische transitive Abhängigkeiten von Nichtschlüsselattributen. So werden Änderungs-, Einfüge- und Löschanomalien reduziert. Atomarität hängt vom fachlichen Modell ab.

Abteilungsname nicht in jedes Ticket kopieren, wenn die Abteilung eigenständig verwaltet wird.
04

SELECT, WHERE und ORDER BY

SELECT legt die Ergebnisspalten fest, FROM die Datenquelle und WHERE die Filterbedingung. ORDER BY bestimmt eine verlässliche Sortierung. Ohne ORDER BY ist eine bestimmte Zeilenfolge nicht garantiert. Strings stehen in einfachen Anführungszeichen. LIMIT begrenzt das Ergebnis, ersetzt aber keinen fachlich richtigen Filter.

SELECT id, titel FROM tickets WHERE status = 'offen' ORDER BY id;
05

JOIN und fehlende Zuordnungen

Ein INNER JOIN liefert passende Kombinationen beider Tabellen. Ein LEFT JOIN behält zusätzlich alle linken Zeilen; ohne rechten Partner sind die rechten Spalten NULL. Ein Filter auf rechte Spalten in WHERE kann diese zusätzlichen Zeilen wieder entfernen. Verknüpfe über Schlüssel statt zufällig gleiche Namen.

SELECT b.name, t.titel FROM benutzer b LEFT JOIN tickets t ON t.benutzer_id = b.id;
06

Gruppieren und zählen

GROUP BY bildet Gruppen, Aggregatfunktionen wie COUNT, SUM und AVG werten diese aus. WHERE filtert Zeilen vor der Gruppierung; HAVING filtert Gruppen danach. COUNT(*) zählt Zeilen, COUNT(spalte) nur nicht-NULL-Werte dieser Spalte. Beim LEFT JOIN ist COUNT(t.id) meist passend, wenn Tickets statt Ergebniszeilen gezählt werden sollen.

SELECT b.name, COUNT(t.id) AS anzahl FROM benutzer b LEFT JOIN tickets t ON t.benutzer_id = b.id GROUP BY b.id, b.name HAVING COUNT(t.id) >= 2;
07

NULL und Datenintegrität

NULL kennzeichnet einen unbekannten oder fehlenden Wert. Prüfe ihn mit IS NULL oder IS NOT NULL, nicht mit = NULL. UNIQUE, NOT NULL, CHECK und Fremdschlüssel setzen unterschiedliche Regeln durch. Ein Constraint ersetzt keine vollständige fachliche Eingabeprüfung. Bei SQLite muss Fremdschlüsselprüfung pro Verbindung aktiviert werden.

SELECT id FROM tickets WHERE benutzer_id IS NULL;
08

Transaktionen und sichere Abfragen

Eine Transaktion fasst Änderungen zu einer Einheit zusammen: Bei einem Fehler wird zurückgerollt. ACID beschreibt Atomarität, Konsistenz, Isolation und Dauerhaftigkeit; konkrete Isolationsstufen unterscheiden sich zwischen Datenbanksystemen. Anwendungen binden Nutzereingaben als Parameter. SQL-Text mit eingeklebten Eingaben ist kein sicherer Ersatz.

BEGIN;
-- zusammengehörige Änderungen
COMMIT;  -- bei Fehler stattdessen ROLLBACK
09

Indizes und Übungsdatenbank

Indizes können geeignete Filter und Verknüpfungen beschleunigen, benötigen Speicher und erhöhen den Änderungsaufwand. Prüfe Abfragepläne statt jedes Attribut zu indizieren. Der SQL-Playground verwendet SQLite mit fiktiven Supportdaten ausschließlich im Browser. PostgreSQL- oder MySQL-spezifische Funktionen können abweichen. Abfragen und Aufgaben werden anhand echter Ergebnisse geprüft.

Wissen anwenden

Prüfe die Grundlagen in einer kurzen Übung.

Zur Übung ↗