In diesem Kapitel lernst du, wie du MySQL-Datenbanken abfragen kannst. Dazu verwenden wir SQL, die Structured Query Language. Wir beginnen mit einfachen Abfragen und kombinieren die einzelnen Bausteine anschließend zu eigenen Fragen an die Daten.
Stelle zuerst sicher, dass du keinen Ordner geöffnet hast. Um sicherzugehen, drücke einfach den Shortcut für »Ordner schließen«: StrgK und dann F. Dein Workspace sollte jetzt ungefähr so aussehen:

Wir erstellen nun ein Verzeichnis für unser MySQL-Experiment. Klicke dazu auf »Open Folder« und gib mysql-terra ein:

Da das Verzeichnis noch nicht existiert, wirst du gefragt, ob das Verzeichnis erstellt werden soll. Bestätige die Frage mit Enter:

Öffne anschließend das Terminal:


Du kannst das Terminal auch maximieren, indem du auf das Symbol in der rechten oberen Ecke des Terminals klickst.
Um MySQL kennenzulernen, benötigen wir eine Datenbank. Wir verwenden die Beispieldatenbank terra1, die du dir herunterladen kannst, indem du folgenden Befehl eingibst:
wget https://github.com/specht/workspace-files/raw/main/terra1.sql
Die Ausgabe sollte in etwa so aussehen:

Klicke auf die Datei, um sie zu öffnen. Es befinden sich Daten zu Ländern und Städten darin.

Um die Beispieldatenbank in MySQL zu importieren, gib einfach den folgenden Befehl ein:
mysql < terra1.sql
Der Import geht relativ schnell und wenn alles geklappt hat, solltest du keine Ausgabe sehen:

Um mit MySQL zu arbeiten, verwenden wir mycli, einen MySQL-Client, der speziell für die Kommandozeile entwickelt wurde. Starte mycli, indem du den folgenden Befehl eingibst:
mycli
Die Ausgabe sollte in etwa so aussehen:

Um dir die Tabellen in der Datenbank anzeigen zu lassen, gib den Befehl SHOW TABLES; ein und drücke Enter:

Du siehst die beiden Tabellen land und ort.
Mit DESCRIBE kannst du untersuchen, welche Spalten eine Tabelle besitzt:
DESCRIBE land;

Jede Spalte hat einen Namen und einen Datentyp. So erkennst du, welche Informationen in der Tabelle gespeichert werden.
ort – welche Spalten gibt es und welche Datentypen haben sie?
Mit SELECT fragst du Daten aus einer Tabelle ab. Ein Stern * steht dabei für alle Spalten:
SELECT * FROM land;

Du siehst nun alle Einträge in der Tabelle land. Eine Zeile entspricht einem Land in der Tabelle. Nutze die Pfeiltasten ←↑→↓ sowie Bild↑Bild↓, um durch die Ausgabe zu navigieren.
mycli die Ausgabe seitenweise an. Drücke Q, um zur SQL-Eingabe zurückzukehren.
Meistens brauchst du nicht alle Spalten. Schreibe die gewünschten Spaltennamen hinter SELECT, zum Beispiel:
SELECT name, hauptstadt FROM land;

Mit WHERE wählst du nur die Zeilen aus, die eine Bedingung erfüllen:
SELECT * FROM land WHERE name = 'Deutschland';

Texte stehen in SQL in einfachen Anführungszeichen, zum Beispiel 'Deutschland'.
Bedingungen lassen sich kombinieren. Mit AND müssen beide Bedingungen erfüllt sein:
SELECT * FROM land WHERE einwohner < 5 AND flaeche > 1000000;

Das Ergebnis enthält genau die Länder, die beide Bedingungen erfüllen. Mit OR genügt dagegen eine der Bedingungen, zum Beispiel:
SELECT name FROM land WHERE kontinent = 'Europa' OR kontinent = 'Asien';

Mit ORDER BY sortierst du ein Abfrageergebnis. Ohne weitere Angabe wird aufsteigend sortiert:
SELECT * FROM land ORDER BY einwohner;

Für eine absteigende Sortierung ergänzt du DESC:
SELECT * FROM land ORDER BY einwohner DESC;

Mit LIMIT begrenzt du die Anzahl der ausgegebenen Zeilen:
SELECT * FROM land LIMIT 5;

ORDER BY und LIMIT lassen sich gut kombinieren. Damit kannst du zum Beispiel nach einer Spalte sortieren und anschließend nur die ersten zehn Treffer ausgeben.
COUNT(*) zählt, wie viele Zeilen ein Abfrageergebnis enthält:
SELECT COUNT(*) FROM land;

Auch COUNT kannst du mit WHERE kombinieren. So lässt sich zum Beispiel zählen, wie viele Datensätze eine bestimmte Bedingung erfüllen:
SELECT COUNT(*) FROM land WHERE kontinent = 'Asien';

Mit LIKE kannst du Text nach einem Muster durchsuchen. Das Prozentzeichen % steht dabei für beliebig viele Zeichen. Die folgende Abfrage findet Ländernamen, in denen land vorkommt:
SELECT name FROM land WHERE name LIKE '%land%' ORDER BY name;

'land%' würde dagegen nur Namen finden, die mit land beginnen, und '%land' nur Namen, die damit enden.
Wenn du nur sehen möchtest, welche verschiedenen Werte in einer Spalte vorkommen, verwendest du DISTINCT:
SELECT DISTINCT kontinent FROM land ORDER BY kontinent;

Dabei fällt etwas auf: In den Beispieldaten kommen sowohl Europa als auch Europe vor. Eine Datenbank speichert die Werte so, wie sie eingetragen wurden; uneinheitliche Daten verschwinden also nicht von selbst. Solche Auffälligkeiten lassen sich mit Abfragen entdecken.
Du kennst jetzt die wichtigsten Bausteine, die wir für die folgenden Aufgaben benötigen:
| Baustein | Bedeutung |
|---|---|
SELECT |
Welche Spalten oder berechneten Werte sollen ausgegeben werden? |
FROM |
Aus welcher Tabelle kommen die Daten? |
WHERE |
Welche Zeilen erfüllen die Bedingung? |
AND / OR
|
Wie werden mehrere Bedingungen verknüpft? |
ORDER BY |
In welcher Reihenfolge werden die Zeilen ausgegeben? |
LIMIT |
Wie viele Zeilen werden höchstens ausgegeben? |
COUNT(*) |
Wie viele Zeilen enthält das Ergebnis? |
LIKE |
Welche Texte passen zu einem Muster? |
DISTINCT |
Welche unterschiedlichen Werte kommen vor? |
Die Bausteine lassen sich kombinieren. Eine typische Abfrage kann beispielsweise filtern, sortieren und die Ausgabe anschließend begrenzen.
mycli zu beenden, gib exit ein oder verwende StrgD.
Beantworte die folgenden Fragen mit geeigneten SQL-Abfragen. Notiere jeweils deine Abfrage und das Ergebnis. Gib möglichst nur die Spalten aus, die du für die Antwort tatsächlich brauchst.
Gib alle Länder mit Name, Einwohnerzahl und Hauptstadt aus. Sortiere die Tabelle nach der Einwohnerzahl absteigend.
Wie viele Länder gibt es in der Tabelle land?
Wie viele Länder liegen in Europa? Beachte die beiden unterschiedlichen Schreibweisen, die du mit DISTINCT entdeckt hast.
Welche Länder haben die Zeichenfolge arm oder bein im Namen?
Welcher Ort hat die meisten Einwohner, wie viele Einwohner hat er und in welchem Land liegt er?
Wie viele Orte aus Frankreich sind in der Tabelle ort gespeichert?
Gib die zehn bevölkerungsreichsten Orte Frankreichs aus.
Finde jeweils drei Orte, deren Name die Zeichenfolge arm beziehungsweise bein enthält.
Welche Orte in Deutschland liegen westlich von Aachen (6,046° Ost)?