SQL erweitert

Views (Sichten)

Eine View (Sicht) ist eine virtülle Tabelle, die durch eine gespeicherte SELECT-Abfrage definiert wird. Sie speichert keine eigenen Daten, sondern berechnet das Ergebnis bei jedem Zugriff neu.

-- View erstellen
CREATE VIEW Kursübersicht AS
SELECT k.bezeichnung, l.name AS lehrkraft, COUNT(b.schueler_id) AS teilnehmer
FROM Kurs k
JOIN Lehrkraft l ON k.lehrkraft_id = l.lehrkraft_id
LEFT JOIN Belegung b ON k.kurs_id = b.kurs_id
GROUP BY k.bezeichnung, l.name;

-- View verwenden wie eine normale Tabelle
SELECT * FROM Kursübersicht WHERE teilnehmer > 20;

Vorteile von Views:

  • Vereinfachung: Komplexe Abfragen werden gekapselt.
  • Sicherheit: Benutzer sehen nur bestimmte Spalten/Zeilen.
  • Konsistenz: Änderungen an der View-Definition wirken sich auf alle Nutzer aus.
Transaktionen

Eine Transaktion ist eine logische Einheit aus einer oder mehreren Datenbankoperationen, die ganz oder gar nicht ausgeführt werden.

BEGIN TRANSACTION;
    UPDATE Konto SET saldo = saldo - 100 WHERE konto_id = 1;
    UPDATE Konto SET saldo = saldo + 100 WHERE konto_id = 2;
COMMIT;
-- Bei Fehler: ROLLBACK;

Bei einem Fehler wird ein ROLLBACK durchgeführt: Alle Änderungen seit dem BEGIN werden rückgängig gemacht.

Das ACID-Prinzip

Transaktionen müssen die vier ACID-Eigenschaften erfüllen:

  • Atomicity (Atomarität): Eine Transaktion wird ganz oder gar nicht ausgeführt. Bei einem Fehler werden alle Änderungen zurückgerollt.
  • Consistency (Konsistenz): Die Datenbank befindet sich vor und nach der Transaktion in einem konsistenten Zustand. Alle Integritätsbedingungen werden eingehalten.
  • Isolation: Gleichzeitig laufende Transaktionen beeinflussen sich nicht gegenseitig. Jede Transaktion sieht den Zustand, als wäre sie allein.
  • Durability (Dauerhaftigkeit): Nach einem COMMIT sind die Änderungen dauerhaft gespeichert – auch bei einem Systemausfall.
Indizes

Ein Index ist eine zusätzliche Datenstruktur (häufig ein B-Baum), die den Zugriff auf bestimmte Spalten beschleunigt – vergleichbar mit einem Stichwortverzeichnis in einem Buch.

-- Index erstellen
CREATE INDEX idx_schueler_name ON Schüler(name);

-- Abfrage profitiert automatisch vom Index
SELECT * FROM Schüler WHERE name = 'Müller';

Vorteile: Deutlich schnellere Suchoperationen (von O(n) auf O(log n) bei B-Baum).

Nachteile: Zusätzlicher Speicherverbrauch. Schreiboperationen (INSERT, UPDATE, DELETE) werden langsamer, da der Index aktualisiert werden muss.

Subqueries und JOINs

Erweiterte Abfragetechniken für komplexe Datenabfragen:

-- Subquery: Schüler mit überdurchschnittlicher Note
SELECT name FROM Schüler s
JOIN Belegung b ON s.schueler_id = b.schueler_id
WHERE b.note < (SELECT AVG(note) FROM Belegung);

-- LEFT JOIN: Alle Kurse, auch ohne Belegungen
SELECT k.bezeichnung, COUNT(b.schueler_id) AS anzahl
FROM Kurs k
LEFT JOIN Belegung b ON k.kurs_id = b.kurs_id
GROUP BY k.bezeichnung;

-- HAVING: Nur Kurse mit mehr als 5 Teilnehmern
SELECT k.bezeichnung, COUNT(*) AS anzahl
FROM Kurs k JOIN Belegung b ON k.kurs_id = b.kurs_id
GROUP BY k.bezeichnung
HAVING COUNT(*) > 5;

Abitur-Tipp: Präge dir die ACID-Eigenschaften mit einem Bankbeispiel ein: Überweisung von 100€ muss atomar sein (beide Konten ändern oder keines), konsistent (Gesamtsumme bleibt gleich), isoliert (andere Transaktionen sehen keinen Zwischenzustand) und dauerhaft (nach Commit nicht verlierbar). Views und Subqueries sind typische SQL-Aufgaben im Abitur.