Q2 Datenbanken

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.

Die Aufgabenstellung lautet

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 Lektion 1 selbst liegt auf der Tutorial-Seite (luo-darmstadt.de/sqltutorial) und ist im OneNote nicht abgedruckt. Hier steht die geforderte Zusammenfassung – die Lektion durcharbeiten musst du dort selbst.

Die Beispieltabelle

Alle Beispiele laufen auf der Tabelle WMTitel mit den Formel-1-Weltmeistern:

WMTitel(Saison, Fahrerweltmeister, KonstrukteursWM, WM_Punkte, Team_Punkte)

Der Grundaufbau

SQL
/* meininfokurs.cmrg.site */
-- 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

OperatorBedeutung
=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

PlatzhalterBedeutung
%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.

Microsoft Access benutzt statt % 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;
ZusatzBedeutung
ASCaufsteigend – A bis Z, kleine Zahlen zuerst. Das ist der Standard, man kann es weglassen.
DESCabsteigend

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.

Aufgabe suchen

Tippe los. Strg+K öffnet die Suche von überall.

Zuletzt angesehen

Werbung