SQL
Grundlegende SQL-Befehle
- Informationen des Zentralabiturs (PDF): Datei:Datenbanken-Abi-2012.pdf
- SQL-Sprachelemente im Zentralabitur:
- SELECT, SELECT DISTINCT, FROM, WHERE, GROUP BY, ORDER BY, ASC, DESC, JOIN, LEFT JOIN, RIGHT JOIN, ON, UNION, AS
- Vergleichsoperatoren: =, !=, >, <, >=, <=, LIKE, BETWEEN, IN, NOT IN, IS NULL
- Logische Operatoren: AND, OR, NOT
- Funktionen: COUNT, SUM, MAX, MIN
Beispieldatenbank Schule
- An der Beispieldatenbank Schule können alle möglichen Datenbankabfragen durchprobiert werden.
- Die Beispieldatenbank ist mit Absicht sehr schmal gehalten, damit man die Ergebnisse von SQL-Abfragen noch überprüfen kann.
- Testen kann man SQL-Abfragen auf der Datenbank Schule hier. Die Zugangsdaten gibt's bei Herrn Kaibel
Relationenalgebra gemäß Zentralabitur
Selektion
Formuliere eine Selektionsabfrage, die alle Informationen zu Räumen mit mindestens 30 Plätzen zurückgibt.
SELECT *
FROM raum r
WHERE r.plaetze >= 30
Projektion
Unter Projektion versteht man die Reduktion der Informationen in dem Ergebnis auf ein oder mehrere Attribute. Formuliere für die Tabelle raum eine Projektionsabfrage, die die Etagen MIT Projektion wiedergibt. Welche Bedeutung hat dabei das Schlüsselwort DISTINCT? (Teste dies, indem du DISTINCT mal weglässt.)
TODO
Vereinigung
Formuliere eine Abfrage, die Name und Vorname von allen Lehrern UND Schülern wiedergibt.
SELECT l.name, l.vorname
FROM lehrer l
UNION
SELECT s.name, s.vorname
FROM schueler s
Differenz
Formuliere eine Abfrage, die alle Klassen ausgibt, die KEIN Mathematik haben.
SELECT k.name
FROM klasse k
WHERE k.id NOT IN(SELECT u.klasse_id
FROM unterricht u
WHERE u.fach='Mathe')
Kartesisches Produkt
In der Mathematik bezeichnet man als kartesisches Produkt (nach René Descartes) zweier Mengen A und B die Menge aller geordneten Paare (a,b), wobei a aus A und b aus B ist. (Kombination: „Jedes mit jedem“.) Geschrieben wird es als A x B gelesen als A kreuz B. Formuliere eine Abfrage für das kartesische Produkt von den Tabellen klasse und schueler.
SELECT *
FROM klasse k, schueler s
Diese Abfrage liefert als Ergebnis "Jeder mit jedem". Inhaltlich ist das nicht sinnvoll.
Damit das kartesische Produkt sinnvoll wird, braucht man einen Abgleich zwischen den Tabellen; vgl. SQL-Abfrage über mehrere verknüpfte Tabellen
Umbenennung
Formuliere eine Abfrage über die Attribute klasse_id, lehrer_id, raum_id, fach und stunden der Tabelle unterricht. Dabei soll klasse_id in klassen-nr, lehrer_id in lehrer_nr und raum_id in raum-nr umbenannt werden.
SELECT u.klassen_id AS klassen-nr,u.lehrer_id AS Lehrer-nr,u.raum_id AS Raum-nr,u.fach,u.stunden
FROM unterricht u
Join
Formuliere eine Abfrage, die einen Join zwischen den Tabellen klasse und schueler durchführt. Bewerte das Ergebnis inhaltlich: In welchen Zusammenhängen braucht man Join?
SELECT s.name AS schuelername, k.name AS klassename
FROM schueler s JOIN klasse k
ON s.klasse_id = k.id
Mit einem JOIN werden nur VOLLSTÄNDIGE Datensätze angezeigt. D.h. im Beispiel fallen Schüler, die keine Klasse haben, und Klassen, die keine Schüler haben, raus.
Der Join entspricht der SQL-Abfrage über mehrere verknüpfte Tabellen
Left-Join
Formuliere eine Abfrage, die einen Left-Join zwischen den Tabellen klasse und schueler durchführt. Bewerte das Ergebnis inhaltlich: In welchen Zusammenhängen braucht man Left-Join?
SELECT s.name AS schuelername, k.name AS klassename
FROM schueler s LEFT JOIN klasse k
ON s.klasse_id = k.id
Beim LEFT JOIN werden ALLE Daten der LINKEN Entitätsmenge angezeigt. Im Beispiel werden also auch die Schüler angezeigt, die keine Klasse haben.
Right-Join
Formuliere eine Abfrage, die einen Right-Join zwischen den Tabellen klasse und schueler durchführt.
SELECT s.name AS schuelername, k.name AS klassename
FROM schueler s LEFT JOIN klasse k
ON s.klasse_id = k.id
Beim RIGHT JOIN werden ALLE Daten der RECHTEN Entitätsmenge angezeigt. Im Beispiel werden also auch die Klassen angezeigt, die keine Schüler haben.
SQL-Abfrage über mehrere verknüpfte Tabellen
Formuliere eine Abfrage, die angibt, in welchen Räumen die Klasse 8a unterrichtet wird. Die Abfrage läuft über die Tabellen klasse, unterricht und raum.
SELECT r.nummer
FROM klasse k, unterricht u, raum r
WHERE r.id=u.raum_id
AND u.klasse_id=k.id
AND k.name = '8a'
Wichtig: bei Abfragen über mehrere Tabellen braucht man einen Abgleich weniger als man Tabellen abfragt.
Im Beispiel werden drei Tabellen abgefragt; deswegen braucht man zwei Abgleiche.
IS NULL
Formuliere eine Abfrage, die alle Schüler zurückgibt, die keine Klasse haben.
SELECT s.name AS schuelername, k.name AS klassename
FROM schueler s LEFT JOIN klasse k
ON s.klasse_id = k.id
WHERE k.id IS NULL
Beim LEFT JOIN werden ALLE Daten der LINKEN Entitätsmenge angezeigt, also auch die Schüler, die keine Klasse haben.
Diese Schüler werden durch k.id IS NULL ausgewählt
.
Abfragen, bei denen man mehrere Variablen einer Entitätsmenge braucht
Formuliere eine Abfrage, die alle Räume wiedergibt, die mehr Plätze haben als Raum R203.
SELECT r2.nummer
FROM raum r1, raum r2
WHERE r1.nummer = "R203"
AND r2.plaetze > r1.plaetze
Man hat zwei verschiedene Räume: Der Raum r1 ist der Raum mit der Nummer "R203". Der Raum r2 steht für die gesuchten Räume.
Weitere SQL-Befehle
GROUP BY
Mit GROUP BY kann man Zeilen, die einen gemeinsamen Attributwert aufweisen, zusammenfassen.
Beispiel:
Mit der folgenden Abfrage erhält man eine Liste der Etagen, und für jede Etage wird notiert, wie viele Plätze in ihr insgesamt enthalten sind.
SELECT r.etage, SUM(plaetze) AS PlaetzeInEtage
FROM raum r
GROUP BY r.etage
BETWEEN
Mit BETWEEN ... AND kann man Intervalle angeben.
Beispiel:
SELECT r.nummer, r.plaetze
FROM raum r
WHERE r.plaetze BETWEEN 30 AND 50