SQL Lektion 1: SELECT und WHERE
Lösung geprüft
Die Aufgabe der heutigen Stunde ist die erste SQL-Lektion! Ab hier reden wir nicht mehr über Datenbanken, sondern fragen sie was. Die Abgabe ist eine kompakte Zusammenfassung der Befehle – und genau die steht hier.
a) Bearbeiten Sie die erste Lektion und erstellen Sie in ihrem OneNote-Heft eine kompakte übersichtliche Kurzzusammenfassung der SQL-Befehle.
Wichtig: Die Antworten sollen als Text vorliegen, damit die Antworten per Copy und Paste kopiert werden können, d.h. keine Screenshots für Antworten erlaubt.
Die Beispieltabelle
Alle Beispiele laufen auf der Tabelle WMTitel mit den
Formel-1-Weltmeistern:
WMTitel(Saison, Fahrerweltmeister, KonstrukteursWM, WM_Punkte, Team_Punkte)
Der Grundaufbau
-- Die Zusammenfassung der ersten SQL-Lektion
-- @meininfokurs.cmrg.site
SELECT spalte1, spalte2 -- welche Spalten will ich sehen?
FROM tabelle -- aus welcher Tabelle?
WHERE bedingung -- welche Zeilen? (optional)
Mehr ist es im Kern nicht. SELECT * holt alle Spalten.
Ohne WHERE kommen alle Zeilen. Und die Reihenfolge der drei
Schlüsselwörter ist fest – FROM vor SELECT geht
nicht.
Vergleichsoperatoren
| Operator | Bedeutung |
|---|---|
= | gleich – ein Gleichheitszeichen, nicht zwei wie in Java |
<> | ungleich (manche Datenbanken kennen auch !=) |
< <= > >= | kleiner, kleiner gleich, größer, größer gleich |
-- Weltmeister mit mindestens 100 WM-Punkten
SELECT Fahrerweltmeister, WM_Punkte
FROM WMTitel
WHERE WM_Punkte >= 100;
Logische Operatoren und BETWEEN
-- In welchen Jahren hatte der Weltmeister zwischen 80 und 110 Punkte?
SELECT Saison, Fahrerweltmeister, WM_Punkte
FROM WMTitel
WHERE WM_Punkte BETWEEN 80 AND 110;
Mit AND, OR und NOT verknüpft man
Bedingungen. Für Bereiche gibt es BETWEEN, und zwar aus einem
wichtigen Grund:
WHERE WM_Punkte >= 80 AND <= 110 -- FALSCH, geht nicht
WHERE WM_Punkte >= 80 AND WM_Punkte <= 110 -- richtig, aber umstaendlich
WHERE WM_Punkte BETWEEN 80 AND 110 -- richtig und kurz
In der ersten Zeile fehlt beim zweiten Vergleich der Vergleichspartner.
SQL weiß nicht, dass sich <= 110 wieder auf
WM_Punkte beziehen soll. BETWEEN schließt die
Grenzen übrigens mit ein – 80 und 110 sind also dabei.
LIKE – Muster suchen
| Platzhalter | Bedeutung |
|---|---|
% | eine beliebige Folge von Zeichen (auch keins) |
_ | genau ein beliebiges Zeichen |
-- In welchen Jahren war Renault Konstrukteursweltmeister?
SELECT Saison, KonstrukteursWM
FROM WMTitel
WHERE KonstrukteursWM LIKE '%Renault%';
Die Prozentzeichen auf beiden Seiten heißen „Renault kommt irgendwo im
Text vor". Ohne sie müsste der Eintrag exakt „Renault" lauten –
„Renault F1 Team" würde nicht gefunden. Es gibt auch
NOT LIKE.
% den Stern
* und statt _ das Fragezeichen ?.
In MySQL gilt der Standard mit Prozent und Unterstrich.
IN – eine Liste von Werten
-- In welchen Jahren waren Senna, Prost bzw. Hill Weltmeister?
SELECT Saison, Fahrerweltmeister
FROM WMTitel
WHERE Fahrerweltmeister IN ('Ayrton Senna', 'Alain Prost', 'Damon Hill');
Das ist die Kurzform für drei OR-Bedingungen. Auch hier gibt
es NOT IN. Ab drei Werten ist IN deutlich
lesbarer.
IS NULL – fehlende Werte finden
-- In welchen Jahren gab es keine Team_Punkte?
SELECT *
FROM WMTitel
WHERE Team_Punkte IS NULL;
Das ist die Stelle, an der sich fast jeder einmal die Zähne ausbeißt:
= NULL funktioniert nicht. NULL heißt
„unbekannt", und ob etwas Unbekanntes gleich etwas Unbekanntem ist, kann
SQL nicht beantworten – das Ergebnis ist wieder unbekannt und damit nie
wahr. Deshalb gibt es das eigene Schlüsselwort IS NULL
beziehungsweise IS NOT NULL.
DISTINCT – Doppelte wegwerfen
-- Alle Weltmeister, jeder nur einmal
SELECT DISTINCT Fahrerweltmeister
FROM WMTitel;
Wer siebenmal Weltmeister war, stünde ohne DISTINCT auch
siebenmal in der Liste.
AS – Rechnen und Spalten umbenennen
-- Prozentuale Ausbeute: bei 16 Rennen a 10 Punkten sind maximal 160 moeglich
SELECT Fahrerweltmeister, WM_Punkte / 160 * 100 AS Ausbeute
FROM WMTitel;
In SELECT darf man mit + - * / rechnen. Ohne
AS würde die Spalte in der Ergebnistabelle
WM_Punkte / 160 * 100 heißen, was ziemlich unschön ist.
ORDER BY – sortieren
-- Ausbeute, groesster Wert zuerst
SELECT Fahrerweltmeister, WM_Punkte / 160 * 100 AS Ausbeute
FROM WMTitel
ORDER BY Ausbeute DESC;
-- Nach mehreren Kriterien, hier ueber Spaltennummern
SELECT Fahrerweltmeister, WM_Punkte / 160 * 100
FROM WMTitel
ORDER BY 2 DESC, 1 ASC;
| Zusatz | Bedeutung |
|---|---|
ASC | aufsteigend – A bis Z, kleine Zahlen zuerst. Das ist der Standard, man kann es weglassen. |
DESC | absteigend |
Man darf nach mehreren Spalten sortieren: erst nach der ersten, und bei Gleichstand nach der zweiten. Statt der Spaltennamen kann man auch die Spaltennummern angeben – praktisch bei berechneten Spalten, deren Namen man sonst wiederholen müsste.
LIMIT – nur ein Ausschnitt
SELECT Fahrerweltmeister, WM_Punkte
FROM WMTitel
ORDER BY WM_Punkte DESC
LIMIT 3; -- nur die ersten drei
LIMIT 4, 3; -- vier ueberspringen, dann drei nehmen
Bei zwei Zahlen ist die erste der Startpunkt und die
zweite die Anzahl. LIMIT 4, 3 liefert also die Zeilen 5, 6
und 7. Gezählt wird ab 0, wie bei Arrays.
LIMIT ergibt fast nur zusammen mit ORDER BY
Sinn. Ohne Sortierung sind „die ersten drei" eine willkürliche Auswahl,
die sich jederzeit ändern kann.
Die Reihenfolge der Klauseln
SELECT ...
FROM ...
WHERE ...
ORDER BY ...
LIMIT ...
Diese Reihenfolge ist Pflicht. ORDER BY vor
WHERE zu schreiben ist ein Syntaxfehler. Merken kann man es
sich daran, dass es der Reihenfolge entspricht, in der die Datenbank
arbeitet: erst Tabelle nehmen, dann Zeilen filtern, dann sortieren, dann
abschneiden.