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.