Berufliches Gymnasium, Klasse 13 | Kontext: Music-Event (Event-Planer)
Überblick: Hier lernen Sie, wie Sie Daten gezielt aus Tabellen abfragen, filtern und sortieren.
Der grundlegendste Befehl in SQL ist `SELECT`. Er wählt bestimmte Spalten oder alle Spalten (`*`) aus einer oder mehreren Tabellen aus.
| Befehl | Zweck |
|---|---|
SELECT Attribut1, Attribut2 | Wählt spezifische Spalten aus. |
SELECT * | Wählt alle Spalten aus (Vorsicht bei großen Tabellen!). |
FROM Tabelle | Gibt an, aus welcher Tabelle die Daten stammen. |
Beispiel: Zeige mir den Namen und die Stadt aller Veranstaltungsorte.
SELECT Name, Stadt
FROM Veranstaltungsort;
Die `WHERE`-Klausel definiert die **Bedingungen**, die ein Datensatz erfüllen muss, um in der Ergebnismenge zu erscheinen.
| Operator-Typ | Beispiel | Erklärung |
|---|---|---|
| Vergleich | =, >, <> | Gleich, größer als, ungleich |
| Logisch | AND, OR, NOT | Verknüpfung mehrerer Bedingungen |
| Bereich | BETWEEN 100 AND 200 | Werte in einem bestimmten Intervall |
| Menge | IN ('Pop', 'Rock') | Werte in einer Liste von Möglichkeiten |
| Text | LIKE 'A%' | Mustersuche (z.B. beginnt mit 'A') |
Beispiel: Finde alle Konzerte, die **nach** dem 01.12.2025 stattfinden **und** mehr als 100 Euro kosten.
SELECT Titel, Datum, Preis
FROM Konzert
WHERE Datum > '2025-12-01' AND Preis > 100;
ORDER BY sortiert das Ergebnis. LIMIT begrenzt die Anzahl der Zeilen (wichtig für die Performance!).
Überblick: Relationale Datenbanken speichern Daten in mehreren Tabellen. `JOINs` sind notwendig, um diese Tabellen über ihre **Fremdschlüssel** zu verknüpfen und einen vollständigen Datensatz zu erhalten.
| JOIN-Typ | Beschreibung | Anwendungsfall |
|---|---|---|
INNER JOIN | Liefert nur die Tupel, für die in **beiden Tabellen** ein passender Eintrag existiert (Schnittmenge). | Standardfall: Ein Konzert MUSS einen Künstler und einen Veranstaltungsort haben. |
LEFT JOIN | Liefert **alle** Tupel aus der **linken Tabelle** und die passenden Tupel aus der rechten Tabelle. Fehlende Werte werden mit NULL aufgefüllt. | Finde alle Künstler, **auch wenn** sie noch kein Konzert eingetragen haben. |
RIGHT JOIN | Das Gegenteil von LEFT JOIN. | *Wird seltener verwendet.* |
Der `JOIN`-Befehl benötigt die ON-Klausel, die angibt, welche Spalten (Primär- und Fremdschlüssel) die Tabellen verknüpfen.
Beispiel: Welcher Künstler tritt bei welchem Konzert auf? (Verknüpfung von *Konzert* und *Künstler*)
SELECT K.Titel, Kst.Name AS Künstlername
FROM Konzert K
INNER JOIN Künstler Kst
ON K.KünstlerID = Kst.ID;
K und Kst sind **Aliase**, um lange Tabellennamen abzukürzen.
Überblick: Aggregatfunktionen fassen Daten zusammen und berechnen statistische Werte. Sie sind ideal für Reports und Business Intelligence (BI).
| Funktion | Zweck |
|---|---|
COUNT() | Zählt die Anzahl der Zeilen. |
SUM() | Berechnet die Summe der Werte in einer Spalte. |
AVG() | Berechnet den Durchschnitt (Average). |
MIN(), MAX() | Findet den minimalen/maximalen Wert. |
Wenn Sie Aggregatfunktionen auf **Untergruppen** von Daten anwenden möchten (z.B. die Anzahl der Konzerte *pro Stadt*), verwenden Sie `GROUP BY`.
Beispiel: Zeige nur Veranstaltungsorte an, in denen **mehr als 5** Konzerte stattfinden.
SELECT OrtID, COUNT(*) AS AnzahlKonzerte
FROM Konzert
GROUP BY OrtID
HAVING COUNT(*) > 5;
WHERE filtert **Datensätze**; HAVING filtert **Gruppen** (nach Aggregatfunktionen).
Beantworten Sie die folgenden Fragen (mit Hilfe des Skripts und der geladenen Datenbank) und schreiben Sie die entsprechende SQL-Abfrage auf. **Überprüfen Sie erst danach mit dem Lösungsfeld!**
| Nr. | Frage (Bezug auf den Event-Planer) | Ihre SQL-Abfrage |
|---|---|---|
| 1. | Finde alle **Künstler** aus **Hamburg** oder **Berlin**. | |
| 2. | Gib den **Namen des Künstlers** und den **Titel des Konzerts** aus. | |
| 3. | Zähle die **Gesamtzahl der Konzerte**, deren Titel mit **"Summer"** beginnt. | |
| 4. | Finde alle **Veranstaltungsorte**, bei denen die **maximale Kapazität kleiner als 5000** ist **UND** die **nicht** in München liegen. | |
| 5. | Zeige die **durchschnittlichen Preise** aller Konzerte, gruppiert nach dem **Veranstaltungsort**. | |
| 6. | Finde die **Künstler**, die **mehr als 3 Konzerte** eingetragen haben (basierend auf Ihren Dummy-Daten). |
Vergleichen Sie Ihre Abfragen mit den korrekten Lösungen. Denken Sie daran: Bei SQL führen oft mehrere Wege zum Ziel!
| Nr. | Korrekte SQL-Abfrage |
|---|---|
| 1. | SELECT * FROM Künstler WHERE Herkunftsland IN ('Deutschland', 'Schweden');*Alternative mit OR:* SELECT * FROM Künstler WHERE Herkunftsland = 'Deutschland' OR Herkunftsland = 'Schweden'; |
| 2. | SELECT Kst.Name, K.Titel FROM Konzert K INNER JOIN Künstler Kst ON K.KünstlerID = Kst.ID; |
| 3. | SELECT COUNT(*) FROM Konzert WHERE Titel LIKE 'Summer%'; |
| 4. | SELECT * FROM Veranstaltungsort WHERE Kapazität < 5000 AND Stadt <> 'München'; |
| 5. | SELECT V.Name, AVG(K.Preis) FROM Konzert K JOIN Veranstaltungsort V ON K.OrtID = V.ID GROUP BY V.Name; |
| 6. | SELECT KünstlerID, COUNT(*) AS Anzahl FROM Konzert GROUP BY KünstlerID HAVING Anzahl > 3; |