SQL – Filtern, Sortieren, Rechnen
Sortieren und SQL-Training
In Heft 4 hast du mit der Geodatenbank terra die Sprache SQL kennengelernt. Zuerst lernst du, Ergebnisse zu sortieren. Danach trainierst du deine Abfragen an neuen Datenbanken: einer Schule und einem Sportverein. Dazu kommen zwei neue Werkzeuge: DISTINCT und das Rechnen in SQL.
Zur Erinnerung: Bestandteile eines SQL-Befehls
| Teil | Bedeutung | Beispiel |
|---|---|---|
SELECT | Attribute, die ausgegeben werden | SELECT Name, Einwohner |
FROM | Tabelle, aus der die Daten stammen | FROM land |
WHERE | Bedingungen, die die Datensätze erfüllen müssen | WHERE Kontinent = 'Europa' |
ORDER BY | Sortierung: ASC aufsteigend (Standard), DESC absteigend | ORDER BY Einwohner DESC |
So funktionieren die SQL-Aufgaben
- ▶ Ausführen & prüfen (oder Strg + Enter) führt deine Abfrage aus, zeigt dir das Ergebnis, vergleicht es mit der Vorgabe und speichert deine Abfrage. Du kannst so oft ausprobieren, wie du willst.
- Ist dein Ergebnis noch falsch, kannst du 🔍 Fehler markieren einschalten: Dann werden Datensätze, Werte oder Spalten hervorgehoben, die nicht stimmen. Kommst du gar nicht weiter, füllt 🧩 Struktur vorgeben I ein Gerüst aus
SELECT … FROM … WHERE …ein, II ergänzt zusätzlich die Operatoren. Deine Lehrkraft sieht, wenn du diese Hilfen benutzt – probiere es zuerst selbst. - Die Reihenfolge der Spalten ist egal, solange die verlangten Attribute ausgegeben werden. Die Reihenfolge der Datensätze zählt nur, wenn die Aufgabe eine Sortierung verlangt.
1 Sortierung in SQL
Die Datensätze als Ergebnis einer SQL-Anfrage werden in der Regel unsortiert ausgegeben. Eine vorhandene Sortierung ist dann Zufall!
Merke
Die ORDER BY-Anweisung erzwingt eine bestimmte Reihenfolge. Die Liste der Attribute gibt die Sortierreihenfolge an. Die Schlüsselworte ASC und DESC erzwingen eine aufsteigende (Standard) oder absteigende Sortierung. Die Abkürzungen leiten sich von den englischen Wörtern ascending und descending ab.
So sortiert das folgende Beispiel die Länder erst nach dem Kontinent und dann absteigend nach der Einwohnerzahl:
SELECT Kontinent, Name FROM land ORDER BY Kontinent, Einwohner DESC
Datenbankschema „terra (Länder und Orte)“ anzeigen
- 🔑 LNR varchar(4)
- Name varchar(50)
- Einwohner decimal(20,2)
- Flaeche int(11)
- Hauptstadt varchar(30)
- Kontinent varchar(15)
- KontinentFlaeche int(11)
- KontinentEinwohner int(11)
- Name varchar(30)
- Land varchar(50)
- Einwohner int(11)
- Laenge decimal(10,4)
- Breite decimal(10,4)
🔑 Primärschlüssel · → Fremdschlüssel (verweist auf Tabelle.Attribut)
Ohne Anmeldung wird deine Abfrage nicht gespeichert.
Datenbankschema „terra (Länder und Orte)“ anzeigen
- 🔑 LNR varchar(4)
- Name varchar(50)
- Einwohner decimal(20,2)
- Flaeche int(11)
- Hauptstadt varchar(30)
- Kontinent varchar(15)
- KontinentFlaeche int(11)
- KontinentEinwohner int(11)
- Name varchar(30)
- Land varchar(50)
- Einwohner int(11)
- Laenge decimal(10,4)
- Breite decimal(10,4)
🔑 Primärschlüssel · → Fremdschlüssel (verweist auf Tabelle.Attribut)
Ohne Anmeldung wird deine Abfrage nicht gespeichert.
Aufgabe 3: Beschreibe, was der folgende SQL-Befehl ausgeben wird: SELECT Kontinent, Name FROM land ORDER BY Kontinent, Einwohner DESC
2 Die Schuldatenbank
Das (erfundene) Gymnasium am Sonnenhügel speichert seine Daten in mehreren Tabellen: schueler, klasse, lehrer, note, ag und ag_teilnahme. Klappe bei der ersten Aufgabe das Datenbankschema auf und verschaffe dir einen Überblick. Für dieses Kapitel brauchst du jeweils nur eine Tabelle.
Datenbankschema „Schule“ anzeigen
- 🔑 LehrerID integer
- Kuerzel varchar(4)
- Vorname varchar(30)
- Nachname varchar(30)
- Fach1 varchar(20)
- Fach2 varchar(20)
- 🔑 Bezeichnung varchar(3)
- Stufe integer
- Raum varchar(5)
- LehrerID integer → lehrer.LehrerID
- 🔑 SchuelerID integer
- Vorname varchar(30)
- Nachname varchar(30)
- Geburtsdatum date
- Wohnort varchar(30)
- Klasse varchar(3) → klasse.Bezeichnung
- 🔑 NoteID integer
- SchuelerID integer → schueler.SchuelerID
- Fach varchar(20)
- Art varchar(20)
- Datum date
- Note integer
- LehrerID integer → lehrer.LehrerID
- 🔑 AGID integer
- Name varchar(30)
- Wochentag varchar(10)
- Raum varchar(5)
- LehrerID integer → lehrer.LehrerID
- 🔑 SchuelerID integer → schueler.SchuelerID
- 🔑 AGID integer → ag.AGID
🔑 Primärschlüssel · → Fremdschlüssel (verweist auf Tabelle.Attribut)
Ohne Anmeldung wird deine Abfrage nicht gespeichert.
Datenbankschema „Schule“ anzeigen
- 🔑 LehrerID integer
- Kuerzel varchar(4)
- Vorname varchar(30)
- Nachname varchar(30)
- Fach1 varchar(20)
- Fach2 varchar(20)
- 🔑 Bezeichnung varchar(3)
- Stufe integer
- Raum varchar(5)
- LehrerID integer → lehrer.LehrerID
- 🔑 SchuelerID integer
- Vorname varchar(30)
- Nachname varchar(30)
- Geburtsdatum date
- Wohnort varchar(30)
- Klasse varchar(3) → klasse.Bezeichnung
- 🔑 NoteID integer
- SchuelerID integer → schueler.SchuelerID
- Fach varchar(20)
- Art varchar(20)
- Datum date
- Note integer
- LehrerID integer → lehrer.LehrerID
- 🔑 AGID integer
- Name varchar(30)
- Wochentag varchar(10)
- Raum varchar(5)
- LehrerID integer → lehrer.LehrerID
- 🔑 SchuelerID integer → schueler.SchuelerID
- 🔑 AGID integer → ag.AGID
🔑 Primärschlüssel · → Fremdschlüssel (verweist auf Tabelle.Attribut)
Ohne Anmeldung wird deine Abfrage nicht gespeichert.
3 Neu: Jeden Wert nur einmal – DISTINCT
Der TuS Blau-Weiß Bliesheim (erfunden) möchte wissen, aus welchen Orten seine Mitglieder kommen. Die Abfrage SELECT Wohnort FROM mitglied liefert aber 160 Zeilen – für jedes Mitglied eine, und Bliesheim taucht dutzende Male auf.
SELECT DISTINCT Wohnort FROM mitglied
| Wohnort |
|---|
| Kirkel |
| Homburg |
| Mandelbachtal |
| Bliesheim |
| … |
Mit DISTINCT erscheint jeder Wohnort nur noch einmal.
Merke
DISTINCT steht direkt hinter SELECT und entfernt doppelte Zeilen aus dem Ergebnis. Bei mehreren Attributen zählt die ganze Zeile: Eine Zeile fällt nur weg, wenn sie in allen ausgegebenen Attributen mit einer anderen übereinstimmt.Datenbankschema „Sportverein“ anzeigen
- 🔑 MitgliedID integer
- Vorname varchar(30)
- Nachname varchar(30)
- Geburtsjahr integer
- Wohnort varchar(30)
- Eintritt date
- Beitrag decimal(5,2)
- 🔑 MannschaftID integer
- Name varchar(40)
- Sportart varchar(20)
- Altersklasse varchar(20)
- Liga varchar(30)
- TrainerID integer → mitglied.MitgliedID
- 🔑 MitgliedID integer → mitglied.MitgliedID
- 🔑 MannschaftID integer → mannschaft.MannschaftID
- Trikotnummer integer
- Position varchar(20)
- 🔑 SpielID integer
- MannschaftID integer → mannschaft.MannschaftID
- Datum date
- Gegner varchar(40)
- Heimspiel integer
- PunkteEigene integer
- PunkteGegner integer
🔑 Primärschlüssel · → Fremdschlüssel (verweist auf Tabelle.Attribut)
Ohne Anmeldung wird deine Abfrage nicht gespeichert.
Welche Abfrage liefert garantiert nie zwei gleiche Zeilen?
4 Neu: Rechnen in SQL
Mit Zahl-Attributen kannst du rechnen: +, -, * und /. Eine Rechnung darf hinter SELECT stehen (dann entsteht eine neue Spalte) und in der WHERE-Bedingung.
SELECT Vorname, Nachname, 2026 - Geburtsjahr AS Lebensalter FROM mitglied WHERE 2026 - Geburtsjahr < 12
| Vorname | Nachname | Lebensalter |
|---|---|---|
| Ben | Kraus | 10 |
| Luca | Werner | 10 |
| … | … | … |
Mit AS gibst du der berechneten Spalte einen Namen. Ohne AS heißt die Spalte „2026 - Geburtsjahr“.
Achtung
- Teilst du zwei ganze Zahlen, schneidet die Datenbank die Nachkommastellen ab:
7 / 2ergibt3. Mit7.0 / 2erhältst du3.5. - Manche Wörter gehören zur Sprache SQL selbst und können nicht einfach als Name dienen, z. B.
Alter(wegenALTER) oderOrder.
Datenbankschema „Sportverein“ anzeigen
- 🔑 MitgliedID integer
- Vorname varchar(30)
- Nachname varchar(30)
- Geburtsjahr integer
- Wohnort varchar(30)
- Eintritt date
- Beitrag decimal(5,2)
- 🔑 MannschaftID integer
- Name varchar(40)
- Sportart varchar(20)
- Altersklasse varchar(20)
- Liga varchar(30)
- TrainerID integer → mitglied.MitgliedID
- 🔑 MitgliedID integer → mitglied.MitgliedID
- 🔑 MannschaftID integer → mannschaft.MannschaftID
- Trikotnummer integer
- Position varchar(20)
- 🔑 SpielID integer
- MannschaftID integer → mannschaft.MannschaftID
- Datum date
- Gegner varchar(40)
- Heimspiel integer
- PunkteEigene integer
- PunkteGegner integer
🔑 Primärschlüssel · → Fremdschlüssel (verweist auf Tabelle.Attribut)
Ohne Anmeldung wird deine Abfrage nicht gespeichert.
Datenbankschema „Buchhandlung“ anzeigen
- 🔑 AutorID integer
- Vorname varchar(30)
- Nachname varchar(30)
- Geburtsjahr integer
- Land varchar(30)
- 🔑 VerlagID integer
- Name varchar(40)
- Ort varchar(30)
- 🔑 ISBN varchar(17)
- Titel varchar(60)
- AutorID integer → autor.AutorID
- VerlagID integer → verlag.VerlagID
- Genre varchar(20)
- Jahr integer
- Seiten integer
- Preis decimal(5,2)
- Bestand integer
- 🔑 KundeID integer
- Vorname varchar(30)
- Nachname varchar(30)
- Wohnort varchar(30)
- 🔑 BestellID integer
- KundeID integer → kunde.KundeID
- Datum date
- 🔑 BestellID integer → bestellung.BestellID
- 🔑 ISBN varchar(17) → buch.ISBN
- Menge integer
🔑 Primärschlüssel · → Fremdschlüssel (verweist auf Tabelle.Attribut)
Ohne Anmeldung wird deine Abfrage nicht gespeichert.