Was ist der Unterschied zwischen "INNER JOIN" und "OUTER JOIN"?


4672

Auch , wie zu tun LEFT JOIN, RIGHT JOINund FULL JOINpassen?


64
Von den Antworten und Kommentaren und ihren Referenzen unten erklärt nur eines tatsächlich, wie Venn-Diagramme die Operatoren darstellen: Der Kreisschnittbereich repräsentiert die Reihe von Zeilen in A JOIN B. Der für jeden Kreis eindeutige Bereich repräsentiert die Menge von Zeilen, die Sie erhalten, wenn Sie seine nehmen Tabellenzeilen, die nicht an A JOIN B teilnehmen, und Hinzufügen der für die andere Tabelle eindeutigen Spalten, die alle auf NULL gesetzt sind. (Und die meisten geben eine vage falsche Entsprechung der Kreise zu A und B.)
philipxy

1
Von den folgenden theoretischen Antworten zu einer realen Anwendung springen: Ich arbeite oft mit Experimentdaten und führe Benchmarks für Prozessordesigns aus. Oft möchte ich die Ergebnisse zwischen zwei oder mehr Hardwareoptionen vergleichen. INNER JOIN bedeutet, dass ich nur die Benchmarks sehe, die in allen Experimenten erfolgreich ausgeführt wurden. OUTER JOIN bedeutet, dass ich alle Experimente sehen kann, einschließlich derer, die in einigen Konfigurationen nicht ausgeführt werden konnten. Es ist wichtig, Fehler in solchen Experimenten sowie Erfolge zu sehen. Wichtig genug, dass ich PerlSQL geschrieben habe, um OUTER JOIN zu erhalten, als es vielen RDBMS fehlte
Krazy Glew

4
Es gibt bereits viele Antworten, aber ich habe dieses Tutorial nicht erwähnt. Wenn Sie Venn-Diagramme kennen, ist dies ein großartiges Tutorial: blog.codinghorror.com/a-visual-explanation-of-sql-joins Für mich ist es kurz genug, um schnell gelesen zu werden, versteht aber immer noch das gesamte Konzept und funktioniert Fälle sehr gut. Wenn Sie nicht wissen, was Venn-Diagramme sind, lernen Sie sie. Dies dauert 5-10 Minuten und hilft Ihnen, wenn Sie die Arbeit mit Sets und die Verwaltung von Vorgängen an Sets visualisieren müssen.
DanteTheSmith

15
@DanteTheSmith Nein, das hat die gleichen Probleme wie die Diagramme hier. Siehe meinen Kommentar oben zu der Frage und unten zu diesem Blog-Beitrag: "Jeff lehnt sein Blog ein paar Seiten weiter unten in den Kommentaren ab." Venn-Diagramme zeigen Elemente in Mengen. Versuchen Sie einfach, genau zu identifizieren, was die Mengen sind und was die Elemente in diesen Diagrammen sind. Die Mengen sind nicht die Tabellen und die Elemente sind nicht ihre Zeilen. Es können auch zwei beliebige Tabellen verbunden werden, sodass PKs und FKs keine Rolle spielen. Alles falsch. Sie tun genau das, was Tausende von anderen getan haben - einen bekommen vagen Eindruck man (fälschlicherweise) davon ausgeht , macht Sinn.
Philipip

3
Chris Ich empfehle Ihnen, diesen Artikel zu lesen: in Richtung datascience.com/… ... und Ihre Wahl der akzeptierten Antwort (möglicherweise in die mit dem Kopfgeld) in eine Antwort zu ändern, die keine Venn-Diagramme verwendet. Die derzeit akzeptierte Antwort führt zu viele Menschen in die Irre. Ich fordere Sie auf, dies zum Wohl unserer Gemeinschaft und zur Qualität unserer Wissensbasis zu tun.
Colm Bhandal

Antworten:


6115

Angenommen, Sie verbinden Spalten ohne Duplikate. Dies ist ein sehr häufiger Fall:

  • Eine innere Verbindung von A und B ergibt das Ergebnis von A-Schnittpunkt B, dh dem inneren Teil eines Venn-Diagrammschnittpunkts .

  • Eine äußere Verbindung von A und B ergibt die Ergebnisse der A-Vereinigung B, dh der äußeren Teile einer Venn-Diagramm-Vereinigung.

Beispiele

Angenommen, Sie haben zwei Tabellen mit jeweils einer Spalte und Daten wie folgt:

A    B
-    -
1    3
2    4
3    5
4    6

Es ist zu beachten, dass (1,2) für A eindeutig sind, (3,4) gemeinsam sind und (5,6) für B eindeutig sind.

Innere Verbindung

Ein innerer Join, der eine der entsprechenden Abfragen verwendet, gibt den Schnittpunkt der beiden Tabellen an, dh der beiden Zeilen, die sie gemeinsam haben.

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

Linke äußere Verbindung

Eine linke äußere Verknüpfung gibt alle Zeilen in A sowie alle gemeinsamen Zeilen in B an.

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

Rechte äußere Verbindung

Eine rechte äußere Verknüpfung gibt alle Zeilen in B sowie alle gemeinsamen Zeilen in A an.

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

Vollständige äußere Verbindung

Eine vollständige äußere Verknüpfung gibt Ihnen die Vereinigung von A und B, dh alle Zeilen in A und alle Zeilen in B. Wenn etwas in A kein entsprechendes Datum in B hat, ist der B-Teil null und umgekehrt umgekehrt.

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5

42
Es wäre gut, das Beispiel zu erweitern, indem Sie eine weitere Zeile in Tabelle B mit dem Wert 4 hinzufügen. Dies zeigt, dass innere Verknüpfungen nicht gleich viele Zeilen sein müssen.
Softveda

473
Eine ausgezeichnete Erklärung, jedoch diese Aussage: Eine äußere Verbindung von A und B ergibt die Ergebnisse der A-Vereinigung B, dh die äußeren Teile einer Venn-Diagramm-Vereinigung. ist nicht richtig formuliert. Eine äußere Verknüpfung liefert die Ergebnisse von A, schneidet B zusätzlich zu einer der folgenden: alle A (linke Verknüpfung), alle B (rechte Verknüpfung) oder alle A und alle B (vollständige Verknüpfung). Nur dieses letzte Szenario ist wirklich eine Gewerkschaft B. Trotzdem eine gut geschriebene Erklärung.
Thomas

11
Habe ich recht, dass FULL JOIN ein Alias ​​von FULL OUTER JOIN und LEFT JOIN ein Alias ​​von LEFT OUTER JOIN ist?
Damian

3
ja tolle und ausgezeichnete erklärung. aber warum sind in Spalte b die Werte nicht in Ordnung? dh es ist 6,5 nicht als 5,6?
Ameer

7
@Ameer, danke. Join garantiert keine Bestellung, Sie müssten eine ORDER BY-Klausel hinzufügen.
Mark Harrison

734

Die Venn-Diagramme machen das nicht wirklich für mich.

Sie zeigen beispielsweise keine Unterscheidung zwischen einer Kreuzverknüpfung und einer inneren Verknüpfung oder zeigen im Allgemeinen eine Unterscheidung zwischen verschiedenen Arten von Verknüpfungsprädikaten oder bieten einen Rahmen für Überlegungen zu ihrer Funktionsweise.

Es gibt keinen Ersatz für das Verständnis der logischen Verarbeitung und es ist sowieso relativ einfach zu verstehen.

  1. Stellen Sie sich eine Kreuzverbindung vor.
  2. Bewerten Sie die onKlausel anhand aller Zeilen aus Schritt 1, wobei diejenigen beibehalten werden, für die das Prädikat eine Bewertung ergibttrue
  3. (Nur für äußere Verknüpfungen) Fügen Sie alle äußeren Zeilen hinzu, die in Schritt 2 verloren gegangen sind.

(Hinweis: In der Praxis findet der Abfrageoptimierer möglicherweise effizientere Möglichkeiten zur Ausführung der Abfrage als die oben beschriebene rein logische Beschreibung, aber das Endergebnis muss dasselbe sein.)

Ich beginne mit einer animierten Version eines vollständigen äußeren Joins . Weitere Erklärungen folgen.

Geben Sie hier die Bildbeschreibung ein


Erläuterung

Quelltabellen

Geben Sie hier die Linkbeschreibung ein

Beginnen Sie zunächst mit einem CROSS JOIN(AKA Cartesian Product). Dies hat keine ONKlausel und gibt einfach jede Kombination von Zeilen aus den beiden Tabellen zurück.

WÄHLEN SIE A.Farbe, B.Farbe AUS EINEM KREUZVERBINDUNG B.

Geben Sie hier die Linkbeschreibung ein

Innere und äußere Verknüpfungen haben ein Prädikat der "ON" -Klausel.

  • Inner Join. Bewerten Sie die Bedingung in der "ON" -Klausel für alle Zeilen im Cross-Join-Ergebnis. Wenn true, wird die verknüpfte Zeile zurückgegeben. Andernfalls verwerfen Sie es.
  • Linke äußere Verbindung. Entspricht der inneren Verknüpfung für alle Zeilen in der linken Tabelle, die mit nichts übereinstimmen, und gibt diese mit NULL-Werten für die rechten Tabellenspalten aus.
  • Right Outer Join. Entspricht der inneren Verknüpfung für alle Zeilen in der rechten Tabelle, die mit nichts übereinstimmen, und geben diese mit NULL-Werten für die linken Tabellenspalten aus.
  • Volle äußere Verbindung. Wie bei der inneren Verknüpfung bleiben die linken nicht übereinstimmenden Zeilen wie bei der linken äußeren Verknüpfung und die rechten nicht übereinstimmenden Zeilen gemäß der rechten äußeren Verknüpfung erhalten.

Einige Beispiele

WÄHLEN SIE A.Farbe, B.Farbe AUS EINER INNENVERBINDUNG B AUF A.Farbe = B.Farbe

Das Obige ist der klassische Equi Join.

Inner Join

Animierte Version

Geben Sie hier die Bildbeschreibung ein

WÄHLEN SIE A.Farbe, B.Farbe AUS EINER INNENVERBINDUNG B AUF A.Farbe NICHT IN ('Grün', 'Blau')

Die innere Verknüpfungsbedingung muss nicht unbedingt eine Gleichheitsbedingung sein und es müssen keine Referenzspalten aus beiden (oder sogar einer) der Tabellen vorhanden sein. Die Auswertung A.Colour NOT IN ('Green','Blue')in jeder Zeile der Kreuzverknüpfung wird zurückgegeben.

innere 2

SELECT A.Colour, B.Colour FROM A INNER JOIN B ON 1 = 1

Die Join-Bedingung wird für alle Zeilen im Cross-Join-Ergebnis als true ausgewertet. Dies entspricht also genau einem Cross-Join. Ich werde das Bild der 16 Zeilen nicht noch einmal wiederholen.

WÄHLEN SIE A.Farbe, B.Farbe AUS EINER LINKEN AUSSENVERBINDUNG B AUF A.Farbe = B.Farbe

Äußere Verknüpfungen werden logisch auf die gleiche Weise ausgewertet wie innere Verknüpfungen, außer dass eine Zeile aus der linken Tabelle (für eine linke Verknüpfung) überhaupt nicht mit Zeilen aus der rechten Tabelle verknüpft wird und im Ergebnis mit NULLWerten für die Tabelle beibehalten wird rechte Spalte.

LOJ

WÄHLEN SIE A.Farbe, B.Farbe AUS EINER LINKEN AUSSENVERBINDUNG B AUF A.Farbe = B.Farbe WO B.Farbe NULL IST

Dies schränkt das vorherige Ergebnis einfach so ein, dass nur die Zeilen zurückgegeben werden, in denen B.Colour IS NULL. In diesem speziellen Fall sind dies die Zeilen, die beibehalten wurden, da sie in der rechten Tabelle nicht übereinstimmten und die Abfrage die einzelne rote Zeile zurückgibt, die in der Tabelle nicht übereinstimmt B. Dies ist als Anti-Semi-Join bekannt.

Es ist wichtig, eine Spalte für den IS NULLTest auszuwählen , die entweder nicht nullwertfähig ist oder für die die Verknüpfungsbedingung sicherstellt, dass alle NULLWerte ausgeschlossen werden, damit dieses Muster ordnungsgemäß funktioniert, und zu vermeiden, dass nur Zeilen zurückgebracht werden, die zufällig einen NULLWert dafür haben Spalte zusätzlich zu den nicht übereinstimmenden Zeilen.

loj ist null

WÄHLEN SIE A.Farbe, B.Farbe AUS EINER RECHTEN AUSSENVERBINDUNG B AUF A.Farbe = B.Farbe

Rechte äußere Verknüpfungen verhalten sich ähnlich wie linke äußere Verknüpfungen, außer dass nicht übereinstimmende Zeilen aus der rechten Tabelle beibehalten werden und null die linken Spalten erweitern.

ROJ

WÄHLEN SIE A.Farbe, B.Farbe AUS EINER VOLLSTÄNDIGEN AUSSENVERBINDUNG B AUF A.Farbe = B.Farbe

Vollständige äußere Verknüpfungen kombinieren das Verhalten von linken und rechten Verknüpfungen und behalten die nicht übereinstimmenden Zeilen sowohl aus der linken als auch aus der rechten Tabelle bei.

FOJ

SELECT A.Colour, B.Colour FROM A FULL OUTER JOIN B ON 1 = 0

Keine Zeilen in der Kreuzverknüpfung stimmen mit dem 1=0Prädikat überein . Alle Zeilen von beiden Seiten werden unter Verwendung normaler Outer-Join-Regeln mit NULL in den Spalten der Tabelle auf der anderen Seite beibehalten.

FOJ 2

WÄHLEN SIE COALESCE (A.Colour, B.Colour) ALS Farbe AUS EINER VOLLSTÄNDIGEN AUSSENVERBINDUNG B ON 1 = 0

Mit einer geringfügigen Änderung der vorhergehenden Abfrage könnte man eine UNION ALLder beiden Tabellen simulieren .

UNION ALL

WÄHLEN SIE A.Farbe, B.Farbe AUS EINER LINKEN AUSSENVERBINDUNG B AUF A.Farbe = B.Farbe WO B.Farbe = 'Grün'

Beachten Sie, dass die WHEREKlausel (falls vorhanden) nach dem Join logisch ausgeführt wird. Ein häufiger Fehler besteht darin, einen linken äußeren Join auszuführen und dann eine WHERE-Klausel mit einer Bedingung in der rechten Tabelle einzufügen, die letztendlich die nicht übereinstimmenden Zeilen ausschließt. Das Obige führt am Ende die äußere Verbindung aus ...

LOJ

... und dann läuft die "Where" -Klausel. NULL= 'Green'wird nicht als wahr ausgewertet, sodass die durch die äußere Verknüpfung erhaltene Zeile verworfen wird (zusammen mit der blauen) und die Verknüpfung effektiv wieder in eine innere konvertiert.

LOJtoInner

Wenn beabsichtigt wäre, nur Zeilen von B einzuschließen, wobei Farbe grün ist, und alle Zeilen von A unabhängig von der korrekten Syntax

WÄHLEN SIE A.Farbe, B.Farbe AUS EINER LINKEN AUSSENVERBINDUNG B AUF A.Farbe = B.Farbe UND B.Farbe = 'Grün'

Geben Sie hier die Bildbeschreibung ein

SQL Fiddle

Sehen Sie sich diese Beispiele live auf SQLFiddle.com an .


46
Ich werde sagen, dass dies bei mir zwar nicht annähernd so gut funktioniert wie die Venn-Diagramme, aber ich schätze, dass die Menschen unterschiedlich sind und unterschiedlich lernen. Dies ist eine sehr gut präsentierte Erklärung, wie ich sie noch nie gesehen habe. Deshalb unterstütze ich @ypercube in Vergabe der Bonuspunkte. Gute Arbeit, die den Unterschied zwischen dem Einfügen zusätzlicher Bedingungen in die JOIN-Klausel und der WHERE-Klausel erklärt. Ein großes Lob an Sie, Martin Smith.
Old Pro

22
@OldPro Die Venn-Diagramme sind in Ordnung, aber sie enthalten keine Informationen darüber, wie ein Cross-Join dargestellt oder eine Art von Join-Prädikat wie Equi-Join von einem anderen unterschieden werden soll. Das mentale Modell der Bewertung des Join-Prädikats für jede Zeile des Cross-Join-Ergebnisses führt dann zu nicht übereinstimmenden Zeilen, wenn eine äußere Verknüpfung vorliegt, und schließlich zur Bewertung, wo das für mich besser funktioniert.
Martin Smith

18
Die Venn-Diagramme eignen sich gut zur Darstellung von Gewerkschaften und Schnittpunkten und Unterschieden, jedoch nicht für Verknüpfungen. Sie haben einen geringen pädagogischen Wert für sehr einfache Verknüpfungen, dh Verknüpfungen, bei denen die Verknüpfungsbedingung in eindeutigen Spalten liegt.
Ypercubeᵀᴹ

12
@Arth - Nein, du liegst falsch. SQL Fiddle sqlfiddle.com/#!3/9eecb7db59d16c80417c72d1/5155 Dies können die Venn-Diagramme nicht veranschaulichen.
Martin Smith

7
@ MartinSmith Wow, ich stimme zu, ich liege total falsch! Ich bin es zu gewohnt, mit One-to-Manys zu arbeiten. Danke für die Korrektur.
Arth

188

Joins werden verwendet, um die Daten aus zwei Tabellen zu kombinieren. Das Ergebnis ist eine neue temporäre Tabelle. Verknüpfungen werden basierend auf einem sogenannten Prädikat ausgeführt, das die Bedingung angibt, die zum Ausführen einer Verknüpfung verwendet werden soll. Der Unterschied zwischen einem inneren und einem äußeren Join besteht darin, dass ein innerer Join nur die Zeilen zurückgibt, die basierend auf dem Join-Prädikat tatsächlich übereinstimmen. Betrachten wir zum Beispiel die Mitarbeiter- und Standorttabelle:

Geben Sie hier die Bildbeschreibung ein

Innerer Join: - Innerer Join erstellt eine neue Ergebnistabelle, indem Spaltenwerte von zwei Tabellen ( Mitarbeiter und Standort ) basierend auf dem Join-Prädikatkombiniert werden. Die Abfrage vergleicht jede Zeile des Mitarbeiters mit jeder Zeile des Standorts , um alle Zeilenpaare zu finden, die das Join-Prädikat erfüllen. Wenn das Join-Prädikat durch Abgleichen von Nicht-NULL-Werten erfüllt ist, werden die Spaltenwerte für jedes übereinstimmende Zeilenpaar von Mitarbeiter und Standort zu einer Ergebniszeile zusammengefasst. So sieht die SQL für einen inneren Join aus:

select  * from employee inner join location on employee.empID = location.empID
OR
select  * from employee, location where employee.empID = location.empID

Hier ist das Ergebnis der Ausführung von SQL: Geben Sie hier die Bildbeschreibung ein

Äußere Verknüpfung : - Für eine äußere Verknüpfung muss nicht für jeden Datensatz in den beiden verknüpften Tabellen ein übereinstimmender Datensatz vorhanden sein. Die verknüpfte Tabelle behält jeden Datensatz bei - auch wenn kein anderer übereinstimmender Datensatz vorhanden ist. Äußere Verknüpfungen unterteilen sich weiter in linke äußere Verknüpfungen und rechte äußere Verknüpfungen, je nachdem, welche Tabellenzeilen beibehalten werden (links oder rechts).

Linke äußere Verknüpfung : - Das Ergebnis einer linken äußeren Verknüpfung (oder einfach einer linken Verknüpfung) für Tabellen Mitarbeiter und Standort enthält immer alle Datensätze der "linken" Tabelle ( Mitarbeiter ), auch wenn die Verknüpfungsbedingung keinen passenden Datensatz in findet die "richtige" Tabelle ( Ort ). So würde die SQL für einen linken äußeren Join anhand der obigen Tabellen aussehen:

select  * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional

So würde das Ergebnis der Ausführung dieser SQL aussehen: Geben Sie hier die Bildbeschreibung ein

Rechte äußere Verbindung: - Eine rechte äußere Verbindung (oder rechte Verbindung) ähnelt stark einer linken äußeren Verbindung, außer dass die Behandlung der Tabellen umgekehrt ist. Jede Zeile aus der "rechten" Tabelle ( Position ) wird mindestens einmal in der verknüpften Tabelle angezeigt. Wenn keine entsprechende Zeile aus der „linken“ Tabelle ( Mitarbeiter ) vorhanden, NULL in Spalten von erscheinen Mitarbeiter für die Datensätzedie keine Übereinstimmung in haben Location . So sieht SQL aus:

select * from employee right outer join location  on employee.empID = location.empID;
//Use of outer keyword is optional

Anhand der obigen Tabellen können wir zeigen, wie die Ergebnismenge eines rechten äußeren Joins aussehen würde:

Geben Sie hier die Bildbeschreibung ein

Vollständige äußere Verknüpfungen: - Bei vollständiger äußerer Verknüpfung oder vollständiger Verknüpfung werden die nicht übereinstimmenden Informationen beibehalten, indem nicht übereinstimmende Zeilen in die Ergebnisse einer Verknüpfung aufgenommen werden. Verwenden Sie eine vollständige äußere Verknüpfung. Es enthält alle Zeilen aus beiden Tabellen, unabhängig davon, ob die andere Tabelle einen übereinstimmenden Wert hat oder nicht.

Bildquelle

MySQL 8.0 Referenzhandbuch - Join-Syntax

Oracle Join-Vorgänge


3
beste Antwort bisher, alternative Syntax - das habe ich gesucht, danke!
Joey

1
Die Venn-Diagramme sind falsch beschriftet. Siehe meine Kommentare zur Frage und andere Antworten. Auch der größte Teil dieser Sprache ist schlecht. Beispiel: "Wenn das Join-Prädikat durch Abgleichen von Nicht-NULL-Werten erfüllt ist, werden die Spaltenwerte für jedes übereinstimmende Zeilenpaar von Mitarbeiter und Standort zu einer Ergebniszeile zusammengefasst." Nein, nicht "Wenn das Join-Prädikat durch Abgleichen von Nicht-NULL-Werten erfüllt ist". Werte in Zeilen spielen keine Rolle, außer ob die Bedingung insgesamt wahr oder falsch ist. Einige Werte könnten für eine echte Bedingung durchaus NULL sein.
Philipxy

Obwohl nicht explizit angegeben, handelt es sich bei den Diagrammen in diesem Diagramm um Venn-Diagramme. Venn-Diagramme sind im Allgemeinen nicht die korrekte mathematische Charakterisierung eines Joins. Ich schlage vor, die Venn-Diagramme zu entfernen.
Colm Bhandal

@ColmBhandal: Venn-Diagramme entfernt
Ajitksharma

Bitte verwenden Sie Text, keine Bilder / Links, für Text - einschließlich Tabellen und ERDs . Verwenden Sie Bilder nur für das, was nicht als Text ausgedrückt werden kann, oder um Text zu erweitern. Bilder können nicht gesucht oder ausgeschnitten und eingefügt werden. Fügen Sie einem Bild eine Legende / einen Schlüssel und eine Erklärung hinzu.
philipxy

133

Inner Join

Rufen Sie nur die übereinstimmenden Zeilen ab A intersect B.

Geben Sie hier die Bildbeschreibung ein

SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Linke äußere Verbindung

Wählen Sie alle Datensätze aus der ersten Tabelle und alle Datensätze in der zweiten Tabelle aus, die den verknüpften Schlüsseln entsprechen.

Geben Sie hier die Bildbeschreibung ein

SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Volle äußere Verbindung

Wählen Sie alle Datensätze aus der zweiten Tabelle und alle Datensätze in der ersten Tabelle aus, die den verknüpften Schlüsseln entsprechen.

Geben Sie hier die Bildbeschreibung ein

SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
    ON S.Advisor_ID = A.Advisor_ID

Verweise


14
Wie heißt das Werkzeug? Ich finde es interessant, da es die Anzahl der Zeilen und Venn-Diagramme zeigt
Grijesh Chauhan

2
@GrijeshChauhan Ja, aber Sie können versuchen, es mit Wein zu betreiben .
Tushar Gupta - Curioustushar

2
Ohh! Ja, ich habe SQLyog mit Wein verwendet. Es gibt auch PlayOnLinux
Grijesh Chauhan

1
Ihr Text ist unklar und falsch. Die "nur übereinstimmenden Zeilen" sind Zeilen aus dem Cross-Join von A & B & was abgerufen wird (A innerer Join B), ist nicht A-Schnittpunkt B, sondern (A linker Join B) Schnittpunkt (A rechter Join B). Die "ausgewählten" Zeilen stammen nicht von A & B, sondern von A Cross Join B & von null erweiterten Werten von Zeilen von A & B.
philipxy

@ TusharGupta-curioustushar Sie sollten die "Tabellen für SQL-Beispiele verwendet"
Manuel Jordan

112

In einfachen Worten:

Ein innerer Join ruft nur die übereinstimmenden Zeilen ab.

Während ein Outer Join die übereinstimmenden Zeilen aus einer Tabelle und allen Zeilen in einer anderen Tabelle abruft, hängt das Ergebnis davon ab, welche Sie verwenden:

  • Links : Übereinstimmende Zeilen in der rechten Tabelle und alle Zeilen in der linken Tabelle

  • Rechts : Übereinstimmende Zeilen in der linken Tabelle und alle Zeilen in der rechten Tabelle oder

  • Voll : Alle Zeilen in allen Tabellen. Es spielt keine Rolle, ob es eine Übereinstimmung gibt oder nicht


1
@nomen Nicht, dass diese Antwort darauf eingeht, aber INNER JOIN ist eine Kreuzung und FULL OUTER JOIN ist die entsprechende UNION, wenn die linken und rechten Mengen / Kreise die Zeilen der (jeweils) linken und rechten Verknüpfung enthalten. PS Diese Antwort ist unklar über Zeilen in Eingabe und Ausgabe. Es verwechselt "in der linken / rechten Tabelle" mit "hat einen linken / rechten Teil in der linken / rechten Tabelle" und verwendet "übereinstimmende Zeile" gegen "alle", um eine Zeile zu bedeuten, die zeilenweise von einer anderen Tabelle gegen null erweitert wurde.
philipxy

104

Ein innerer Join zeigt nur Zeilen an, wenn sich auf der anderen (rechten) Seite des Joins ein übereinstimmender Datensatz befindet.

Ein (linker) äußerer Join zeigt Zeilen für jeden Datensatz auf der linken Seite an, auch wenn auf der anderen (rechten) Seite des Joins keine übereinstimmenden Zeilen vorhanden sind. Wenn keine übereinstimmende Zeile vorhanden ist, werden in den Spalten für die andere (rechte) Seite NULL-Werte angezeigt.


82

Für innere Verknüpfungen muss ein Datensatz mit einer zugehörigen ID in der verknüpften Tabelle vorhanden sein.

Äußere Verknüpfungen geben Datensätze für die linke Seite zurück, auch wenn für die rechte Seite nichts vorhanden ist.

Sie haben beispielsweise eine Orders- und eine OrderDetails-Tabelle. Sie sind durch eine "OrderID" verbunden.

Aufträge

  • Auftragsnummer
  • Kundenname

Bestelldetails

  • OrderDetailID
  • Auftragsnummer
  • Produktname
  • Menge
  • Preis

Die Anfrage

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
 INNER JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

gibt nur Bestellungen zurück, die auch etwas in der OrderDetails-Tabelle enthalten.

Wenn Sie es auf OUTER LEFT JOIN ändern

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
  LEFT JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

Dann werden Datensätze aus der Orders-Tabelle zurückgegeben, auch wenn sie keine OrderDetails-Datensätze haben.

Sie können dies verwenden, um Bestellungen zu finden, die keine OrderDetails enthalten, die auf eine mögliche verwaiste Bestellung hinweisen, indem Sie eine where-Klausel wie hinzufügen WHERE OrderDetails.OrderID IS NULL.


1
Ich schätze das einfache, aber realistische Beispiel. Ich änderte eine Anfrage wie SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c, categories_description cd WHERE c.id = cd.categories_id AND c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASCzu SELECT c.id, c.status, cd.name, c.parent_id, cd.description, c.image FROM categories c INNER JOIN categories_description cd ON c.id = cd.categories_id WHERE c.status = 1 AND cd.language_id = 2 ORDER BY c.parent_id ASC(MySQL) mit Erfolg. Ich war mir nicht sicher über die zusätzlichen Bedingungen, sie mischen sich gut ...
PhiLho

68

In einfachen Worten:

Innerer Join -> NUR allgemeine Datensätze aus übergeordneten und untergeordneten Tabellen übernehmen, wobei der Primärschlüssel der übergeordneten Tabelle mit dem Fremdschlüssel in der untergeordneten Tabelle übereinstimmt.

Links verbinden ->

Pseudocode

1.Take All records from left Table
2.for(each record in right table,) {
    if(Records from left & right table matching on primary & foreign key){
       use their values as it is as result of join at the right side for 2nd table.
    } else {
       put value NULL values in that particular record as result of join at the right side for 2nd table.
    }
  }

Rechter Join : Genau entgegengesetzt zum linken Join. Geben Sie den Namen der Tabelle in LEFT JOIN rechts in Right Join ein. Sie erhalten dieselbe Ausgabe wie LEFT JOIN.

Äußere Verknüpfung : Alle Datensätze in beiden Tabellen anzeigen No matter what. Wenn die Datensätze in der linken Tabelle nicht mit der rechten Tabelle basierend auf dem Primärschlüssel, dem Forieign-Schlüssel, übereinstimmen, verwenden Sie den NULL-Wert als Ergebnis der Verknüpfung.

Beispiel:

Beispiel

Nehmen wir jetzt für 2 Tabellen an

1.employees , 2.phone_numbers_employees

employees : id , name 

phone_numbers_employees : id , phone_num , emp_id   

Hier ist die Mitarbeitertabelle die Mastertabelle, phone_numbers_employees die untergeordnete Tabelle (sie enthält emp_idals Fremdschlüssel , der die untergeordnete Tabelle verbindet employee.id).

Innere Verbindungen

Nehmen Sie die Datensätze von 2 Tabellen NUR, WENN der Primärschlüssel der Mitarbeitertabelle (seine ID) mit dem Fremdschlüssel der untergeordneten Tabelle phone_numbers_employees (emp_id) übereinstimmt. .

Abfrage wäre also:

SELECT e.id , e.name , p.phone_num FROM employees AS e INNER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Nehmen Sie hier nur übereinstimmende Zeilen auf Primärschlüssel = Fremdschlüssel, wie oben erläutert. Hier werden nicht übereinstimmende Zeilen auf Primärschlüssel = Fremdschlüssel als Ergebnis der Verknüpfung übersprungen.

Links verbindet :

Der linke Join behält alle Zeilen der linken Tabelle bei, unabhängig davon, ob eine Zeile in der rechten Tabelle übereinstimmt.

SELECT e.id , e.name , p.phone_num FROM employees AS e LEFT JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Äußere Verbindungen :

SELECT e.id , e.name , p.phone_num FROM employees AS e OUTER JOIN phone_numbers_employees AS p ON e.id = p.emp_id;

Diagrammatisch sieht es so aus:

Diagramm


4
Das Ergebnis hat nichts mit Primär- / Eindeutigkeits- / Kandidatenschlüsseln und Fremdschlüsseln zu tun. Das Verhalten kann und sollte ohne Bezugnahme auf sie beschrieben werden. Eine Querverbindung wird berechnet, dann werden Zeilen herausgefiltert, die nicht der EIN-Bedingung entsprechen. Zusätzlich werden für äußere Verknüpfungen gefilterte / nicht übereinstimmende Zeilen um NULL erweitert (pro LINKS / RECHTS / VOLL und enthalten.
philipxy

Die Annahme, dass SQL-Joins immer mit Primär- / Fremdschlüsseln übereinstimmen, führt zu diesem Missbrauch von Venn-Diagrammen. Bitte überarbeiten Sie Ihre Antwort entsprechend.
Colm Bhandal

58

Sie nutzen INNER JOIN geben alle Zeilen aus beiden Tabellen zurück, in denen eine Übereinstimmung vorliegt. dh In der resultierenden Tabelle haben alle Zeilen und Spalten Werte.

In OUTER JOINder resultierenden Tabelle können leere Spalten enthalten sein. Äußere Verknüpfung kann entweder LEFToder sein RIGHT.

LEFT OUTER JOIN Gibt alle Zeilen aus der ersten Tabelle zurück, auch wenn die zweite Tabelle keine Übereinstimmungen enthält.

RIGHT OUTER JOIN Gibt alle Zeilen aus der zweiten Tabelle zurück, auch wenn die erste Tabelle keine Übereinstimmungen enthält.



54

INNER JOINerfordert, dass der Vergleich der beiden Tabellen mindestens übereinstimmt. Zum Beispiel Tabelle A und Tabelle B, die A ٨ B (A Schnittpunkt B) implizieren.

LEFT OUTER JOIN und LEFT JOIN sind die gleichen. Es gibt alle übereinstimmenden Datensätze in beiden Tabellen und alle Möglichkeiten der linken Tabelle.

Ähnlich RIGHT OUTER JOINund RIGHT JOINsind gleich. Es gibt alle übereinstimmenden Datensätze in beiden Tabellen und alle Möglichkeiten der richtigen Tabelle.

FULL JOINist die Kombination von LEFT OUTER JOINund RIGHT OUTER JOINohne Vervielfältigung.


43

Die Antwort liegt in der Bedeutung jedes Einzelnen, also in den Ergebnissen.

Hinweis:
In SQLitegibt es kein RIGHT OUTER JOINoder FULL OUTER JOIN.
Und auch da MySQLdrin ist nein FULL OUTER JOIN.

Meine Antwort basiert auf dem obigen Hinweis .

Wenn Sie zwei Tabellen wie diese haben:

--[table1]               --[table2]
id | name                id | name
---+-------              ---+-------
1  | a1                  1  | a2
2  | b1                  3  | b2

CROSS JOIN / OUTER JOIN:
Sie können alle diese Tabellendaten mit CROSS JOINoder einfach ,so haben:

SELECT * FROM table1, table2
--[OR]
SELECT * FROM table1 CROSS JOIN table2

--[Results:]
id | name | id | name 
---+------+----+------
1  | a1   | 1  | a2
1  | a1   | 3  | b2
2  | b1   | 1  | a2
2  | b1   | 3  | b2

INNER JOIN:
Wenn Sie den obigen Ergebnissen einen Filter hinzufügen möchten, der auf einer Beziehung basiert, wie table1.id = table2.idSie sie verwenden können INNER JOIN:

SELECT * FROM table1, table2 WHERE table1.id = table2.id
--[OR]
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id

--[Results:]
id | name | id | name 
---+------+----+------
1  | a1   | 1  | a2

LEFT [OUTER] JOIN:
Wenn Sie alle Zeilen einer Tabelle im obigen Ergebnis mit derselben Beziehung haben möchten, können Sie Folgendes verwenden LEFT JOIN:
(Für RIGHT JOIN ändern Sie einfach die Position der Tabellen.)

SELECT * FROM table1, table2 WHERE table1.id = table2.id 
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
--[OR]
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id

--[Results:]
id | name | id   | name 
---+------+------+------
1  | a1   | 1    | a2
2  | b1   | Null | Null

FULL OUTER JOIN:
Wenn Sie auch alle Zeilen der anderen Tabelle in Ihren Ergebnissen haben möchten, können Sie Folgendes verwenden FULL OUTER JOIN:

SELECT * FROM table1, table2 WHERE table1.id = table2.id
UNION ALL
SELECT *, Null, Null FROM table1 WHERE Not table1.id In (SELECT id FROM table2)
UNION ALL
SELECT Null, Null, * FROM table2 WHERE Not table2.id In (SELECT id FROM table1)
--[OR] (recommended for SQLite)
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION ALL
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id
WHERE table1.id IS NULL
--[OR]
SELECT * FROM table1 FULL OUTER JOIN table2 On table1.id = table2.id

--[Results:]
id   | name | id   | name 
-----+------+------+------
1    | a1   | 1    | a2
2    | b1   | Null | Null
Null | Null | 3    | b2

Nun, je nach Bedarf wählen Sie jeden aus, der Ihren Bedarf abdeckt;).


Sie können Ihrer Notiz hinzufügen, dass es full outer joinin MySQL auch keine gibt.
Kali

35

Innere Verbindung.

Ein Join kombiniert die Zeilen aus zwei Tabellen. Ein innerer Join versucht, die beiden Tabellen anhand der in der Abfrage angegebenen Kriterien abzugleichen, und gibt nur die übereinstimmenden Zeilen zurück. Wenn eine Zeile aus der ersten Tabelle im Join mit zwei Zeilen in der zweiten Tabelle übereinstimmt, werden in den Ergebnissen zwei Zeilen zurückgegeben. Wenn die erste Tabelle eine Zeile enthält, die nicht mit der zweiten Zeile übereinstimmt, wird sie nicht zurückgegeben. Wenn die zweite Tabelle eine Zeile enthält, die nicht mit der ersten übereinstimmt, wird sie nicht zurückgegeben.

Äußere Verbindung.

Ein linker Join versucht, eine Übereinstimmung der Zeilen aus der ersten Tabelle mit den Zeilen in der zweiten Tabelle zu finden. Wenn keine Übereinstimmung gefunden werden kann, werden die Spalten aus der ersten Tabelle zurückgegeben und die Spalten aus der zweiten Tabelle leer gelassen (null).


28

Geben Sie hier die Bildbeschreibung ein

  • INNER JOINtypischster Join für zwei oder mehr Tabellen. Es gibt eine Datenübereinstimmung sowohl für die Tabelle ON als auch für die Fremdschlüsselbeziehung zurück.
  • OUTER JOINist dasselbe wie INNER JOIN, enthält jedoch auch NULLDaten zu ResultSet.
    • LEFT JOIN= INNER JOIN+ Nicht übereinstimmende Daten der linken Tabelle mit NullÜbereinstimmung auf der rechten Tabelle.
    • RIGHT JOIN= INNER JOIN+ Nicht übereinstimmende Daten der rechten Tabelle mit NullÜbereinstimmung auf der linken Tabelle.
    • FULL JOIN= INNER JOIN+ Nicht übereinstimmende Daten in der rechten und linken Tabelle mit NullÜbereinstimmungen.
  • Self Join ist in SQL kein Schlüsselwort, wenn eine Tabelle auf Daten verweist, die als Self Join bezeichnet werden. Mit INNER JOINund können OUTER JOINwir Self-Join-Abfragen schreiben.

Zum Beispiel:

SELECT * 
FROM   tablea a 
       INNER JOIN tableb b 
               ON a.primary_key = b.foreign_key 
       INNER JOIN tablec c 
               ON b.primary_key = c.foreign_key 

27

In den anderen Antworten sehe ich nicht viele Details zu Leistung und Optimierer.

Manchmal ist es gut, das nur zu wissen INNER JOIN assoziativ ist, was bedeutet, dass der Optimierer die meisten Optionen hat, um damit zu spielen. Es kann die Verknüpfungsreihenfolge neu anordnen, um sie schneller zu machen und das gleiche Ergebnis zu erzielen. Der Optimierer kann die meisten Verknüpfungsmodi verwenden.

Im Allgemeinen ist es eine gute Praxis, zu versuchen, INNER JOINanstelle der verschiedenen Arten von Verknüpfungen zu verwenden. (Natürlich, wenn es möglich ist, die erwartete Ergebnismenge zu berücksichtigen.)

Hier gibt es einige gute Beispiele und Erklärungen zu diesem seltsamen assoziativen Verhalten:


4
Es kann unmöglich "gute Praxis" sein, eine Art von Join über eine andere zu verwenden. Welcher Join Sie verwenden, bestimmt die gewünschten Daten. Wenn Sie einen anderen verwenden, sind Sie falsch. Außerdem ist zumindest in Oracle diese Antwort völlig falsch. Es klingt für alles völlig falsch und Sie haben keinen Beweis. Hast du Beweise?
Ben

1. Ich meine versuchen zu verwenden. Ich habe viele Leute gesehen, die LEFT OUTER Joins überall ohne guten Grund verwendet haben. (Die verknüpften Spalten waren 'nicht null'.) In diesen Fällen ist es definitiv besser, INNER-Verknüpfungen zu verwenden. 2. Ich habe einen Link hinzugefügt, der das nicht assoziative Verhalten besser erklärt als ich könnte.
Lajos Veres

Wie ich weiß, INNER JOINist es langsamer als LEFT JOINin den meisten Fällen, und die Leute können es verwenden, LEFT JOINanstatt ein INNER JOINhinzuzufügen, WHEREum unerwartete NULLErgebnisse zu entfernen ;).
shA.t

Diese Kommentare haben mich etwas unsicher gemacht. Warum denkst du INNERist langsamer?
Lajos Veres

Kommt auf den Motor an. gnu join, joinkeys, DB2, MySQL. Leistungsfallen sind im Überfluss vorhanden, z. B. lose Eingabe oder explizite Besetzung.
McKenzm

26

Nachdem ich das beliebte rot schattierte Venn-Diagramm kritisiert hatte, fand ich es nur fair, meinen eigenen Versuch zu veröffentlichen.

Obwohl die Antwort von @Martin Smith bei weitem die beste dieser Gruppe ist, zeigt seine nur die Schlüsselspalte aus jeder Tabelle, während ich denke, dass im Idealfall auch Nicht-Schlüsselspalten angezeigt werden sollten.

Das Beste, was ich in der erlaubten halben Stunde tun konnte, ist meiner Meinung nach immer noch nicht ausreichend, um zu zeigen, dass die Nullen vorhanden sind, weil keine Schlüsselwerte vorhanden sind TableBoder dass OUTER JOINes sich eher um eine Union als um einen Join handelt:

Geben Sie hier die Bildbeschreibung ein


2
Die Frage ist nach dem Unterschied zwischen INNER- und OUTER-Joins gefragt, nicht unbedingt links außen Join lol
LearnByReading

@LearnByReading: mein Bild auf der rechten Seite ist eine rechte äußere dh join ersetzen TableA a LEFT OUTER JOIN TableB bmitTableB B RIGHT OUTER JOIN TableA a
onedaywhen

26

Der genaue Algorithmus INNER JOIN, LEFT/RIGHT OUTER JOINsind wie folgt:

  1. Nehmen Sie jede Zeile aus der ersten Tabelle: a
  2. Betrachten Sie alle Zeilen aus der zweiten Tabelle daneben: (a, b[i])
  3. Bewerten Sie die ON ...Klausel für jedes Paar:ON( a, b[i] ) = true/false?
    • Wenn die Bedingung ausgewertet wird true, geben Sie diese kombinierte Zeile zurück (a, b[i]) .
    • Wenn Sie das Ende der zweiten Tabelle ohne Übereinstimmung erreichen und dies ist, Outer Joingeben Sie ein (virtuelles) Paar zurück, das Nullfür alle Spalten einer anderen Tabelle verwendet wird: (a, Null)für die linke äußere Verknüpfung oder (Null, b)für die rechte äußere Verknüpfung. Dies soll sicherstellen, dass alle Zeilen der ersten Tabelle in den Endergebnissen vorhanden sind.

Hinweis: Die in ONKlausel angegebene Bedingung kann eine beliebige sein. Es ist nicht erforderlich, Primärschlüssel zu verwenden (und Sie müssen nicht immer auf Spalten aus beiden Tabellen verweisen). Zum Beispiel:

Inner Join vs. Left Outer Join


Geben Sie hier die Bildbeschreibung ein

Hinweis: Left Join = Left Outer Join, Right Join = Right Outer Join.


20

Einfachste Definitionen

Inner Join: Gibt übereinstimmende Datensätze zurück aus beiden Tabellen zurück.

Full Outer Join: Rückkehr abgestimmt und unerreichte Datensätze aus beiden Tabellen mit null für nicht angepasste Datensätze aus beiden Tabellen .

Left Outer Join: Gibt übereinstimmende und nicht übereinstimmende Datensätze nur aus der Tabelle auf der linken Seite zurück .

Right Outer Join: Gibt übereinstimmende und nicht übereinstimmende Datensätze nur aus der Tabelle auf der rechten Seite zurück .

Zusamenfassend

Matched + Left Unmatched + Right Unmatched = Full Outer Join

Matched + Left Unmatched = Left Outer Join

Matched + Right Unmatched = Right Outer Join

Matched = Inner Join


1
Dies ist brillant und erklärt, warum Join für Zeitreihenindizes nicht wie erwartet funktioniert. Zeitstempel im Abstand von einer Sekunde sind unübertroffen.
Yeliabsalohcin

1
@yeliabsalohcin Sie erklären hier nicht "wie erwartet" oder "funktioniert" in Ihrem Kommentar zur Frage. Es ist nur ein unerklärliches persönliches Missverständnis, das Sie seltsamerweise von anderen erwarten. Wenn Sie Wörter beim Lesen als schlampig behandeln - klares Schreiben falsch interpretieren und / oder unklares Schreiben akzeptieren - wie wenn Sie hier schreiben, können Sie mit falschen Vorstellungen rechnen. Tatsächlich ist diese Antwort wie die meisten hier unklar und falsch. "Inner Join: Gibt übereinstimmende Datensätze aus beiden Tabellen zurück" ist falsch, wenn sich die Eingabespaltengruppen unterscheiden. Es versucht , etwas Bestimmtes zu sagen, ist es aber nicht . (Siehe meine Antwort.)
philipxy

9

In einfachen Worten,

1. INNER JOIN ODER EQUI JOIN: Gibt die Ergebnismenge zurück, die nur der Bedingung in beiden Tabellen entspricht.

2. OUTER JOIN: Gibt die Ergebnismenge aller Werte aus beiden Tabellen zurück, auch wenn eine Bedingungsübereinstimmung vorliegt oder nicht.

3. LEFT JOIN: Gibt die Ergebnismenge aller Werte aus der linken Tabelle und nur der Zeilen zurück, die der Bedingung in der rechten Tabelle entsprechen.

4. RIGHT JOIN: Gibt die Ergebnismenge aller Werte aus der rechten Tabelle und nur der Zeilen zurück, die der Bedingung in der linken Tabelle entsprechen.

5. FULL JOIN: Full Join und Full Outer Join sind gleich.


5

Es gibt hauptsächlich zwei Arten von JOINs in SQL: [INNER und OUTER]


Beispiele

Angenommen, Sie haben zwei Tabellen mit jeweils einer Spalte und Daten wie folgt:

A    B
-    -
1    3
2    4
3    5
4    6
7
8

Beachten Sie, dass (1,2,7,8) nur für A gelten, (3,4) häufig sind und (5,6) nur für B gelten.



  • (INNER) BEITRETEN :

Das Schlüsselwort INNER JOIN wählt alle Zeilen aus beiden Tabellen aus, solange die Bedingung erfüllt ist. Dieses Schlüsselwort erstellt die Ergebnismenge, indem alle Zeilen aus beiden Tabellen kombiniert werden, in denen die Bedingung erfüllt ist, dh der Wert des gemeinsamen Felds ist der gleiche.

INNER JOIN

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;

Ergebnis:

a | b
--+--
3 | 3
4 | 4


  • LINKS (AUSSEN) BEITRETEN :

Dieser Join gibt alle Zeilen der Tabelle auf der linken Seite des Joins und übereinstimmende Zeilen für die Tabelle auf der rechten Seite des Joins zurück. Die Zeilen, für die es auf der rechten Seite keine übereinstimmende Zeile gibt, enthält die Ergebnismenge null. LEFT JOIN ist auch bekannt als LEFT OUTER JOIN.

LEFT JOIN / LEFT OUTER JOIN

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);

Ergebnis:

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4
7 | null
8 | null


  • RIGHT (OUTER) JOIN : Gibt alle Datensätze aus der rechten Tabelle und die übereinstimmenden Datensätze aus der linken Tabelle zurück

RIGHT JOIN / RIGHT OUTER JOIN

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;

Ergebnis:

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6


  • VOLL (AUSSEN) BEITRETEN :

    FULL JOIN erstellt die Ergebnismenge, indem das Ergebnis von LEFT JOIN und RIGHT JOIN kombiniert wird. Die Ergebnismenge enthält alle Zeilen aus beiden Tabellen. Die Zeilen, für die es keine Übereinstimmung gibt, enthält die Ergebnismenge NULL-Werte.

FULL JOIN / FULL OUTER JOIN

select * from a FULL OUTER JOIN b on a.a = b.b;

Ergebnis:

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5
   7 | null
   8 | null

1
Venn-Diagramme reichen im allgemeinen Fall nicht aus, um SQL-Joins zu beschreiben. SQL-Joins müssen nicht unbedingt die Zeilen zwischen den Tabellen eins zu eins abgleichen, z. B. mit Fremdschlüssel oder Primärschlüssel.
Colm Bhandal

Wie verbindet man 2 Tabellen ohne Übereinstimmung mit der Zeile? Sie benötigen einen Spaltenprimär- oder Fremdschlüssel oder ein allgemeines Feld, damit Sie eine Verknüpfung durchführen können. Ich frage mich, warum Sie diese Antwort abgelehnt haben. Das Venn-Diagramm ist die Quelle, um zu erklären, wie SQL JOIN funktioniert. Haben Sie bessere Beispiele für die Darstellung der Joins? Wenn nicht, stimmen Sie es bitte ab, damit die Leute bessere Lösungen erhalten. Vielen Dank.
Mayur

Du bist derjenige, der die Diagramme in den Beitrag setzt. Was ist die Legende für die Diagramme? - Was sind die Elemente jeder Menge? Und was ist mit der Tatsache, dass Tische Taschen sind, die nicht gedeckt sind? Das sagst du nicht. Eine Sache, von der sie keine Sätze sind, sind Zeilen von A & B pro Etikett. Siehe meine Kommentare zu den Beiträgen auf dieser Seite. Dieser Beitrag wiederholt nur blind die falsche Verwendung, die an anderer Stelle gesehen, aber nicht verstanden oder in Frage gestellt wurde. Auch die Dinge, die Sie hier im Text sagen, sind unklar und falsch. Es fügt auch nichts zu den vielen Antworten hinzu, die bereits hier vorliegen. (Auch wenn fast alle ziemlich arm sind.) PS Bitte klären Sie dies durch Änderungen, nicht durch Kommentare.
philipxy

FKs werden nicht benötigt, um beizutreten oder abzufragen. Beliebige 2 Tabellen können unter allen Bedingungen, die ihre Spalten betreffen, und unabhängig von Einschränkungen, Auslösern oder Zusicherungen verbunden werden.
philipxy

3
  • Innerer Join - Ein innerer Join , der eine der entsprechenden Abfragen verwendet, gibt den Schnittpunkt der beiden Tabellen an , dh der beiden Zeilen, die sie gemeinsam haben.

  • Linke äußere Verknüpfung - Eine linke äußere Verknüpfung gibt alle Zeilen in A sowie alle gemeinsamen Zeilen in B an.

  • Vollständige äußere Verknüpfung - Eine vollständige äußere Verknüpfung gibt Ihnen die Vereinigung von A und B, dh alle Zeilen in A und alle Zeilen in B. Wenn etwas in A kein entsprechendes Datum in B hat, ist der B-Teil null und umgekehrt


1
Dies ist sowohl falsch als auch unklar. Join ist keine Schnittmenge, es sei denn, die Tabellen haben dieselben Spalten. Äußere Verknüpfungen haben keine Zeilen von A oder B, es sei denn, sie haben dieselben Spalten. In diesem Fall werden keine Nullen hinzugefügt. Sie versuchen etwas zu sagen, aber Sie sagen es nicht. Sie erklären nicht richtig oder klar.
Philipxy

@philipxy: Nicht einverstanden mit Ihrer Anweisung Join is not an intersection unless the tables have the same columnsNein. Sie können beliebige Spalten verknüpfen. Wenn der Wert übereinstimmt, werden sie zusammengefügt.
SuicideSheep

Dieser Kommentar ist so unklar wie Ihre Antwort. (Ich nehme an, Sie denken vielleicht so etwas wie: Die Menge der Unterzeilenwerte für die gemeinsamen Spalten des Ergebnisses ist der Schnittpunkt der Mengen der Unterreihenwerte für die gemeinsamen Spalten jeder der Eingaben; aber das haben Sie nicht geschrieben. Sie sind nicht klar.)
philipxy

Was ich damit gemeint habe war, dass Join nur ein Schnittpunkt von Eingaben ist, wenn es sich um einen natürlichen inneren Join von Eingaben mit denselben Spalten handelt. Sie verwenden die Wörter "Kreuzung" und "Vereinigung" falsch.
philipxy

3

1. Inner Join: Wird auch als Join bezeichnet. Es gibt nur dann die Zeilen zurück, die sowohl in der linken als auch in der rechten Tabelle vorhanden sind, wenn eine Übereinstimmung vorliegt . Andernfalls werden keine Datensätze zurückgegeben.

Beispiel:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
INNER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

output1

2. Full Outer Join: Wird auch als Full Join bezeichnet. Es werden alle Zeilen zurückgegeben die sowohl in der linken als auch in der rechten Tabelle vorhanden sind.

Beispiel:

SELECT
  e1.emp_name,
  e2.emp_salary    
FROM emp1 e1
FULL OUTER JOIN emp2 e2
  ON e1.emp_id = e2.emp_id

output2

3. Linke äußere Verbindung: Oder einfach als Left Join bezeichnet. Es werden alle in der linken Tabelle vorhandenen Zeilen und übereinstimmende Zeilen aus der rechten Tabelle (falls vorhanden) zurückgegeben.

4. Right Outer Join: Wird auch als Right Join bezeichnet. Es werden übereinstimmende Zeilen aus der linken Tabelle (falls vorhanden) und alle in der rechten Tabelle vorhandenen Zeilen zurückgegeben.

schließt sich an

Vorteile von Joins

  1. Wird schneller ausgeführt.

2
Dies ist nur dann richtig, wenn für die Tabellen dieselbe Spalte festgelegt ist. (Es verwechselt innere Verknüpfung mit Schnittmenge und vollständige Verknüpfung mit Vereinigung.) Auch "Übereinstimmung" ist undefiniert. Lesen Sie meine anderen Kommentare.
Philipip

2

Betrachten Sie unten 2 Tabellen:

EMP

empid   name    dept_id salary
1       Rob     1       100
2       Mark    1       300
3       John    2       100
4       Mary    2       300
5       Bill    3       700
6       Jose    6       400

Abteilung

deptid  name
1       IT
2       Accounts
3       Security
4       HR
5       R&D

Inner Join:

Meistens nur als JOIN in SQL-Abfragen geschrieben. Es werden nur die übereinstimmenden Datensätze zwischen den Tabellen zurückgegeben.

Finden Sie alle Mitarbeiter und ihre Abteilungsnamen heraus:

Select a.empid, a.name, b.name as dept_name
FROM emp a
JOIN department b
ON a.dept_id = b.deptid
;

empid   name    dept_name
1       Rob     IT
2       Mark    IT
3       John    Accounts
4       Mary    Accounts
5       Bill    Security

Wie Sie oben sehen, Josewird in der Ausgabe nicht aus EMP gedruckt, da dept_id 6in der Abteilungstabelle keine Übereinstimmung findet. In ähnlicher Weise HRund R&DZeilen nicht aus gedruckt Abteilung Tabelle , da sie keine Übereinstimmung in der Emp - Tabelle gefunden.

INNER JOIN oder nur JOIN gibt also nur übereinstimmende Zeilen zurück.

LINKS BEITRETEN:

Dies gibt alle Datensätze aus der Tabelle LINKS und nur übereinstimmende Datensätze aus der Tabelle RECHTS zurück.

Select a.empid, a.name, b.name as dept_name
FROM emp a
LEFT JOIN department b
ON a.dept_id = b.deptid
;

empid   name    dept_name
1       Rob     IT
2       Mark    IT
3       John    Accounts
4       Mary    Accounts
5       Bill    Security
6       Jose    

Wenn Sie also die obige Ausgabe beobachten, werden alle Datensätze aus der LEFT-Tabelle (Emp) mit nur übereinstimmenden Datensätzen aus der RIGHT-Tabelle gedruckt.

HRund R&DZeilen werden nicht aus der Abteilungstabelle gedruckt, da sie in der Emp-Tabelle auf dept_id keine Übereinstimmung gefunden haben.

LEFT JOIN gibt also ALLE Zeilen aus der linken Tabelle und nur übereinstimmende Zeilen aus der rechten Tabelle zurück.

Kann auch DEMO überprüfen hier .


2

Die allgemeine Idee

Bitte beachten Sie die Antwort von Martin Smith für eine bessere illustations und Erläuterungen zu den verschiedenen beitritt, auch und vor allem Unterschiede zwischen FULL OUTER JOIN, RIGHT OUTER JOINund LEFT OUTER JOIN.

Diese beiden Tabellen bilden eine Grundlage für die Darstellung der folgenden JOINs:

Basis

CROSS JOIN

CrossJoin

SELECT *
  FROM citizen
 CROSS JOIN postalcode

Das Ergebnis sind die kartesischen Produkte aller Kombinationen. Keine JOINBedingung erforderlich:

CrossJoinResult

INNER JOIN

INNER JOIN ist das gleiche wie einfach: JOIN

InnerJoin

SELECT *
  FROM citizen    c
  JOIN postalcode p ON c.postal = p.postal

Das Ergebnis sind Kombinationen, die die erforderliche JOINBedingung erfüllen:

InnerJoinResult

LINKE ÄUSSERE VERBINDUNG

LEFT OUTER JOIN ist das gleiche wie LEFT JOIN

LeftJoin

SELECT *
  FROM citizen         c
  LEFT JOIN postalcode p ON c.postal = p.postal

Das Ergebnis wird alles sein, citizenauch wenn es keine Übereinstimmungen gibt postalcode. Wieder ist eine JOINBedingung erforderlich:

LeftJoinResult

Daten zum Spielen

Alle Beispiele wurden auf einem Oracle 18c ausgeführt. Sie sind auf dbfiddle.uk erhältlich. Dort stammen auch Screenshots von Tabellen.

CREATE TABLE citizen (id      NUMBER,
                      name    VARCHAR2(20),
                      postal  NUMBER,  -- <-- could do with a redesign to postalcode.id instead.
                      leader  NUMBER);

CREATE TABLE postalcode (id      NUMBER,
                         postal  NUMBER,
                         city    VARCHAR2(20),
                         area    VARCHAR2(20));

INSERT INTO citizen (id, name, postal, leader)
              SELECT 1, 'Smith', 2200,  null FROM DUAL
        UNION SELECT 2, 'Green', 31006, 1    FROM DUAL
        UNION SELECT 3, 'Jensen', 623,  1    FROM DUAL;

INSERT INTO postalcode (id, postal, city, area)
                 SELECT 1, 2200,     'BigCity',         'Geancy'  FROM DUAL
           UNION SELECT 2, 31006,    'SmallTown',       'Snizkim' FROM DUAL
           UNION SELECT 3, 31006,    'Settlement',      'Moon'    FROM DUAL  -- <-- Uuh-uhh.
           UNION SELECT 4, 78567390, 'LookoutTowerX89', 'Space'   FROM DUAL;

Verschwommene Grenzen beim Spielen mit JOINundWHERE

CROSS JOIN

CROSS JOINDaraus resultieren Zeilen wie The General Idea / INNER JOIN:

SELECT *
  FROM citizen          c
  CROSS JOIN postalcode p
 WHERE c.postal = p.postal -- < -- The WHERE condition is limiting the resulting rows

Die Verwendung CROSS JOIN, um das Ergebnis von a zu erhalten, LEFT OUTER JOINerfordert Tricks wie das Hinzufügen in einer NULLReihe. Es ist weggelassen.

INNER JOIN

INNER JOINwird ein kartesisches Produkt. Es ist das gleiche wie The General Idea / CROSS JOIN:

SELECT *
  FROM citizen    c
  JOIN postalcode p ON 1 = 1  -- < -- The ON condition makes it a CROSS JOIN

Hier kann der innere Join wirklich als Cross-Join angesehen werden, dessen Ergebnisse nicht mit der entfernten Bedingung übereinstimmen. Hier wird keine der resultierenden Zeilen entfernt.

Mit INNER JOINdem Ergebnis erhalten einer LEFT OUTER JOINauch Tricks erfordert. Es ist weggelassen.

LINKE ÄUSSERE VERBINDUNG

LEFT JOINergibt in Zeilen als The General Idea / CROSS JOIN:

SELECT *
  FROM citizen         c
  LEFT JOIN postalcode p ON 1 = 1 -- < -- The ON condition makes it a CROSS JOIN

LEFT JOINergibt in Zeilen als The General Idea / INNER JOIN:

SELECT *
  FROM citizen         c
  LEFT JOIN postalcode p ON c.postal = p.postal
 WHERE p.postal IS NOT NULL -- < -- removed the row where there's no mathcing result from postalcode

Die Probleme mit dem Venn-Diagramm

Eine Bild-Internetsuche auf "SQL Join Cross Inner Outer" zeigt eine Vielzahl von Venn-Diagrammen. Früher hatte ich eine gedruckte Ausgabe auf meinem Schreibtisch. Es gibt jedoch Probleme mit der Darstellung.

Venn-Diagramme eignen sich hervorragend für die Mengenlehre, bei der sich ein Element in einer oder beiden Mengen befinden kann. Bei Datenbanken scheint mir ein Element in einer "Menge" eine Zeile in einer Tabelle zu sein und daher auch in keiner anderen Tabelle vorhanden zu sein. In mehreren Tabellen ist keine Zeile vorhanden. Eine Zeile ist für die Tabelle eindeutig.

Self-Joins sind ein Eckfall, in dem jedes Element in beiden Mengen tatsächlich gleich ist. Aber es ist immer noch nicht frei von den folgenden Problemen.

Das Set Arepräsentiert das Set links (die citizenTabelle) und das Set Bist das Set rechts (die postalcodeTabelle) in der folgenden Diskussion.

CROSS JOIN

Jedes Element in beiden Mengen wird mit jedem Element in der anderen Menge abgeglichen, was bedeutet, dass wir die AMenge aller BElemente und die BMenge aller AElemente benötigen , um dieses kartesische Produkt richtig darzustellen. Die Mengenlehre ist nicht für mehrere identische Elemente in einer Menge gemacht, daher finde ich Venn-Diagramme, um sie richtig darzustellen, unpraktisch / unmöglich. Es scheint überhaupt nicht zu UNIONpassen.

Die Zeilen sind unterschiedlich. Das UNIONsind insgesamt 7 Zeilen. Sie sind jedoch für eine gemeinsame SQLErgebnismenge nicht kompatibel . Und so funktioniert ein CROSS JOINüberhaupt nicht:

CrossJoinUnion1

Der Versuch, es so darzustellen:

CrossJoinUnion2Crossing

..aber jetzt sieht es einfach aus wie ein INTERSECTION, was es sicher nicht ist . Darüber hinaus gibt es kein Element in dem INTERSECTION, das sich tatsächlich in einer der beiden unterschiedlichen Mengen befindet. Es sieht jedoch den folgenden durchsuchbaren Ergebnissen sehr ähnlich:

CrossJoinUnionUnion3

Als Referenz kann ein durchsuchbares Ergebnis für CROSS JOINs bei Tutorialgateway angezeigt werden . Das INTERSECTIONist genau wie dieses leer.

INNER JOIN

Der Wert eines Elements hängt von der JOINBedingung ab. Es ist möglich, dies unter der Bedingung darzustellen, dass jede Zeile für diese Bedingung eindeutig wird. Die Bedeutung id=xgilt nur für eine Zeile. Sobald eine Zeile in der Tabelle A( citizen) mehrere Zeilen in der Tabelle übereinstimmt B( postalcode) unter der JOINBedingung, hat das Ergebnis die gleichen Probleme wie die CROSS JOIN: Die Zeile mehrfach dargestellt werden muss, und die Mengenlehre ist für das nicht wirklich gemacht. Unter der Bedingung der Eindeutigkeit könnte das Diagramm zwar funktionieren, bedenken Sie jedoch, dass die JOINBedingung die Platzierung eines Elements im Diagramm bestimmt. Betrachten Sie nur die Werte der JOINBedingung mit dem Rest der Reihe gerade für die Fahrt:

InnerJoinIntersection - Gefüllt

Diese Darstellung fällt vollständig auseinander, wenn ein INNER JOINmit einer ON 1 = 1Bedingung verwendet wird, die es zu einem macht CROSS JOIN.

Bei einem Selbst JOINsind die Zeilen tatsächlich identische Elemente in beiden Tabellen, stellen jedoch die Tabellen als beide dar Aund Bsind nicht sehr geeignet. Eine übliche Selbstbedingung JOIN, die bewirkt , dass ein Element Amit einem anderen Element in B übereinstimmt, ist beispielsweise ON A.parent = B.child, dass die Übereinstimmung von Abis Bzu separaten Elementen erfolgt. Aus den Beispielen, die so SQLaussehen würden:

SELECT *
  FROM citizen c1
  JOIN citizen c2 ON c1.id = c2.leader

SelfJoinResult

Das heißt, Smith ist der Anführer von Green und Jensen.

OUTER JOIN

Wieder beginnen die Probleme, wenn eine Zeile mehrere Übereinstimmungen mit Zeilen in der anderen Tabelle aufweist. Dies ist weiter kompliziert, da dies OUTER JOINjedoch so sein kann, dass es mit dem leeren Satz übereinstimmt. Aber in der Mengenlehre ist die Vereinigung einer Menge Cund einer leeren Menge immer gerecht C. Der leere Satz fügt nichts hinzu. Die Darstellung LEFT OUTER JOINzeigt normalerweise nur alle, um Azu veranschaulichen, dass Zeilen in Aausgewählt sind, unabhängig davon, ob eine Übereinstimmung vorliegt oder nicht B. Die "passenden Elemente" haben jedoch die gleichen Probleme wie die obige Abbildung. Sie hängen von der Bedingung ab. Und das leere Set scheint hinübergegangen zu sein zu A:

LeftJoinIntersection - Gefüllt

WHERE-Klausel - sinnvoll

Finden aller Zeilen von a CROSS JOINmit Smith und Postleitzahl auf dem Mond:

SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE c.name = 'Smith'
   AND p.area = 'Moon';

Wo - Ergebnis

Jetzt wird das Venn-Diagramm nicht mehr verwendet, um das wiederzugeben JOIN. Es wird nur für die WHEREKlausel verwendet:

Wo

..und das macht Sinn.

Wenn INTERSECT und UNION Sinn machen

SICH SCHNEIDEN

Wie erklärt INNER JOINist ein nicht wirklich ein INTERSECT. Allerdings INTERSECTkann s auf den Ergebnissen der separaten Abfragen verwendet werden. Hier ist ein Venn-Diagramm sinnvoll, da die Elemente aus den einzelnen Abfragen tatsächlich Zeilen sind, die entweder nur zu einem der Ergebnisse oder zu beiden gehören. Intersect gibt offensichtlich nur Ergebnisse zurück, wenn die Zeile in beiden Abfragen vorhanden ist. Dies SQLführt zu derselben Zeile wie oben WHERE, und das Venn-Diagramm ist auch dasselbe:

SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE c.name = 'Smith'
INTERSECT
SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE p.area = 'Moon';

UNION

An OUTER JOINist nicht a UNION. Doch UNIONunter den gleichen Bedingungen wie arbeiten INTERSECT, in einer Rückkehr aller Ergebnisse resultierend beide kombiniert SELECTs:

SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE c.name = 'Smith'
UNION
SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE p.area = 'Moon';

was äquivalent ist zu:

SELECT *
  FROM citizen          c
 CROSS JOIN postalcode  p
 WHERE c.name = 'Smith'
   OR p.area = 'Moon';

..und gibt das Ergebnis:

Union - Ergebnis

Auch hier macht ein Venn-Diagramm Sinn:

UNION

Wenn es nicht zutrifft

Ein wichtiger Hinweis ist, dass diese nur funktionieren, wenn die Struktur der Ergebnisse der beiden SELECTs gleich ist, was einen Vergleich oder eine Vereinigung ermöglicht. Die Ergebnisse dieser beiden werden dies nicht ermöglichen:

SELECT *
  FROM citizen
 WHERE name = 'Smith'
SELECT *
  FROM postalcode
 WHERE area = 'Moon';

..versucht, die Ergebnisse mit zu kombinieren, UNIONergibt a

ORA-01790: expression must have same datatype as corresponding expression

Für weiteres Interesse lesen Sie NEIN zu Venn-Diagrammen, wenn Sie JOINs und SQL-Joins als Venn-Diagramm erläutern . Beide decken auch ab EXCEPT.


1

Hier gibt es viele gute Antworten mit sehr genauen Beispielen für relationale Algebra . Hier ist eine sehr vereinfachte Antwort, die für Amateur- oder Anfängercodierer mit SQL-Codierungsdilemmata hilfreich sein kann.

Grundsätzlich beschränken sich Abfragen häufig JOINauf zwei Fälle:

Für eine SELECTTeilmenge von Daten A:

  • Verwenden Sie diese Option,INNER JOIN wenn die von BIhnen gesuchten zugehörigen Daten pro Datenbankdesign vorhanden sein MÜSSEN.
  • Verwenden Sie diese Option,LEFT JOIN wenn die zugehörigen Daten, nach denen BSie suchen, möglicherweise oder möglicherweise NICHT pro Datenbankdesign vorhanden sind.

1

Der Unterschied zwischen inner joinund outer joinist wie folgt:

  1. Inner joinist ein Join, der Tabellen basierend auf übereinstimmenden Tupeln kombiniert, während outer joinein Join, der Tabellen kombiniert, die sowohl auf übereinstimmenden als auch auf nicht übereinstimmenden Tupeln basieren.
  2. Inner joinführt übereinstimmende Zeilen aus zwei Tabellen zusammen, in denen nicht übereinstimmende Zeilen weggelassen werden, während outer joinZeilen aus zwei Tabellen zusammengeführt werden und nicht übereinstimmende Zeilen mit dem Wert Null gefüllt werden.
  3. Inner joinist wie eine Kreuzungsoperation, während outer joines wie eine Gewerkschaftsoperation ist.
  4. Inner joinist zwei Typen, während outer joindrei Typen sind.
  5. outer joinist schneller als inner join.

1
Ein Ergebnis der äußeren Verknüpfung ist das gleiche wie das Ergebnis der inneren Verknüpfung, jedoch mit einigen zusätzlichen Zeilen, sodass ich keine Ahnung habe, warum die äußere Verknüpfung Ihrer Meinung nach schneller wäre. Was sind auch diese "zwei Arten" von inneren Verbindungen? Ich nehme an, Sie beziehen sich auf voll, links und rechts für äußere?
Martin Smith

1
@ M.achaibou Bitte nehmen Sie keine Änderungen vor, die unnötige Formatänderungen bewirken. Namen von Operatoren sind kein Code, es sei denn, sie werden im Code verwendet. Bitte nehmen Sie keine Änderungen an der Post-Bedeutung vor, schreiben Sie einen Kommentar an den Autor. Wenn Sie den Repräsentanten nicht haben, warten Sie, bis Sie es tun. Es kommt vor, dass das Poster dies genehmigt hat, aber bitte nehmen Sie solche Änderungen nicht vor. PS Die äußere Verbindung ist nicht schneller als die innere Verbindung.
philipxy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.