abhängige Tabelle
Lassen Sie uns nun unsere Abfragen etwas komplizieren. Fügen wir unserer Datenbank eine neue Aufgabentabelle mit Aufgaben für unsere Mitarbeiter hinzu. Und schauen wir mal, welche Einträge darin enthalten sind:
SELECT * FROM task
Das Ergebnis einer solchen Anfrage:
Ausweis | emploee_id | Name | Termin |
---|---|---|---|
1 | 1 | Beheben Sie einen Fehler im Frontend | 01.06.2022 |
2 | 2 | Beheben Sie einen Fehler im Backend | 15.06.2022 |
3 | 5 | Kaffee kaufen | 01.07.2022 |
4 | 5 | Kaffee kaufen | 01.08.2022 |
5 | 5 | Werde Kaffee kaufen | 01.09.2022 |
6 | (NULL) | Räumen Sie das Büro auf | (NULL) |
7 | 4 | Das Leben genießen | (NULL) |
8 | 6 | Das Leben genießen | (NULL) |
Diese Tabelle hat nur 4 Spalten:
- id – eindeutige Aufgabennummer (und Zeilen in der Tabelle);
- Employee_id – ID des Mitarbeiters aus der Mitarbeitertabelle, dem die Aufgabe zugewiesen ist;
- Name – Name und Beschreibung der Aufgabe;
- Frist – die Zeit, bis zu der die Aufgabe abgeschlossen sein muss.
Achten Sie auf einige Nuancen. Aufgabe N6 hat keine Employee_ID, wir haben keinen Reiniger. Die Aufgabe ist da, der Ausführende jedoch nicht. So etwas passiert.
Außerdem haben die Aufgaben 6-9 keine festgelegte Frist. Dies geschieht, wenn eine Aufgabe regelmäßig und kontinuierlich erledigt werden muss. Zum Beispiel muss das Büro jeden Tag gereinigt werden, aber man muss auch jeden Tag das Leben genießen :)
Wenn eine Tabelle IDs aus einer anderen Tabelle verwendet, wird eine solche Tabelle als abhängig bezeichnet .
Abfrage mehrerer Tabellen
Hier sehen wir in der Aufgabentabelle, dass es zwei Aufgaben „Das Leben genießen“ gibt. Woher wissen wir, wer diese Glücklichen sind?
Dazu können Sie in SQL eine Abfrage für zwei Tabellen gleichzeitig ausführen. Im Allgemeinen können Sie in SQL beliebig viele Tabellen gleichzeitig abfragen. Das allgemeine Format für eine solche Anfrage ist:
SELECT columns FROM Table 1, table 2, tableN
Wichtig! Wenn Sie eine Abfrage an mehrere Tabellen gleichzeitig schreiben, erhalten Sie als Ergebnis das sogenannte kartesische Produkt von Tabellenzeilen. Jede Zeile der ersten Tabelle wird mit jeder Zeile der zweiten Tabelle verklebt und so weiter.
Das heißt, wenn Sie 5 Zeilen in der ersten Tabelle und 10 Zeilen in der zweiten haben, dann haben Sie insgesamt 50 Zeilen. In Java würde diese Abfrage etwa so aussehen:
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
Schreiben wir unsere Abfrage gleichzeitig in zwei Tabellen und sehen, was passiert:
SELECT * FROM employee, task
Und das Ergebnis dieser Abfrage:
Ausweis | Name | Beruf | Gehalt | Alter | Ausweis | Mitarbeiter | _Ausweis | Name | Termin |
---|---|---|---|---|---|---|---|---|---|
1 | Iwanow Iwan | Programmierer | 100000 | 25 | 1 | 1 | Beheben Sie einen Fehler im Frontend | 01.06.2022 | |
2 | Petrov Petr | Programmierer | 80000 | 23 | 1 | 1 | Beheben Sie einen Fehler im Frontend | 01.06.2022 | |
3 | Iwanow Sergej | Prüfer | 40000 | dreißig | 1 | 1 | Beheben Sie einen Fehler im Frontend | 01.06.2022 | |
4 | Rabinovich Moisha | Direktor | 200000 | 35 | 1 | 1 | Beheben Sie einen Fehler im Frontend | 01.06.2022 | |
5 | Kirienko Anastasia | Büroleiter | 40000 | 25 | 1 | 1 | Beheben Sie einen Fehler im Frontend | 01.06.2022 | |
6 | Vaska | Der Kater | 1000 | 3 | 1 | 1 | Beheben Sie einen Fehler im Frontend | 01.06.2022 | |
1 | Iwanow Iwan | Programmierer | 100000 | 25 | 2 | 2 | Beheben Sie einen Fehler im Backend | 15.06.2022 | |
2 | Petrov Petr | Programmierer | 80000 | 23 | 2 | 2 | Beheben Sie einen Fehler im Backend | 15.06.2022 | |
3 | Iwanow Sergej | Prüfer | 40000 | dreißig | 2 | 2 | Beheben Sie einen Fehler im Backend | 15.06.2022 | |
4 | Rabinovich Moisha | Direktor | 200000 | 35 | 2 | 2 | Beheben Sie einen Fehler im Backend | 15.06.2022 | |
5 | Kirienko Anastasia | Büroleiter | 40000 | 25 | 2 | 2 | Beheben Sie einen Fehler im Backend | 15.06.2022 |
Wir haben insgesamt 48 Ergebniszeilen, aber hier habe ich nur 11 angegeben. Sonst ist einfach nicht genug Platz.
Achten Sie auf drei Dinge:
- Spalten mit demselben Namen: id . Dies ist die ID aus der Mitarbeitertabelle und die ID aus der Aufgabentabelle .
- Die Zeilen jeder Tabelle werden wiederholt. In der linken Spalte folgt auf die ID 6 wieder die ID = 1.
- Wir haben unsinnige Zeilen, in denen beispielsweise die ID (aus der Mitarbeitertabelle) 6 ist und in derselben Zeile die Mitarbeiter-ID 1 ist.
Bedeutungslose Zeilen entfernen
Es gibt zu viele Zeilen in unserer resultierenden Tabelle, die das kartesische Produkt aller Zeilen der beiden Tabellen Employee und Task ist.
Wenn die Zeile „employee_id“ 3 ist, sollte sie logischerweise nur bei der Zeile aus der Tabelle „employee“ bleiben, in der die id 3 ist. Versuchen wir, dieses Missverständnis mit WHERE zu beheben.
Schreiben wir eine Abfrage wie diese:
SELECT * FROM employee, task WHERE emploee.id = task.emploee_id
Und das Ergebnis dieser Abfrage:
Ausweis | Name | Beruf | Gehalt | Alter | Ausweis | emploee_id | Name | Termin |
---|---|---|---|---|---|---|---|---|
1 | Iwanow Iwan | Programmierer | 100000 | 25 | 1 | 1 | Beheben Sie einen Fehler im Frontend | 01.06.2022 |
2 | Petrov Petr | Programmierer | 80000 | 23 | 2 | 2 | Beheben Sie einen Fehler im Backend | 15.06.2022 |
4 | Rabinovich Moisha | Direktor | 200000 | 35 | 7 | 4 | Das Leben genießen | (NULL) |
5 | Kirienko Anastasia | Büroleiter | 40000 | 25 | 3 | 5 | Kaffee kaufen | 01.07.2022 |
5 | Kirienko Anastasia | Büroleiter | 40000 | 25 | 4 | 5 | Kaffee kaufen | 01.08.2022 |
5 | Kirienko Anastasia | Büroleiter | 40000 | 25 | 5 | 5 | Werde Kaffee kaufen | 01.09.2022 |
6 | Vaska | Der Kater | 1000 | 3 | 8 | 6 | Das Leben genießen | (NULL) |
Die gute Nachricht ist, dass die bedeutungslosen Zeilen verschwunden sind: Die ID aus der ersten Spalte ist immer gleich Employee_ID.
Die schlechte Nachricht ist, dass Aufgaben, die niemandem zugewiesen sind, wie zum Beispiel die Reinigung des Büros, wegfallen. Ihre Employee_ID war NULL, daher wurden sie verworfen, nachdem das WHERE erledigt war.
GO TO FULL VERSION