Gründe für OUTER JOIN

Erinnern Sie sich übrigens daran, als wir unsere Tabellenkalkulationen zusammenführten und unsere Büroreinigungsaufgaben verschwanden, weil es noch keine Reinigungskraft gab?

Wenn Sie eine Abfrage wie diese ausführen:

SELECT * FROM task

Dann erhalten wir dieses Ergebnis:

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)

Die Aufgabe „Büro räumen“ verschwindet, wenn wir versuchen, die Aufgabentabelle über die Mitarbeiter-ID mit der Mitarbeitertabelle zu verbinden.

Um dieses Problem zu lösen, wurden dem JOIN-Operator verschiedene Modifikatoren hinzugefügt, die es ermöglichen, solche verwaisten Zeilen paarweise in einer anderen Tabelle zu speichern.

Ich möchte Sie an die klassische Form des JOIN-Operators erinnern:

table 1 JOIN table 2 ON condition

Wir können SQL Server anweisen, sicherzustellen, dass alle Daten aus der linken Tabelle (Tabelle1) in der verbundenen Tabelle vorhanden sind. Auch wenn in der richtigen Tabelle kein Paar für sie vorhanden ist. Dazu müssen Sie nur schreiben:

table 1 LEFT JOIN table 2 ON condition

Wenn Sie möchten, dass die verknüpfte Tabelle alle Zeilen der rechten Tabelle enthält , müssen Sie Folgendes schreiben:

table 1 RIGHT JOIN table 2 ON
 condition

Schreiben wir eine Abfrage, die alle Aufgaben und Mitarbeiter zusammenfasst, damit Aufgaben ohne Ausführenden nicht verloren gehen. Schreiben Sie dazu eine Abfrage:

SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id

Und das Ergebnis dieser Abfrage:

Ausweis Name Beruf Gehalt Alter Beitrittsdatum Ausweis emploee_id Name
1 Iwanow Iwan Programmierer 100000 25 30.06.2012 1 1 Beheben Sie einen Fehler im Frontend
2 Petrov Petr Programmierer 80000 23 12.08.2013 2 2 Beheben Sie einen Fehler im Backend
4 Rabinovich Moisha Direktor 200000 35 12.05.2015 7 4 Das Leben genießen
5 Kirienko Anastasia Büroleiter 40000 25 10.10.2015 3 5 Kaffee kaufen
5 Kirienko Anastasia Büroleiter 40000 25 10.10.2015 4 5 Kaffee kaufen
5 Kirienko Anastasia Büroleiter 40000 25 10.10.2015 5 5 Kaffee kaufen
6 Vaska Der Kater 1000 3 11.11.2018 8 6 Das Leben genießen
(NULL) (NULL) (NULL) (NULL) (NULL) (NULL) 6 (NULL) Räumen Sie das Büro auf

Zu unserer Tabelle wurde eine weitere Zeile hinzugefügt, die interessanterweise viele NULL-Werte enthält. Alle Daten, die aus der Mitarbeitertabelle entnommen wurden, werden als NULL angezeigt, da es für die Aufgabe „Büro aufräumen“ keinen Ausführenden aus der Mitarbeitertabelle gab.

JOIN-Typen

Insgesamt gibt es 4 Arten von JOINs. Sie sind in der folgenden Tabelle aufgeführt:

Kurzer Eintrag langer Eintrag Erläuterung
1 VERBINDEN INNER JOIN Nur Datensätze, die in den Tabellen A und B enthalten sind
2 LINKS BEITRETEN LINKE ÄUSSERE VERBINDUNG Alle Zeilen ohne Paar aus Tabelle A müssen sein
3 RICHTIG BEITRETEN RECHTER ÄUSSERER JOIN Alle Zeilen ohne Paar aus Tabelle B müssen sein
4 ÄUSSERER JOIN VOLLSTÄNDIGE ÄUSSERE VERBINDUNG Alle Reihen von Basenpaaren aus den Tabellen A und B müssen sein

Wenn wir Tabellen der Einfachheit halber als Mengen darstellen, kann JOIN als Bild angezeigt werden:

Schnittmenge festlegen bedeutet, dass es für eine Tabelle einen entsprechenden Datensatz aus einer anderen Tabelle gibt, auf den sie verweist.

Frage aus dem Interview

Manchmal werden unerfahrene Programmierer bei einem Vorstellungsgespräch mit einer sehr einfachen Frage bombardiert. Anhand unserer Tabellen lässt es sich wie folgt formulieren:

„Schreiben Sie eine Abfrage, die eine Liste aller Mitarbeiter anzeigt, für die keine Aufgaben vorhanden sind .“ Versuchen wir zunächst, diese Frage etwas umzuformulieren: „Schreiben Sie eine Abfrage, die eine Liste aller Mitarbeiter aus der Mitarbeitertabelle anzeigt, für die es keine Aufgaben in der Aufgabentabelle gibt .“ Wir müssen dieses Set besorgen:

Es gibt viele Möglichkeiten, dieses Problem zu lösen, aber ich beginne mit der einfachsten: Zuerst können Sie unsere Tabellen mit einem LEFT JOIN verbinden und dann WHERE verwenden, um alle Zeilen auszuschließen, für die die fehlenden Daten mit NULL-Werten aufgefüllt wurden.

SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

Und das Ergebnis dieser Abfrage:

Ausweis Name Beruf Gehalt Alter Beitrittsdatum Ausweis emploee_id Name
3 Iwanow Sergej Prüfer 40000 dreißig 01.01.2014 (NULL) (NULL) (NULL)

Der einzige Nachteil dieser Lösung besteht darin, dass hier die Zeilen in der Tabelle NULL enthalten und wir gemäß der Bedingung eine Liste der Mitarbeiter anzeigen müssen.

Dazu müssen Sie entweder die benötigten Spalten der Mitarbeitertabelle in SELECT auflisten, oder wenn Sie alle anzeigen müssen, können Sie die folgende Konstruktion schreiben:

SELECT e.* FROM employee e, task t 

Die vollständige Anfrage sieht folgendermaßen aus:

SELECT e.*  
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

das Ergebnis dieser Abfrage:

Ausweis Name Beruf Gehalt Alter Beitrittsdatum
3 Iwanow Sergej Prüfer 40000 dreißig 01.01.2014

Die restlichen Methoden bleiben Ihnen als Hausaufgabe überlassen. Ich möchte Ihnen nicht das Vergnügen nehmen, sie selbst zu finden.