Die Tabelle haustier
enthält Daten zu den
Tieren, die Sie besitzen. Wollen Sie andere Informationen zu
diesen aufzeichnen – z. B. Ereignisse wie Tierarztbesuche
oder die Ankunft von Nachwuchs –, dann benötigen Sie eine
zweite Tabelle. Wie sollte diese Tabelle aussehen? Folgende
Angaben müssen enthalten sein:
Der Name des Tieres, damit Sie wissen, welches Ereignis zu welchem Tier gehört.
Das Ereignisdatum.
Ein Feld, welches das Ereignis beschreibt.
Ein Ereignistypfeld, das Sie zum Kategorisieren der Ereignisse benötigen.
Unter Berücksichtigung dieser Aspekte könnte die
CREATE TABLE
-Anweisung für die Tabelle
ereignis
wie folgt aussehen:
mysql>CREATE TABLE ereignis (name VARCHAR(20), datum DATE,
->typ VARCHAR(15), bemerkung VARCHAR(255));
Wie bei der Tabelle haustier
ist es auch
hier am einfachsten, die bereits bekannten Daten über eine
tabulatorgetrennte Textdatei in die Tabelle einzuladen. Diese
Datei soll die folgenden Informationen enthalten:
name | datum | typ | bemerkung |
Fluffy | 1995-05-15 | Nachwuchs | 4 Kätzchen, 3 weiblich, 1 männlich |
Buffy | 1993-06-23 | Nachwuchs | 5 Welpen, 2 weiblich, 3 männlich |
Buffy | 1994-06-19 | Nachwuchs | 3 Welpen, 3 weiblich |
Chirpy | 1999-03-21 | Tierarzt | Schnabel begradigt |
Slim | 1997-08-03 | Tierarzt | gebrochene Rippe |
Bowser | 1991-10-12 | Hundepension | |
Fang | 1991-10-12 | Hundepension | |
Fang | 1998-08-28 | Geburtstag | neues Kauspielzeug |
Claws | 1998-03-17 | Geburtstag | neues Flohhalsband |
Whistler | 1998-12-09 | Geburtstag | erster Geburtstag |
Laden Sie die Datensätze wie folgt:
mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE ereignis;
Mit dem, was Sie bereits aus den Abfragen erlernt haben, die
Sie zur Tabelle haustier
abgesetzt haben,
sollten Sie auch Daten aus der Tabelle
ereignis
abrufen können; die Prinzipien
sind dieselben. Was aber, wenn Sie die Fragen, die Sie
stellen, mit der Tabelle ereignis
allein
nicht beantworten können?
Nehmen wir an, Sie wollen herausfinden, in welchem Alter die
jeweiligen Tiere Nachwuchs bekommen haben. Wir haben bereits
weiter oben gesehen, wie Sie das Alter auf der Grundlage
zweiter Datumsangaben berechnen. Das Datum, an dem die Mutter
ihren Nachwuchs auf die Welt gebracht hat, ist in der Tabelle
ereignis
gespeichert, aber um das Alter der
Mutter am Tag der Niederkunft zu ermitteln, benötigen Sie das
Geburtsdatum, welches wiederum in der Tabelle
haustier
abgelegt ist. Das bedeutet, dass
wir zwei Tabellen benötigen:
mysql>SELECT haustier.name,
->(YEAR(datum)-YEAR(geburtstag)) - (RIGHT(datum,5)<RIGHT(geburtstag,5)) AS tieralter,
->bemerkung
->FROM haustier, ereignis
->WHERE haustier.name = ereignis.name AND ereignis.typ = 'Nachwuchs';
+--------+-----------+-------------------------------------+ | name | tieralter | bemerkung | +--------+-----------+-------------------------------------+ | Fluffy | 2 | 4 Kätzchen, 3 weiblich, 1 männlich | | Buffy | 4 | 5 Welpen, 2 weiblich, 3 männlich | | Buffy | 5 | 3 Welpen, 3 weiblich | +--------+-----------+-------------------------------------+
Bei dieser Abfrage fällt Verschiedenes auf:
Die FROM
-Klausel listet zwei Tabellen
auf, da die Abfrage Informationen aus beiden Tabellen
abrufen muss.
Wenn Sie Daten aus mehreren Tabellen kombinieren
(verknüpfen), dann müssen Sie angeben, wie die
Datensätze der einen Tabelle denen der anderen Tabelle
zugeordnet werden können. Dies ist recht einfach, da
beide Tabellen eine Spalte name
haben.
Die Abfrage verwendet eine
WHERE
-Klausel zur Zuordnung von
Datensätzen der beiden Tabellen basierend auf den Werten
in der Spalte name
.
Da die Spalte name
in beiden Tabellen
auftritt, müssen Sie bei Bezugnahme auf diese Spalte
angeben, welche der beiden Tabellen Sie meinen. Dies
erfolgt durch Voranstellung des Tabellennamens vor den
Spaltennamen.
Um eine solche Verknüpfung – einen Join – durchzuführen,
brauchen Sie keine zwei Tabellen. Manchmal ist es nützlich,
eine Tabelle mit sich selbst zu verknüpfen, wenn man etwa
Datensätze in einer Tabelle mit anderen Datensätzen in
derselben Tabelle vergleichen will. Um beispielsweise
Zuchtmöglichkeiten unter Ihren Tieren auszuloten, kann eine
Verknüpfung der Tabelle haustier
mit sich
selbst praktisch sein, um passende Männchen und Weibchen
einer Tierart zu ermitteln:
mysql>SELECT p1.name, p1.geschlecht, p2.name, p2.geschlecht, p1.gattung
->FROM haustier AS p1, haustier AS p2
->WHERE p1.gattung = p2.gattung AND p1.geschlecht = 'w' AND p2.geschlecht = 'm';
+--------+------------+--------+------------+---------+ | name | geschlecht | name | geschlecht | gattung | +--------+------------+--------+------------+---------+ | Fluffy | w | Claws | m | Katze | | Buffy | w | Fang | m | Hund | | Buffy | w | Bowser | m | Hund | +--------+------------+--------+------------+---------+
In dieser Abfrage geben Sie Aliase für den Tabellennamen an, um auf die Spalten Bezug zu nehmen und klar zu machen, welcher Tabelleninstanz die Bezugnahme auf eine Spalte zuzuordnen ist.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.