SQL und Relationenalgebra
Die Musikschule hat ihre Daten auf vier Relationen verteilt: Lehrkraft, Kurs, Schueler und Belegung. Nun fragt die Leiterin: Welche Lehrkräfte leiten einen Kurs über 30 Euro Gebühr? Wie viele Schüler hat jeder Kurs, auch einer ohne Schüler? Wer ist in keinem Kurs?
Eine Abfragesprache beschreibt, welche Daten man will, nicht wie das System sie findet. Sie heißt SQL, und hinter ihr steht eine Algebra aus wenigen Operationen auf Relationen. Du lernst beides, dazu Tabellen ändern und den Weg vom Webformular zur Datenbank.
Abfragen: Projektion, Selektion und Sortierung
Als Beispiel dienen diese Relationen mit ausgedachten Daten.
Lehrkraft
| lid | name | raum |
|---|---|---|
| 7 | Weiss | 12 |
| 8 | Roth | 14 |
| 9 | Kern | 12 |
Kurs
| kid | titel | gebuehr | lid |
|---|---|---|---|
| 10 | Klavier | 40 | 7 |
| 11 | Gitarre | 30 | 8 |
| 12 | Chor | 20 | 7 |
| 13 | Schlagzeug | 50 | 9 |
Schueler hat sid und name: 1 Mara, 2 Jonas, 3 Lea, 4 Ben.
Belegung hat die Paare (sid, kid): (1, 10), (1, 11), (2, 10), (3, 10), (3, 12).
Eine Abfrage hat die Form Spalten Relation Bedingung Spalte. Die Spaltenliste ist die Projektion, die Bedingung die Selektion. Bedingungen vergleichen mit , (ungleich), , und so weiter und lassen sich mit , , verbinden. trifft Namen, die mit K beginnen. sortiert absteigend, ohne aufsteigend. Doppelte Ergebniszeilen entfernt erst . So liefert die Zeilen Schlagzeug 50, Klavier 40, Gitarre 30.
Verbund (Join)
Ein Verbund führt Relationen wieder zusammen. bildet gedanklich alle Paare aus Kurs und Lehrkraft und behält die, die die Bedingung nach erfüllen, meist Fremdschlüssel gleich Primärschlüssel. Gleiche Spaltennamen macht man mit dem Relationsnamen eindeutig: . Der einfache Verbund (, genauer ) behält nur Zeilen mit Partner. Der behält auch Zeilen der linken Relation ohne Partner und füllt die rechten Spalten mit NULL.
Drei Relationen verbinden
Drei Relationen verbinden
Welche Schüler belegen einen Kurs über 30 Euro Gebühr?
| Zeile | Einrückung | Anweisung |
|---|---|---|
| 1 | 0 | |
| 2 | 0 | |
| 3 | 1 | |
| 4 | 0 |
Der erste Verbund ordnet jeder Belegung den Schüler zu, der zweite den Kurs. Die Selektion behält Klavier (40) und Schlagzeug (50). Für Schlagzeug gibt es keine Belegung. Ergebnis: Mara, Jonas und Lea, jeweils mit Klavier.
Aggregatfunktionen und Gruppierung
Aggregatfunktionen fassen Zeilen zu einem Wert zusammen: , , , , . bildet Gruppen mit gleichem Wert in den genannten Spalten und liefert je Gruppe eine Zeile. In der Spaltenliste stehen dann neben Aggregaten nur Gruppierungsspalten. filtert Zeilen vor der Gruppierung, filtert Gruppen danach. Aggregatfunktionen überspringen NULL, nur zählt jede Zeile. Die Klauseln stehen in fester Reihenfolge: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY.
Schüler je Kurs zählen
Schüler je Kurs zählen
Wie viele Schüler hat jeder Kurs, auch einer ohne Schüler?
| Zeile | Einrückung | Anweisung |
|---|---|---|
| 1 | 0 | |
| 2 | 0 | |
| 3 | 0 | |
| 4 | 0 |
Der behält jeden Kurs. Schlagzeug erscheint mit einer Zeile, in der belegung.sid NULL ist. überspringt NULL. Ergebnis: Klavier 3, Gitarre 1, Chor 1, Schlagzeug 0. ergäbe für Schlagzeug 1.
Unterabfragen
Eine Unterabfrage ist eine Abfrage in Klammern innerhalb einer anderen Anweisung. Liefert sie einen Wert, steht sie wie eine Zahl im Vergleich: wählt Kurse über dem Durchschnitt (40 + 30 + 20 + 50) : 4 = 35, also Klavier und Schlagzeug. Liefert sie eine Spalte, prüfen und die Zugehörigkeit: liefert die Schüler ohne Belegung, hier Ben.
Ändern, DDL, Views und DCL
Daten ändert man mit , und , zum Beispiel . Ohne wirken und auf alle Zeilen. Das DBMS lehnt Änderungen ab, die einen Fremdschlüssel verletzen.
Die DDL (Data Definition Language) legt Strukturen fest: legt eine Tabelle mit Spalten, und an, fügt eine Spalte hinzu, entfernt eine Tabelle samt Inhalt.
Ein View ist eine gespeicherte Abfrage mit Namen, die man wie eine Tabelle abfragt: . Er vereinfacht Abfragen und gibt nur ausgewählte Spalten frei. Die DCL (Data Control Language) vergibt Rechte: erlaubt das Lesen, nimmt es zurück.
Relationenalgebra und ihre Abbildung in SQL
Die Relationenalgebra beschreibt Abfragen als verschachtelbare Operationen, die aus Relationen neue machen.
| Operation | Schreibweise | SQL |
|---|---|---|
| Selektion | ||
| Projektion | ||
| Kreuzprodukt | ||
| Verbund | ||
| Vereinigung | ||
| Differenz | (manchmal ) | |
| Durchschnitt | ||
| Umbenennung |
Vereinigung, Differenz und Durchschnitt verlangen gleiche Attribute. Der Verbund ist ein Kreuzprodukt mit anschließender Selektion. Eine Relation ist eine Menge ohne doppelte Tupel, ein SQL-Ergebnis kann doppelte Zeilen haben. Darum entspricht die Projektion .
Von der Algebra zu SQL
Von der Algebra zu SQL
Übersetze den Ausdruck in SQL und werte ihn aus.
Von innen nach außen: Der Verbund wird , die Selektion , die Projektion die Spaltenliste mit .
| Zeile | Einrückung | Anweisung |
|---|---|---|
| 1 | 0 | |
| 2 | 0 | |
| 3 | 0 |
Die Kurse über 30 Euro sind Klavier (Lehrkraft 7) und Schlagzeug (Lehrkraft 9). Ergebnis: Weiss und Kern.
Webdatenbank mit Formularen
Eine Webdatenbank besteht aus Browser, Webserver mit einem Programm und DBMS. Ein Formular ist eine Webseite mit Eingabefeldern und einem Knopf zum Absenden. Der Browser schickt die Eingaben an den Server, das Programm baut eine SQL-Anweisung, schickt sie an das DBMS und erzeugt aus der Ergebnistabelle eine Webseite.
Gefährlich ist es, die Eingabe als Text in die Anweisung zu kleben (SQL-Injektion). Das Programm bildet , hängt die Eingabe an und schließt mit einem Anführungszeichen. Wer eingibt, erzeugt : Die Bedingung ist immer wahr, alle Zeilen kommen zurück. Schutz bieten parametrisierte Anweisungen mit Platzhalter, . Die Eingabe wird getrennt als reiner Wert übergeben, nie als SQL-Code. Dazu kommt ein Datenbankbenutzer mit möglichst wenigen Rechten.
COUNT(*) bei einem LEFT JOIN
COUNT(*) bei einem LEFT JOIN
"Ich zähle die Schüler je Kurs mit COUNT(*). Für den leeren Kurs kommt 0."
Der erzeugt für den leeren Kurs eine Zeile mit NULL, die mitzählt. Das Ergebnis ist 1. Zähle eine Spalte der rechten Relation, überspringt NULL.
Zusammenfassung
Eine Abfrage verbindet Projektion (SELECT), Selektion (WHERE) und Sortierung (ORDER BY). DISTINCT entfernt doppelte Zeilen.
Ein JOIN verknüpft Relationen über Schlüssel. Der LEFT JOIN behält auch Zeilen ohne Partner und füllt sie mit NULL.
GROUP BY bildet Gruppen für Aggregatfunktionen. WHERE filtert vor, HAVING nach der Gruppierung.
Unterabfragen liefern einen Wert oder eine Spalte. DDL legt Strukturen fest, ein View ist eine gespeicherte Abfrage, DCL vergibt Rechte.
Jede Operation der Relationenalgebra hat eine Entsprechung in SQL. Die Projektion entspricht SELECT DISTINCT.
Parametrisierte Anweisungen verhindern bei Webformularen die SQL-Injektion.
Übungen
Mit den Daten der Lektion: Welche Zahl steht in der zweiten Spalte der einzigen Zeile von SELECT lid, SUM(gebuehr) FROM kurs GROUP BY lid HAVING COUNT(*) >= 2;
Welche Abfrage liefert die Schüler, die in keinem Kurs angemeldet sind?
Wie schützt man eine Webdatenbank am besten vor SQL-Injektion?
Schreibe eine SQL-Abfrage, die für jede Lehrkraft den Namen und die Zahl ihrer Kurse liefert, auch 0 für Lehrkräfte ohne Kurs.
Welche SQL-Abfrage entspricht ?