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:
![](https://cdn.codegym.cc/images/article/66aba568-a02a-45e0-9939-6beebbb190ed/512.jpeg)
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:![](https://cdn.codegym.cc/images/article/d3cc4f4a-b340-4b3a-9ae0-3e38eca36bb2/512.jpeg)
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.
GO TO FULL VERSION