web-dev-qa-db-fra.com

sql rejoint comme diagramme venn

J'ai eu du mal à comprendre les jointures dans sql et suis tombé sur cette image qui, je pense, pourrait m'aider. Le problème est que je ne le comprends pas complètement. Par exemple, la jointure dans le coin supérieur droit de l'image, qui colore le cercle B complet en rouge et mais uniquement le chevauchement de A. L'image donne l'impression que le cercle B est le principal objectif de l'instruction sql, mais l'instruction sql lui-même, en commençant par A (sélectionnez parmi A, joignez B), me donne l'impression opposée, à savoir que A serait le centre de l'instruction sql.

De même, l'image ci-dessous qui inclut uniquement les données du cercle B, alors pourquoi A est-il inclus dans la déclaration join?

Question: En travaillant dans le sens des aiguilles d'une montre à partir du coin supérieur droit et en terminant au centre, quelqu'un peut-il fournir plus d'informations sur la représentation de chaque image sql, en expliquant

a) pourquoi une jointure serait nécessaire dans chaque cas (par exemple, en particulier dans les situations où aucune donnée n'est extraite de A ou B, c'est-à-dire où seuls A ou B mais pas les deux sont colorés)

b) et tout autre détail qui clarifierait pourquoi l'image est une bonne représentation du sql

sql join diagram

41

Je pense que votre principale confusion sous-jacente est que lorsque (par exemple) seul A est mis en surbrillance en rouge, cela signifie que "la requête ne renvoie que des données de A ", mais en fait cela signifie" la requête ne renvoie que des données pour les cas où A a un enregistrement ". La requête peut toujours contenir des données de B. (Dans les cas où B possède pas un enregistrement, la requête remplace NULL.)

De même, l'image ci-dessous qui inclut uniquement les données du cercle B, alors pourquoi A est-il inclus dans la déclaration join?

Si vous voulez dire - l'image où A est entièrement en blanc, et il y a une forme de croissant rouge pour la partie de B qui ne chevauche pas avec A, alors: la raison pour laquelle A apparaît dans la requête est, A est la façon dont il trouve les enregistrements dans B qui doivent être exclus. (Si A n'apparaissait pas dans la requête, le diagramme de Venn n'aurait pas A, il afficherait seulement B, et il n'y aurait aucun moyen de distinguer les enregistrements souhaités parmi les indésirables.)

L'image donne l'impression que le cercle B est le principal objectif de l'instruction sql, mais l'instruction sql elle-même, en commençant par A (sélectionnez parmi A, joignez B), me donne l'impression opposée, à savoir que A serait le focus de l'instruction sql.

Très bien. Pour cette raison, RIGHT JOINs sont relativement rares; bien qu'une requête qui utilise un LEFT JOIN peut presque toujours être réorganisé pour utiliser un RIGHT JOIN à la place (et vice versa), les gens écrivent généralement leurs requêtes avec LEFT JOIN et pas avec RIGHT JOIN.

8
ruakh

Je suis d'accord avec Cade sur les limites des diagrammes Venn ici. Une représentation visuelle plus appropriée pourrait être celle-ci.

Les tables

Tables

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

La jointure croisée (ou produit cartésien) produit un résultat avec chaque combinaison des lignes des deux tables. Chaque table a 4 lignes, ce qui produit 16 lignes dans le résultat.

Cross Join

SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UNE JOINTURE INTÉRIEURE B SUR A.Colour = B.Colour SQL Fiddle

La jointure interne renvoie logiquement toutes les lignes de la jointure croisée qui correspondent à la condition de jointure. Dans ce cas, cinq le font.

Inner Join

SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UNE JOINTURE INTÉRIEURE B SUR A.Colour NOT IN ('Vert', 'Bleu') SQL Fiddle

La condition de jointure interne ne doit pas nécessairement être une condition d'égalité et elle n'a pas besoin de référencer des colonnes des deux (ou même des deux) des tables. L'évaluation de A.Colour NOT IN ('Green','Blue') sur chaque ligne de la jointure croisée renvoie.

inner 2

Une condition de jointure interne de 1=1 serait évalué à vrai pour chaque ligne de la jointure croisée, de sorte que les deux sont équivalents ( SQL Fiddle ).

SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UNE GAUCHE EXTÉRIEURE JOINDRE B SUR A.Colour = B.Colour SQL Fiddle

Les jointures externes sont évaluées logiquement de la même manière que les jointures internes, sauf que si une ligne de la table de gauche (pour une jointure de gauche) ne se joint à aucune ligne de la table de droite, elle est conservée dans le résultat avec NULL valeurs pour les colonnes de droite.

LOJ

SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UNE GAUCHE EXTÉRIEURE JOINDRE B SUR A.Colour = B.Colour OERE B.Colour IS NULL SQL Fiddle

Cela limite simplement le résultat précédent pour renvoyer uniquement les lignes où B.Colour IS NULL. Dans ce cas particulier, ce seront les lignes qui ont été conservées car elles n'avaient aucune correspondance dans le tableau de droite et la requête renvoie la seule ligne rouge non correspondante dans le tableau B. Ceci est connu comme un anti semi jointure.

Il est important de sélectionner une colonne pour le IS NULL test qui ne peut pas être annulé ou pour lequel la condition de jointure garantit que toutes les valeurs NULL seront exclues afin que ce modèle fonctionne correctement et éviter de simplement ramener des lignes qui se trouvent avoir un NULL valeur pour cette colonne en plus des lignes non appariées.

loj is null

SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UN DROIT OU EXTÉRIEUR JOINDRE B SUR A.Colour = B.Colour SQL Fiddle

Les jointures externes droites agissent de la même manière que les jointures externes gauche, sauf qu'elles conservent les lignes non correspondantes du tableau de droite et étendent null les colonnes de gauche.

ROJ

SÉLECTIONNEZ A.Colour, B.Colour À PARTIR D'UN JOINT EXTÉRIEUR B SUR A.Colour = B.Colour SQL Fiddle

Les jointures externes complètes combinent le comportement des jointures gauche et droite et préservent les lignes non correspondantes des tables gauche et droite.

FOJ

52
Martin Smith

Les diagrammes de Venn conviennent pour représenter des opérations d'ensemble telles que UNION, INTERSECTS, EXCEPT etc.

Dans la mesure où ces opérations d'ensemble comme EXCEPT sont simulées avec des choses comme LEFT JOIN WHERE rhs.KEY est NULL, ce diagramme est précis.

Sinon, c'est trompeur. Par exemple, toute jointure peut entraîner la multiplication des lignes si les critères de jointure ne sont pas 1: 1. Mais les ensembles ne peuvent contenir que des membres distincts, de sorte que ceux-ci ne peuvent pas être représentés comme des opérations d'ensemble.

Ensuite, il y a le CROSS JOIN ou INNER JOIN ON 1 = 1 - ce n'est ni analogue au INNER JOIN comme le montre ce diagramme, ni l'ensemble qui est produit ne peut être vraiment décrit par un diagramme de Venn. Sans oublier toutes les autres jointures triangulaires possibles, auto et anti-jointures comme:

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

ou

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

(auto-croisement et anti-jointure pour trouver tous les membres de la famille similaires sauf vous-même - self1 et self2 sont le même ensemble et le résultat est un sous-ensemble approprié)

S'en tenir aux jointures sur les clés peut être correct pendant les premières minutes d'un didacticiel, mais cela peut conduire à un mauvais chemin pour en savoir plus sur les jointures. Je pense que c'est ce que vous avez trouvé.

Cette idée que les diagrammes de Venn peuvent représenter les JOIN en général de cette façon doit disparaître.

10
Cade Roux