sql rejoint le diagramme de venn
j'ai eu des difficultés à comprendre se joint à sql et est venu sur cette image qui je pense pourrait m'aider. Le problème est que je ne comprends pas tout. Par exemple, la jointure dans le coin supérieur droit de L'image, qui colore le plein cercle B Rouge et mais seulement le chevauchement de A. l'image le fait paraître comme le cercle B est le point de mire principal de la déclaration sql, mais la déclaration sql elle-même, en commençant par A (sélectionner de A, joindre B), transmet l'impression opposée à moi, à savoir que A serait l'objet de la déclaration sql.
de la même façon, l'image ci-dessous qui n'inclut que les données du cercle B, alors pourquoi A est inclus dans la déclaration join?
Question: travailler dans le sens des aiguilles d'une montre à partir du haut à droite et finir 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, particulièrement dans les situations où aucune donnée n'est prise à partir D'un ou B c'est à dire où seulement Un ou B, mais pas les deux est de couleur)
b) et tout autre détail qui clarifierait pourquoi l'image est une bonne représentation du sql
5 réponses
je pense que votre principal sous-jacent à la confusion, c'est que quand (par exemple) que A
est mis en surbrillance en rouge, vous prenez cela pour signifier "la requête ne renvoie que des données A
", mais en fait cela signifie "la requête ne renvoie que des données pour les cas où A
a un dossier". La requête peut toujours contenir des données de B. (pour les cas où B
avoir un enregistrement, la requête sera remplacer NULL
.)
de même, l'image ci-dessous ne comprend que 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 se chevauchent pas avec A
puis:A
apparaît dans la requête est, A
est la façon dont il trouve les enregistrements B
qui doivent être exclus. (Si A
n'apparaît pas dans la requête, puis Venn diagramme n'aurait pas A
, cela ne ferait que montrer B
, et il n'y aurait aucun moyen de distinguer les documents souhaités à partir de l'indésirables.)
L'image donne l'impression que le cercle B est l'objectif principal de l'instruction sql, mais l'instruction sql lui-même, en commençant par Un (sélectionner à partir, rejoindre B), exprime le sentiment contraire pour moi, à savoir que l'Un serait au centre de l'instruction sql.
Tout à fait raison. Pour cette raison, RIGHT JOIN
relativement rare; bien qu'une requête qui utilise un LEFT JOIN
peut presque toujours être commandé de nouveau à l'aide d'un RIGHT JOIN
à la place (et vice versa), les gens écrivent habituellement leurs requêtes avec LEFT JOIN
et non RIGHT JOIN
.
je suis d'accord avec Cade sur les limites des diagrammes de Venn ici. Une représentation visuelle plus pertinente pourrait être celle-ci.
Tableaux
choisir A. Couleur, B. Couleur D'une croix joindre B SQL Fiddle
La jointure croisée (ou produit cartésien) produit un résultat avec toutes les combinaisons de lignes des deux tables. Chaque tableau a 4 lignes donc cela produit 16 lignes dans le résultat.
choisir A. Couleur, B. Couleur À partir de la jointure intérieure B ON A. Couleur = B. Couleur SQL Fiddle
la jointure interne renvoie logiquement toutes les lignes de la jointure croisée qui correspondent à la condition jointure. Dans ce cas, cinq faire.
sélectionner A. Couleur, B. Couleur À partir D'une jointure intérieure B ON A. Couleur non indiquée ("Vert", "Bleu") SQL Fiddle
la jointure interne condition ne doit pas nécessairement être une condition d'égalité et il n'a pas besoin de colonnes de référence à la fois (ou même l'un ou l'autre) des tableaux. Évaluer A.Colour NOT IN ('Green','Blue')
sur chaque ligne de la jointure croisée des rendements.
une condition interne de jointure de 1=1
évaluer la valeur true pour chaque ligne de la jointure croisée de sorte que les deux sont équivalents ( SQL Fiddle).
sélectionner A. Couleur, B. Couleur À partir de la jointure extérieure gauche B ON A. Couleur = B. Couleur SQL Violon
les jointures externes sont logiquement évaluées de la même manière que les jointures internes sauf que si une rangée de la table de gauche (pour une jointure gauche) ne se joint pas avec n'importe quelle rangée de la table de droite du tout il est conservé dans le résultat avec NULL
valeurs pour les colonnes de droite.
sélectionner A. Couleur, B. Couleur À partir de la jointure extérieure gauche B ON A. Couleur = B. Couleur où B. Couleur est nulle SQL Violon
ceci restreint simplement le résultat précédent pour retourner Seulement les lignes où B.Colour IS NULL
. Dans ce cas particulier, ce sont les lignes qui ont été préservées car elles n'avaient aucune correspondance dans la table de droite et la requête renvoie la seule ligne rouge non appariée dans la table B
. Ceci est connu sous le nom d'anti semi jointure.
Il est important de sélectionner une colonne pour le IS NULL
test qui n'est pas nul ou pour lequel la condition jointure assure que tout NULL
les valeurs seront exclues pour que ce modèle fonctionne correctement et éviter de simplement ramener des lignes qui ont un NULL
valeur pour cette colonne en plus de l'onu lignes correspondantes.
choisir A. Couleur, B. Couleur À partir D'une jointure extérieure droite B ON A. Couleur = B. Couleur SQL Fiddle
les jointures externes de droite agissent de la même façon que les jointures externes de gauche sauf qu'elles préservent les lignes non correspondantes de la table de droite et s'étendent null les colonnes de gauche.
choisir A. Couleur, B. Couleur À partir D'une jointure extérieure complète B ON A. Couleur = B. Couleur SQL Fiddle
jointures externes intégrales combinez le comportement des jointures gauche et droite et conservez les lignes non correspondantes des tables de gauche et de droite.
les diagrammes de Venn sont appropriés pour représenter des opérations de série telles que UNION, INTERSECTS, excepté etc.
dans la mesure seulement que ces opérations de jeu comme excepté sont simulées avec des choses comme la jointure gauche où rhs.La clé est nulle, ce diagramme est exact.
sinon c'est trompeur. Par exemple, n'importe quelle jointure peut provoquer la multiplication des lignes si les critères de jointure ne sont pas 1:1. Mais les ensembles ne sont autorisés à contenir que des membres distincts, de sorte que ceux-ci ne peuvent pas être représentés comme ensemble opérations.
puis il y a la jointure croisée ou la jointure interne sur 1 = 1 - ce n'est pas analogue à la jointure interne comme montré dans ce diagramme, ni peut l'ensemble qui est produit être vraiment décrit par un diagramme de Venn. Sans parler de tous les autres triangulaires possibles jointures, self 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 cross et anti-joignez-vous à trouver tous les mêmes membres de la famille à l'exception de vous-même - self1 et self2 sont les mêmes et le résultat est un sous-ensemble propre)
coller aux jointures sur les touches peut être bien pour les premières minutes d'un tutoriel, mais cela peut conduire à un mauvais chemin pour apprendre ce que les jointures sont sur. Je pense que c'est ce que vous avez trouvé.
cette idée que les diagrammes de Venn peuvent représenter rejoint généralement de cette façon doit disparaître.
quand vous faites une jointure, il est probable que vos deux tables ne correspondent pas parfaitement. Plus précisément, il peut y avoir des lignes dans A qui ne correspondent à rien dans B, ou des lignes dupliquées dans A qui correspondent à une seule ligne dans B, et vice-versa.
Lorsque cela se produit, vous avez un choix:
- pour chaque A, prendre un seul B qui fonctionne, s'il y en a un. (en haut à gauche)
- prendre chaque paire qui correspond entièrement (jeter toutes celles qui sont manquantes soit a ou B -- center)
- pour chaque B, prendre un simple A qui fonctionne, s'il y en a un (en haut à droite)
- TOUT prendre (en bas à gauche)
centre gauche et droite sont techniquement des jointures, mais inutiles; elles pourraient probablement être écrites plus efficacement SELECT <select_list> FROM TableA A WHERE A.Key NOT IN (SELECT B.Key FROM TableB B)
(ou l'inverse).
En réponse directe à votre confusion, RIGHT JOIN
dit "l'expression suivante est l'objet de cette requête".
En bas à droite c'est assez étrange, et je ne vois aucune raison pour que vous envie de cela. Il renvoie les résultats des deux requêtes externes du milieu, mélangées avec NULL
's dans toutes les colonnes du tableau ci-contre.
pour la jointure droite, oui la syntaxe peut être confuse, mais oui c'est ce qu'elle semble être. Quand vous dites "TableA RIGHT JOIN TableB", C'est en effet dire que TableB est la table principale à laquelle vous faites référence et TableA est juste accroché où il a des enregistrements correspondants. Cela lit bizarre dans les requêtes, parce que TableA est listée en premier donc votre cerveau lui attribue automatiquement plus de priorité, même si TableB est vraiment la table la plus importante dans la requête. Pour cette raison, vous rarement en fait, voir à droite rejoint en code réel.
donc au lieu de A et B, prenons deux choses qui sont faciles à suivre. Supposez qu'on ait deux tables pour l'info des gens, ShoeSize et IQ. Vous avez ShoeSize info pour certaines personnes, IQ info pour certaines personnes. Et avoir une personnalité sur les deux tables que vous pouvez rejoindre.
dans le sens des aiguilles d'une montre à partir du haut à droite (même si cela commence avec certains des cas les plus compliqués et les plus compliqués):
- ShoeSize RIGHT JOIN IQ - >donnez-moi toute l'information sur le QI. Incluez toute information de ShoeSize pour ces personnes si nous l'avons.
- ShoeSize RIGHT JOIN IQ WHERE ShowSize.PersonID = NULL - > Donnez-moi toute l'information sur le QI, mais seulement pour les gens qui n'ont pas d'information sur la taille des chaussures
- ShoeSize FULL OUTER JOIN IQ WHERE ShoeSize.PersonID = NULL et IQ.PersonID = NULL - > Donnez - moi l'information sur la pointure des chaussures seulement pour les gens qui n'ont pas l'information sur le QI, plus l'information sur le QI pour les gens qui n'ont pas la pointure des chaussures info
- ShoeSize JOINTURE EXTERNE COMPLÈTE IQ -> Donne-moi tout, toutes les tailles de chaussure et toutes les données IQ. Si les enregistrements ShoeSizes et IQ ont le même nom de personne, les inclure dans une rangée.
- ShoeSize LEFT JOIN IQ WHERE IQ.PersonID = NULL - > Donnez-moi toutes les informations sur la taille des chaussures, mais seulement pour les gens qui n'ont pas d'information sur le QI
- ShoeSize LEFT JOIN IQ - > Give me all of the shoe size info. Incluez toute information sur le QI pour ces personnes si nous l'avons.