Zurück zur Artikelliste Artikel
8 Leseminuten

Wie man nicht übereinstimmende Zeilen behält, wenn man zwei Tabellen in SQL verbindet

Lernen Sie, wie Sie JOIN verwenden, um sowohl übereinstimmende als auch nicht übereinstimmende Zeilen zu behalten, wenn Sie zwei Tabellen verbinden.

Das Verknüpfen von zwei oder mehr Tabellen ist eine Fähigkeit, die Sie häufig benötigen, wenn Sie mit Datenbanken arbeiten. Um Ihre SQL-Verbindungsfähigkeiten zu überprüfen und zu üben, empfehle ich den interaktiven SQL-JOINs Kurs. Er enthält über 90 Übungen und Abschnitte zu verschiedenen Joining-Herausforderungen.

Wenn Sie häufig Tabellen in SQL verknüpfen, haben Sie wahrscheinlich festgestellt, dass nicht immer alle Daten aus einer Tabelle mit den Daten aus einer anderen Tabelle übereinstimmen. Manchmal benötigen Sie nur die Daten, die in beiden Tabellen übereinstimmen. Und manchmal müssen Sie auch die nicht übereinstimmenden Zeilen behalten. Wie machen Sie das in einer JOIN?

Durch welchen JOIN erhalten Sie die nicht übereinstimmenden Zeilen?

Sie wissen das wahrscheinlich schon, aber es lohnt sich, es zu wiederholen. Der Zweck von JOIN ist es, die Daten aus zwei oder mehr Tabellen zu erhalten. Sie verbinden sie über die gemeinsame(n) Spalte(n) miteinander.

Die vier Haupttypen von JOINs sind:

  • (INNER) JOIN.
  • LEFT (OUTER) JOIN.
  • RIGHT (OUTER) JOIN.
  • FULL (OUTER) JOIN.

Wenn Sie eine einfache (INNER) JOIN verwenden, erhalten Sie nur die Zeilen, die in beiden Tabellen übereinstimmen. Die Abfrage gibt keine nicht übereinstimmenden Zeilen in irgendeiner Form zurück.

Wenn Sie dies nicht wünschen, besteht die Lösung darin, LEFT JOIN, RIGHT JOIN oder FULL JOIN zu verwenden, je nachdem, was Sie sehen möchten.

Wenn Sie noch nicht mit JOIN vertraut sind, finden Sie hier eine ausführliche Erklärung aller JOIN-Typen. Sie können auch ein SQL JOIN Cheat Sheet in der Nähe haben, um Ihnen mit der JOIN Syntax und Verwendung zu helfen.

Lernen Sie die Daten kennen

Die Daten, mit denen wir arbeiten werden, bestehen aus zwei Tabellen:

  • employee.
  • project.

Die Tabelle employee hat vier Spalten:

  • id: Die ID des Mitarbeiters; sie ist der Primärschlüssel (PK) der Tabelle.
  • first_name: Dem Vornamen des Mitarbeiters.
  • last_name: Nachname des Mitarbeiters.
  • project_id: Die ID des Projekts und der Fremdschlüssel (FK) der Tabelle, die sich auf eine andere Tabelle namens project.

So sehen die Daten aus der Tabelle aus employee aussehen:

idfirst_namelast_nameproject_id
1IngaDansken1
2RosinaSneezem5
3DarRisbie4
4LyneaBraveyNULL
5AlanahAbrashkov4
6EmmitJaime4
7KarrieLatek5
8GarrettCreginNULL
9CecilioZiemkeNULL
10MalanieChapellow1
11FraydaPinkett1
12MaddiMullissNULL
13BlaneTue5
14CarverVeighey5
15ChristosManleyNULL

Es gibt zwei Spalten in der Tabelle project:

  • id: Die ID des Projekts; sie ist der Primärschlüssel (PK) der Tabelle.
  • project_name: Der Name des Projekts.

Und das sind die Daten aus der Tabelle:

idproject_name
1Reporting Process
2Database Enhancement
3Sales Boosting
4Employee Satisfaction
5IT Security
6Diversity Program
7Policies & Procedures
8Social Media Visibility
9Mobile Banking
10Education

Was passiert, wenn Sie den INNER JOIN verwenden?

Um die Namen der Mitarbeiter und die Projekte, an denen sie arbeiten, mit Hilfe von INNER JOIN zu erhalten, müssen Sie den folgenden Code schreiben:

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
JOIN project p
  ON e.project_id = p.id;

Hinweis: Natürlich können Sie entweder JOIN oder INNER JOIN als Schlüsselwort verwenden - sie sind gleichwertig.

So sieht das Ergebnis aus:

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security

Das Ergebnis zeigt nur die Zeilen aus der Tabelle employee die mit den Zeilen in der Tabelle project. Mit anderen Worten, der Code liefert nur die Mitarbeiter, denen ein Projekt zugewiesen wurde. Dies bedeutet jedoch, dass jede Tabelle Zeilen enthalten kann, die nicht mit der anderen Tabelle übereinstimmen. Es kann einige Mitarbeiter geben, die keinem Projekt zugeordnet sind, und es kann einige Projekte geben, denen keine Mitarbeiter zugeordnet sind.

Wie erhalten Sie auch die nicht übereinstimmenden Zeilen?

Alle übereinstimmenden und nicht übereinstimmenden Zeilen aus einer Tabelle abrufen

Um alle Zeilen aus nur einer der Tabellen zu erhalten - sowohl die übereinstimmenden als auch die nicht übereinstimmenden Zeilen - müssen Sie LEFT JOIN oder RIGHT JOIN verwenden. Welches Programm Sie verwenden sollten, hängt davon ab, aus welcher Tabelle Sie die nicht übereinstimmenden Zeilen erhalten möchten. Die LEFT JOIN wird dies aus der linken Tabelle tun, die RIGHT JOIN aus der rechten. Lassen Sie mich Ihnen zeigen, was das in der Praxis bedeutet.

Verwendung des LEFT JOIN

Um sowohl die übereinstimmenden als auch die nicht übereinstimmenden Zeilen aus einer Tabelle mit LEFT JOIN zu erhalten, müssen Sie diesen Code schreiben:

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
LEFT JOIN project p
  ON e.project_id = p.id;

Es ist fast derselbe Code wie im vorherigen Beispiel. Der einzige Unterschied ist, dass das Schlüsselwort LEFT JOIN anstelle von JOIN verwendet wird. Dadurch erhalten Sie alle Daten aus der linken Tabelle (employee) und alle passenden Daten aus der rechten Tabelle (project). Wenn es keine übereinstimmenden Daten in der Tabelle projectbefinden, erhalten Sie die Werte von NULL., aber immer noch alle Werte aus der Tabelle employee. Überzeugen Sie sich selbst:

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
ChristosManleyNULL
MaddiMullissNULL
CecilioZiemkeNULL
GarrettCreginNULL
LyneaBraveyNULL

Wie können Sie diese Daten interpretieren? Sie haben alle Mitarbeiter und die Projekte, an denen sie arbeiten. Wenn in der Spalte project_name der Wert NULL steht, bedeutet dies, dass der betreffende Mitarbeiter an keinem Projekt arbeitet.

Verwendung des RIGHT JOIN

Schreiben wir nun denselben Code mit RIGHT JOIN anstelle von LEFT JOIN.

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
RIGHT JOIN project p
  ON e.project_id = p.id;

Es ist ein Spiegelbild des vorherigen Codes. Es werden alle Daten aus der rechten Tabelle zurückgegeben, projectund nur die passenden Zeilen aus der linken Tabelle, employee. Wenn es keine übereinstimmenden Daten aus der Tabelle employeegibt, werden die Werte NULL sein.

Dies ist das Abfrageergebnis:

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
NULLNULLDatabase Enhancement
NULLNULLSales Boosting
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
NULLNULLDiversity Program
NULLNULLPolicies & Procedures
NULLNULLSocial Media Visibility
NULLNULLMobile Banking
NULLNULLEducation

Diese Daten zeigen nun alle Projekte, die in der Tabelle vorhanden sind project. Wenn die Spalten first_name und last_name NULL sind, bedeutet dies, dass kein Mitarbeiter an diesem Projekt arbeitet.

Erhält man mit dem FULL JOIN alle übereinstimmenden und nicht übereinstimmenden Zeilen?

Ich denke, dass die Abfrage mit dem FULL JOIN und ihr Ergebnis für sich selbst sprechen werden. Schauen wir uns an, was sie bewirkt. Erstens, die Abfrage:

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
FULL JOIN project p
  ON e.project_id = p.id;

Auch hier ist der einzige Unterschied zu den vorherigen Abfragen die Art der verwendeten Verknüpfung. Alles andere ist identisch. Diese FULL JOIN Abfrage gibt die folgenden Daten zurück:

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
NULLNULLDatabase Enhancement
NULLNULLSales Boosting
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
NULLNULLDiversity Program
NULLNULLPolicies & Procedures
NULLNULLSocial Media Visibility
NULLNULLMobile Banking
NULLNULLEducation
ChristosManleyNULL
MaddiMullissNULL
CecilioZiemkeNULL
GarrettCreginNULL
LyneaBraveyNULL

Schauen wir uns die Daten ein wenig an. Es gibt Zeilen, die in beiden Tabellen zu finden sind. Es gibt jedoch Zeilen aus der Tabelle employee die keine entsprechenden Zeilen in der Tabelle project. Sie erkennen diese Zeilen an den Werten von NULL in der Spalte project_name. Es gibt auch Zeilen aus der Tabelle project die keine entsprechenden Zeilen in der Tabelle employee. Auch hier befinden sich die Werte von NULL. Diesmal stehen die NULLs in den Spalten first_name und last_name.

Wann wird welcher JOIN verwendet?

Nachdem Sie nun gesehen haben, was jede JOIN zurückgibt, lassen Sie uns klären, was jede JOIN tut.

Die Abfrage JOIN oder INNER JOIN gibt überhaupt keine nicht übereinstimmenden Zeilen zurück. Es werden nur die Zeilen zurückgegeben, die in den beiden Tabellen, die Sie verknüpfen, übereinstimmen. Wenn Sie alle nicht übereinstimmenden Zeilen erhalten wollen, sollten Sie sie nicht verwenden.

Mit LEFT JOIN und RIGHT JOIN erhalten Sie sowohl übereinstimmende als auch nicht übereinstimmende Zeilen. Sie müssen jedoch darauf achten, aus welcher Tabelle Sie die nicht übereinstimmenden Zeilen erhalten. Je nach Bedarf verwenden Sie entweder LEFT JOIN oder RIGHT JOIN. Beide liefern Ihnen alle Zeilen aus einer Tabelle (übereinstimmende und nicht übereinstimmende) und alle übereinstimmenden Zeilen aus der anderen Tabelle. Wenn keine übereinstimmenden Zeilen in der anderen Tabelle gefunden werden, zeigen die Spalten der anderen Tabelle NULL Werte an.

Mit FULL JOIN erhalten Sie alle Daten aus allen Tabellen, die Sie verknüpfen. Es ist wie die Kombination aller drei obigen Joins. Sie erhalten alle übereinstimmenden Zeilen wie bei der Verwendung von INNER JOIN. Sie erhalten auch nicht übereinstimmende Zeilen aus der linken und der rechten Tabelle. Es ist so, als ob Sie die LEFT JOIN und die RIGHT JOIN gleichzeitig verwenden würden.

Hier sind einige weitere Beispiele, um das Verbinden von Tabellen zu üben.

Lernen Sie die verschiedenen JOIN-Typen kennen, damit Sie den richtigen auswählen können!

Wie Sie sehen, ist es sehr nützlich zu wissen, wie diese JOINs funktionieren. Sie ermöglichen es Ihnen, zwei oder mehr Tabellen zu verbinden und verschiedene Kombinationen von Daten aus jeder Tabelle zu erhalten. Es gibt keinen Unterschied in der Art, wie Sie den Code schreiben. Das Einzige, was sich ändert, ist das Schlüsselwort, das Sie verwenden, je nachdem, welche Art von JOIN Sie benötigen. Es ist wirklich wichtig zu verstehen, welche Daten jede dieser JOINs zurückgibt.

Um diese Fähigkeit zu beherrschen und zu üben, brauchen Sie den Kurs SQL für Anfänger und den Kurs SQL JOINs! Wenn Sie Ratschläge brauchen, wie Sie JOINs üben können, finden Sie hier einige Tipps.