Zum Hauptinhalt springen

3) Joins

Um den komplexeren Join ab zu bilden, brauchen wir eine Datenbank mit mehreren Tabellen, bzw. mehreren Entities. Ich habe das folgende ER-Diagramm in meiner MariaDB Datenbank gebaut:

er_busunternehmen

Primary Key zuweisen

Das umsetzen des ER-Diagramms in die Datenbank funktioniert ähnlich wie beim bauen der ersten Datenbank, beschrieben unter Voraussetzungen, jedoch spielen nun Primary Keys (Auch Primärschlüssel) eine Rolle. Diese werden in einer Tabelle mit folgendem Befehl zugewiesen:

Bestehende Tabelle
MariaDB [busunternehmen]> SHOW COLUMNS FROM fahrer;
+------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+-------+
| Ort | text | YES | | NULL | |
| PLZ | int(11) | YES | | NULL | |
| StrasseNr | text | YES | | NULL | |
| Name | text | YES | | NULL | |
| Vorname | text | YES | | NULL | |
| Telefon | text | YES | | NULL | |
| PersonalNr | int(11) | YES | | NULL | |
+------------+---------+------+-----+---------+-------+
7 rows in set (0.006 sec)
Primary Key zuweisen
MariaDB [busunternehmen]> ALTER TABLE fahrer ADD CONSTRAINT PersonalNr PRIMARY KEY (PersonalNr);
Ergebnis
MariaDB [busunternehmen]> SHOW COLUMNS FROM fahrer;
+------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+-------+
| Ort | text | YES | | NULL | |
| PLZ | int(11) | YES | | NULL | |
| StrasseNr | text | YES | | NULL | |
| Name | text | YES | | NULL | |
| Vorname | text | YES | | NULL | |
| Telefon | text | YES | | NULL | |
| PersonalNr | int(11) | NO | PRI | NULL | |
+------------+---------+------+-----+---------+-------+
7 rows in set (0.006 sec)

Da es zu aufwendig wäre, das gesamte ER-Diagramm in der Datenbank ab zu bilden und die Daten ein zu fügen, habe ich nur die Entities 'Fahrer' und 'Fahrt' aufgebaut. Hier die Daten

Fahrer
MariaDB [busunternehmen]> SELECT * FROM Fahrer;
+-------+------+------------------------+---------+---------+--------------+------------+
| Ort | PLZ | StrasseNr | Name | Vorname | Telefon | PersonalNr |
+-------+------+------------------------+---------+---------+--------------+------------+
| 69546 | 0 | Maintalstr 5 | Meier | Manfred | 06958/512385 | 1 |
| 69553 | 0 | Neue Str 3 | M?ller | Doris | 06253/654127 | 2 |
| 66659 | 0 | Erfelderstr 136 | Scharf | Wilhelm | 06157/12399 | 3 |
| 64297 | 0 | Seeheimerstr 24 | Niemand | Josef | 06151/517989 | 4 |
| 64342 | 0 | Friedrich-Ebert-Str 55 | Grieser | Bianca | 06257/095509 | 5 |
| 64287 | 0 | Heinrichstr 174 | Mayer | Daniel | 06151/18564 | 6 |
+-------+------+------------------------+---------+---------+--------------+------------+
6 rows in set (0.000 sec)
Fahrt
MariaDB [busunternehmen]> SELECT * FROM Fahrt;
+---------+-------------+------------+------------+-------+-------+------------+------------+
| FahrtNr | Kennzeichen | PersonalNr | Datum | Preis | Dauer | Reisestart | Reiseziel |
+---------+-------------+------------+------------+-------+-------+------------+------------+
| 1 | MA-IN 248 | 2 | 2013-06-21 | 85 | 50 | Mannheim | Mannheim |
| 2 | MA-IN 248 | 3 | 2014-03-13 | 32 | 540 | Bern | Berlin |
| 3 | DA-AB 123 | 4 | 2012-06-18 | 31 | 330 | M?nchen | Dortmund |
| 4 | HH-BV 775 | 1 | 2014-04-12 | 199 | 2400 | Madrid | Moskau |
| 5 | F-AZ 1234 | 2 | 2015-01-04 | 24 | 240 | Jena | K?ln |
| 6 | DA-KK 007 | 6 | 2013-08-08 | 64 | 600 | Darmstadt | Cannes |
| 7 | F-FH 1059 | 5 | 2014-03-28 | 33 | 300 | Worms | Hamburg |
| 8 | F-AZ 1234 | 4 | 2013-08-18 | 52 | 840 | Florenz | Darmstadt |
+---------+-------------+------------+------------+-------+-------+------------+------------+
8 rows in set (0.000 sec)

Nun können wir die erste Abfrage mit einem Join stellen. Wir schauen nun, welcher Fahr welche Personalnummer zugewiesen ist und zu welchem Fahrer diese Personalnummer passt. Um die Syntax eines Joins zu verstehen, selektiert man mit dem FROM-Befehl alle Tabellen die betrachtet werden und muss bei dem WHERE-Befehl anstelle nur der Attribute noch die Tabelle aus der diese Attribute stammen angeben. Dies wird einfach durch einen Punkt zwischen Tabelle und Attribut umgesetzt. In etwa so:

WHERE [Tabelle].[Attribut]

Hier die tatsächliche Abfrage:

MariaDB [busunternehmen]> SELECT *
-> FROM fahrer, fahrt
-> WHERE fahrer.PersonalNr = fahrt.PersonalNr;
+-------+------+------------------------+---------+---------+--------------+------------+---------+-------------+------------+------------+-------+-------+------------+------------+
| Ort | PLZ | StrasseNr | Name | Vorname | Telefon | PersonalNr | FahrtNr | Kennzeichen | PersonalNr | Datum | Preis | Dauer | Reisestart | Reiseziel |
+-------+------+------------------------+---------+---------+--------------+------------+---------+-------------+------------+------------+-------+-------+------------+------------+
| 69553 | 0 | Neue Str 3 | M?ller | Doris | 06253/654127 | 2 | 1 | MA-IN 248 | 2 | 2013-06-21 | 85 | 50 | Mannheim | Mannheim |
| 66659 | 0 | Erfelderstr 136 | Scharf | Wilhelm | 06157/12399 | 3 | 2 | MA-IN 248 | 3 | 2014-03-13 | 32 | 540 | Bern | Berlin |
| 64297 | 0 | Seeheimerstr 24 | Niemand | Josef | 06151/517989 | 4 | 3 | DA-AB 123 | 4 | 2012-06-18 | 31 | 330 | M?nchen | Dortmund |
| 69546 | 0 | Maintalstr 5 | Meier | Manfred | 06958/512385 | 1 | 4 | HH-BV 775 | 1 | 2014-04-12 | 199 | 2400 | Madrid | Moskau |
| 69553 | 0 | Neue Str 3 | M?ller | Doris | 06253/654127 | 2 | 5 | F-AZ 1234 | 2 | 2015-01-04 | 24 | 240 | Jena | K?ln |
| 64287 | 0 | Heinrichstr 174 | Mayer | Daniel | 06151/18564 | 6 | 6 | DA-KK 007 | 6 | 2013-08-08 | 64 | 600 | Darmstadt | Cannes |
| 64342 | 0 | Friedrich-Ebert-Str 55 | Grieser | Bianca | 06257/095509 | 5 | 7 | F-FH 1059 | 5 | 2014-03-28 | 33 | 300 | Worms | Hamburg |
| 64297 | 0 | Seeheimerstr 24 | Niemand | Josef | 06151/517989 | 4 | 8 | F-AZ 1234 | 4 | 2013-08-18 | 52 | 840 | Florenz | Darmstadt |
+-------+------+------------------------+---------+---------+--------------+------------+---------+-------------+------------+------------+-------+-------+------------+------------+
8 rows in set (0.000 sec)

In einem weiteren Beispiel möchten wir herausfinden wann ein Fahrer gefahren ist und nutzen dafür einen Join:

MariaDB [busunternehmen]> SELECT Fahrer.Vorname, Fahrer.Name, Fahrt.Datum
-> FROM Fahrt, Fahrer
-> WHERE Fahrt.PersonalNr = Fahrer.PersonalNr;
+---------+---------+------------+
| Vorname | Name | Datum |
+---------+---------+------------+
| Doris | M?ller | 2013-06-21 |
| Wilhelm | Scharf | 2014-03-13 |
| Josef | Niemand | 2012-06-18 |
| Manfred | Meier | 2014-04-12 |
| Doris | M?ller | 2015-01-04 |
| Daniel | Mayer | 2013-08-08 |
| Bianca | Grieser | 2014-03-28 |
| Josef | Niemand | 2013-08-18 |
+---------+---------+------------+
8 rows in set (0.000 sec)

Diese Joins können beliebig durch mehr Tabellen erweitert werden um komplexere Sachverhalte ab zu bilden. Natürlich kann die Join-Funktion auch mit vorherigen Befehlen kombiniert werden um z.B. die Ergebnisse zu sortieren usw.

Verschiedene Joins

joins_typen