webentwicklung-frage-antwort-db.com.de

SQL tritt als Venn-Diagramm

Ich hatte Probleme, Joins in SQL zu verstehen, und bin auf dieses Bild gestoßen, von dem ich denke, dass es mir helfen könnte. Das Problem ist, dass ich es nicht ganz verstehe. Beispiel: Die Verknüpfung in der oberen rechten Ecke des Bildes, die den gesamten B-Kreis rot und nur die Überlappung von A einfärbt. Das Bild sieht so aus, als wäre Kreis B der Hauptfokus der SQL-Anweisung, aber der SQL-Anweisung selbst, beginnend mit A (wählen Sie aus A, verbinden Sie B), vermittelt mir den gegenteiligen Eindruck, nämlich dass A der Fokus der SQL-Anweisung sein würde.

In ähnlicher Weise enthält das folgende Bild nur Daten aus dem B-Kreis. Warum ist also A überhaupt in der Join-Anweisung enthalten?

Frage: Wenn Sie von rechts oben im Uhrzeigersinn arbeiten und in der Mitte enden, kann Ihnen jemand weitere Informationen zur Darstellung der einzelnen SQL-Bilder geben und diese erläutern

a) warum ein Join in jedem Fall notwendig wäre (zum Beispiel in Situationen, in denen keine Daten von A oder B genommen wurden, d. h. in denen nur A oder B, aber nicht beide farbig sind)

b) und jedes andere Detail, das verdeutlicht, warum das Bild eine gute Darstellung des SQL ist

sql join diagram

41

Ich denke, Ihre Hauptverwirrung ist, dass, wenn (zum Beispiel) nur A rot hervorgehoben ist, dies bedeutet, dass die Abfrage nur Daten zurückgibt von A ", aber in Wirklichkeit bedeutet dies, dass die Abfrage nur Daten zurückgibt für die Fälle, in denen A einen Datensatz hat". Die Abfrage enthält möglicherweise noch Daten aus B. (In Fällen, in denen Bnicht einen Datensatz enthält, ersetzt die Abfrage NULL.)

In ähnlicher Weise enthält das folgende Bild nur Daten aus dem B-Kreis. Warum ist also A überhaupt in der Join-Anweisung enthalten?

Wenn Sie meinen - das Bild, in dem A ganz in Weiß ist und es eine rote Halbmondform für den Teil von B gibt, der sich nicht mit A überschneidet, dann: Der Grund, warum A in der Abfrage angezeigt wird, ist, dass A die Datensätze in B findet, die ausgeschlossen werden müssen. (Wenn A nicht in der Abfrage enthalten wäre, würde das Venn-Diagramm A nicht enthalten, es würde nur B anzeigen, und es würde keine Möglichkeit zur Unterscheidung geben die gewünschten Datensätze von den unerwünschten.)

Das Bild lässt es so aussehen, als wäre Kreis B der Hauptfokus der SQL-Anweisung, aber die SQL-Anweisung selbst vermittelt mir, indem sie mit A beginnt (aus A auswählen, B verbinden), den gegenteiligen Eindruck, nämlich, dass A der Fokus wäre der SQL-Anweisung.

Ganz recht. Aus diesem Grund sind RIGHT JOIN Relativ selten; Obwohl eine Abfrage, die einen LEFT JOIN verwendet, fast immer so umgeordnet werden kann, dass stattdessen ein RIGHT JOIN verwendet wird (und umgekehrt), schreiben die Benutzer ihre Abfragen normalerweise mit LEFT JOIN und nicht mit RIGHT JOIN.

8
ruakh

Ich stimme Cade in Bezug auf die Einschränkungen von Venn-Diagrammen zu. Eine passendere visuelle Darstellung könnte dies sein.

Tabellen

Tables

SELECT A.Colour, B.Colour FROM A CROSS JOIN B SQL Fiddle

Der Cross Join (oder das kartesische Produkt) erzeugt ein Ergebnis mit jeder Kombination der Zeilen aus den beiden Tabellen. Jede Tabelle enthält 4 Zeilen, sodass das Ergebnis 16 Zeilen enthält.

Cross Join

SELECT A.Colour, B.Colour FROM A INNER JOIN B ON A.Colour = B.Colour SQL Fiddle

Die innere Verknüpfung gibt logisch alle Zeilen aus der Kreuzverknüpfung zurück, die der Verknüpfungsbedingung entsprechen. In diesem Fall tun fünf.

Inner Join

SELECT A.Colour, B.Colour FROM A INNER JOIN B ON A.Colour NOT IN ('Grün', 'Blau') SQL Fiddle

Die innere Verknüpfungsbedingung muss nicht unbedingt eine Gleichheitsbedingung sein, und sie muss nicht auf Spalten aus beiden (oder auch nur einer) der Tabellen verweisen. Das Auswerten von A.Colour NOT IN ('Green','Blue') für jede Zeile des Cross-Joins gibt zurück.

inner 2

Eine innere Verknüpfungsbedingung von 1=1 Würde für jede Zeile in der Kreuzverknüpfung als wahr ausgewertet, sodass die beiden äquivalent sind ( SQL Fiddle ).

SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour SQL Fiddle

Äußere Verknüpfungen werden logisch wie innere Verknüpfungen ausgewertet, mit der Ausnahme, 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 NULL -Werte für die rechten Spalten.

LOJ

SELECT A.Colour, B.Colour FROM A LEFT OUTER JOIN B ON A.Colour = B.Colour WHERE B.Colour IS NULL SQL Fiddle

Dies schränkt einfach das vorherige Ergebnis ein, um nur die Zeilen mit B.Colour IS NULL Zurückzugeben. In diesem speziellen Fall sind dies die Zeilen, die beibehalten wurden, da sie in der rechten Tabelle nicht übereinstimmten, und die Abfrage gibt die einzelne rote Zeile zurück, die in Tabelle B nicht übereinstimmt. Dies wird als Anti-Semi-Join bezeichnet.

Es ist wichtig, eine Spalte für den Test IS NULL Auszuwählen, die entweder nicht nullwertfähig ist oder für die die Verknüpfungsbedingung sicherstellt, dass alle NULL -Werte ausgeschlossen werden, damit dieses Muster ordnungsgemäß funktioniert und vermieden wird Ich bringe nur Zeilen zurück, die zufällig einen NULL -Wert für diese Spalte haben, zusätzlich zu den nicht übereinstimmenden Zeilen.

loj is null

SELECT A.Colour, B.Colour FROM A RIGHT OUTER JOIN B ON A.Colour = B.Colour SQL Fiddle

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 die linken Spalten durch Nullen erweitert werden.

ROJ

SELECT A.Colour, B.Colour FROM A FULL OUTER JOIN B ON A.Colour = B.Colour SQL Fiddle

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

FOJ

52
Martin Smith

Venn-Diagramme eignen sich zur Darstellung von Mengenoperationen wie UNION, INTERSECTS, EXCEPT usw.

Nur insoweit, als diese Mengenoperationen wie EXCEPT mit Dingen wie LEFT JOIN, WENN rhs.KEY NULL ist, simuliert werden, ist dieses Diagramm korrekt.

Sonst ist es irreführend. Beispielsweise kann ein Join dazu führen, dass sich Zeilen multiplizieren, wenn die Join-Kriterien nicht 1: 1 sind. Sets dürfen jedoch nur unterschiedliche Member enthalten, sodass diese nicht als Set-Operationen dargestellt werden können.

Dann gibt es den CROSS JOIN oder INNER JOIN ON 1 = 1 - dies ist weder analog zum INNER JOIN wie in diesem Diagramm gezeigt, noch kann das erzeugte Set wirklich durch ein Venn-Diagramm beschrieben werden. Ganz zu schweigen von allen anderen möglichen dreieckigen Verknüpfungen, Selbst- und Anti-Verknüpfungen wie:

lhs INNER JOIN rhs ON rhs.VALUE < lhs.VALUE (triangular)

oder

SELF self1
INNER JOIN SELF self2
    ON self2.key <> self1.key
    AND self1.type = self2.type

(Self Cross und Anti-Join, um alle ähnlichen Familienmitglieder außer Ihnen selbst zu finden. Self1 und Self2 sind dieselbe Menge und das Ergebnis ist eine richtige Teilmenge.)

Das Festhalten an Verknüpfungen auf Schlüsseln kann in den ersten Minuten eines Tutorials in Ordnung sein, aber dies kann zu einem schlechten Weg führen, um zu lernen, worum es bei Verknüpfungen geht. Ich denke, das haben Sie gefunden.

Diese Vorstellung, dass Venn-Diagramme JOINs im Allgemeinen auf diese Weise darstellen können, muss aufgehoben werden.

10
Cade Roux