Cela dépend aussi de votre niveau de compréhension, pour quelqu'un comme vous cet article ne fait rien mais pour quelqu'un qui ne comprend peut-être pas tout à fait les jointures, c'est assez clair
Exemple simple : disons que vous avez une Studentstable et une Lockerstable. En SQL, la première table que vous spécifiez dans une jointure, Studentsest la table LEFT , et la seconde ,,Lockers est la table RIGHT .
Chaque élève peut être affecté à un casier, il y a donc une LockerNumbercolonne dans le Studenttableau. Plus d'un élève peut potentiellement se trouver dans un seul casier, mais surtout au début de l'année scolaire, certains élèves entrants peuvent ne pas avoir de casier et certains casiers sans étudiants.
Pour les besoins de cet exemple, disons que vous avez 100 élèves , dont 70 ont des casiers. Vous avez un total de 50 casiers , dont 40 ont au moins 1 étudiant et 10 casiers n'ont aucun étudiant.
INNER JOIN équivaut à " me montrer tous les étudiants avec des casiers ".
Tous les étudiants sans casiers, ou tous les casiers sans étudiants manquent. Renvoie 70 lignes
LEFT OUTER JOIN serait " montrez-moi tous les étudiants, avec leur casier correspondant s'ils en ont un ".
Il peut s'agir d'une liste générale d'étudiants ou peut être utilisé pour identifier des étudiants sans casier. Renvoie 100 lignes
RIGHT OUTER JOIN serait " montrez-moi tous les casiers et les étudiants qui leur sont affectés s'il y en a ".
Cela pourrait être utilisé pour identifier les casiers auxquels aucun étudiant n'est affecté ou les casiers qui ont trop d'étudiants. Renvoie 80 lignes (liste de 70 étudiants dans les 40 casiers, plus les 10 casiers sans étudiant)
JOINTURE EXTÉRIEURE COMPLÈTE serait idiot et probablement peu utile.
Quelque chose comme " montrez-moi tous les étudiants et tous les casiers, et faites-les correspondre où vous le pouvez " Renvoie 110 lignes (tous les 100 étudiants, y compris ceux sans casiers. Plus les 10 casiers sans étudiant)
CROSS JOIN est également assez idiot dans ce scénario. Il n'utilise pas le lockernumberchamp lié dans la table des étudiants, vous vous retrouvez donc avec une grande liste géante de tous les appariements étudiants-casiers possibles, qu'ils existent ou non. Renvoie 5000 lignes (100 étudiants x 50 casiers). Peut être utile (avec filtrage) comme point de départ pour faire correspondre les nouveaux étudiants avec les casiers vides.
En utilisant votre exemple, la jointure CROSS serait utile comme point de départ pour créer des affectations de casiers: commencez par toutes les combinaisons possibles, puis utilisez d'autres critères pour filtrer les résultats de la liste.
Joel Coehoorn
1
Bonne réponse. Je crois que la jointure croisée est le plus souvent utilisée pour générer des données de test à partir de quelques lignes lorsque vous avez besoin d'un grand nombre d'enregistrements.
Eli
6
FULL OUTER JOINS peut être utile lors de la recherche de données orphelines ou lors de la comparaison de différentes versions du même ensemble de données.
Lara Dougan
3
Cross join aka produit cartésien
JavaRocky
3
Je pense que la façon dont vous commencez votre requête a un impact sur le résultat du type de jointure. Par exemple, SELECT * FROM students RIGHT OUTER JOIN lockers...entraînerait un résultat différent de celui SELECT * FROM lockers RIGHT OUTER JOIN students.... Excellente réponse, mais j'aimerais la voir mise à jour avec des SQLrequêtes complètes
jbmilgrom
141
Il existe trois types de base de jointure:
INNERjoin compare deux tables et renvoie uniquement les résultats là où une correspondance existe. Les enregistrements de la 1ère table sont dupliqués lorsqu'ils correspondent à plusieurs résultats dans la 2ème. Les jointures INNER ont tendance à réduire les jeux de résultats, mais comme les enregistrements peuvent être dupliqués, cela n'est pas garanti.
CROSSjoin compare deux tables et renvoie toutes les combinaisons possibles de lignes des deux tables. Vous pouvez obtenir beaucoup de résultats de ce type de jointure qui peuvent même ne pas être significatifs, alors utilisez-les avec prudence.
OUTERjoin compare deux tables et renvoie des données lorsqu'une correspondance est disponible ou des valeurs NULL dans le cas contraire. Comme avec la jointure INNER, cela dupliquera les lignes dans une table lorsqu'elle correspond à plusieurs enregistrements dans l'autre table. Les jointures externes ont tendance à agrandir les ensembles de résultats, car elles ne suppriment pas en elles-mêmes les enregistrements de l'ensemble. Vous devez également qualifier une jointure OUTER pour déterminer quand et où ajouter les valeurs NULL:
LEFT signifie conserver tous les enregistrements de la 1ère table quoi qu'il arrive et insérer des valeurs NULL lorsque la 2ème table ne correspond pas.
RIGHT signifie le contraire: conserver tous les enregistrements de la 2ème table, peu importe quoi et insérer des valeurs NULL quand la 1ère table ne correspond pas.
FULL signifie conserver tous les enregistrements des deux tables et insérer une valeur NULL dans l'une ou l'autre table s'il n'y a pas de correspondance.
Souvent, le OUTERmot clé est omis de la syntaxe. Au lieu de cela, ce sera simplement "LEFT JOIN", "RIGHT JOIN" ou "FULL JOIN". Cela est dû au fait que les jointures INNER et CROSS n'ont aucune signification par rapport à LEFT, RIGHT ou FULL, et donc elles suffisent à elles seules pour indiquer sans ambiguïté une jointure OUTER.
Voici un exemple de l'utilisation de chaque type:
INNER: Vous souhaitez renvoyer tous les enregistrements de la table "Facture", ainsi que leurs "Lignes de facture" correspondantes. Cela suppose que chaque facture valide aura au moins une ligne.
OUTER: Vous souhaitez renvoyer tous les enregistrements "InvoiceLines" pour une facture particulière, ainsi que leurs enregistrements "InventoryItem" correspondants. Il s'agit d'une entreprise qui vend également des services, de sorte que toutes les InvoiceLines n'auront pas un IventoryItem.
CROSS: Vous avez un tableau de chiffres avec 10 lignes, chacune contenant des valeurs de «0» à «9». Vous souhaitez créer une table de plage de dates à laquelle vous souhaitez vous joindre, afin de vous retrouver avec un enregistrement pour chaque jour de la plage. En joignant plusieurs fois cette table avec elle-même, vous pouvez créer autant d'entiers consécutifs que nécessaire (étant donné que vous commencez à 10 à la 1ère puissance, chaque jointure ajoute 1 à l'exposant). Utilisez ensuite la fonction DATEADD () pour ajouter ces valeurs à votre date de base pour la plage.
Agréable. J'ajouterais qu'en général, si vous écrivez seulement "JOIN", cela signifie INNER JOIN.
matpop
47
Il n'y a que 4 types:
Jointure interne : le type le plus courant. Une ligne de sortie est produite pour chaque paire de lignes d'entrée qui correspondent aux conditions de jointure.
Jointure externe gauche : identique à une jointure interne, sauf que s'il y a une ligne pour laquelle aucune ligne correspondante dans le tableau de droite ne peut être trouvée, une ligne est sortie contenant les valeurs du tableau de gauche, avec NULLpour chaque valeur dans le tableau de droite. Cela signifie que chaque ligne du tableau de gauche apparaîtra au moins une fois dans la sortie.
Jointure extérieure droite : identique à une jointure externe gauche, sauf avec les rôles des tables inversés.
Jointure externe complète : combinaison de jointures externes gauche et droite. Chaque ligne des deux tables apparaîtra dans la sortie au moins une fois.
Une "jointure croisée" ou "jointure cartésienne" est simplement une jointure interne pour laquelle aucune condition de jointure n'a été spécifiée, entraînant la sortie de toutes les paires de lignes.
Merci à RusselH d'avoir souligné les jointures complètes, que j'avais omises.
qu'en est-il de la jointure externe complète et de la jointure croisée (produit cartésien)?
SQLMenace
complet est vraiment l'équivalent de deux jointures externes
RussellH
25
PLEIN est ce que vous obtenez lorsque vous vissez votre jointure intérieure, puis vous posez une question ici "pourquoi ai-je N ^ 2 lignes au lieu de N"? Ensuite, tout le monde reçoit CROSS sur vous.
Paul Tomblin
24
Différence SQL JOINS:
Très simple à retenir:
INNER JOIN n'afficher que les enregistrements communs aux deux tables.
OUTER JOIN tout le contenu des deux tableaux est fusionné, qu'ils correspondent ou non.
LEFT JOINest identique à LEFT OUTER JOIN- (Sélectionnez les enregistrements de la première table (la plus à gauche) avec les enregistrements de la table de droite correspondants.)
RIGHT JOINest identique à RIGHT OUTER JOIN- (Sélectionnez les enregistrements de la deuxième table (la plus à droite) avec les enregistrements de la table de gauche correspondants.)
Il existe un moyen correct et pertinent d'étiqueter les cercles du diagramme de Venn, mais ce n'est pas ça. Les cercles ne sont pas les tables d'entrée. De plus, les lignes de résultat ne sont pas des lignes d'entrée, votre description est donc incorrecte. De plus, cela n'est tout simplement pas clair - vous n'expliquez pas "commun aux deux", "correspondant", "fusionné".
Jointure interne - Étant donné deux tables, une jointure interne renvoie toutes les lignes qui existent dans les deux tables
jointure gauche / droite (externe) - Étant donné que deux tables renvoient toutes les lignes qui existent dans la table gauche ou droite de votre jointure, plus les lignes de l'autre côté seront renvoyées lorsque la clause join est une correspondance ou null sera renvoyé pour ces colonnes
Full Outer - Étant donné que deux tables renvoient toutes les lignes, et renverront des valeurs nulles lorsque la colonne de gauche ou de droite n'est pas là
Jointures croisées - jointure cartésienne et peut être dangereuse si elle n'est pas utilisée avec précaution
Le rendre plus visible pourrait aider. Un exemple:
Tableau 1:
ID_STUDENT STUDENT_NAME
1 Raony
2 Diogo
3 Eduardo
4 Luiz
Tableau 2:
ID_STUDENT LOCKER
3 l1
4 l2
5 l3
Ce que j'obtiens quand je fais:
-InnerjoinofTable1andTable2:-Innerjoin returns both tables merged only when the key(ID_STUDENT)existsin both tables
ID_STUDENT STUDENT_NAME LOCKER
3 Eduardo l1
4 Luiz l2
-LeftjoinofTable1andTable2:-Leftjoin merges both tables withall records form table1,in
other words, there might be non-populated fields fromtable2
ID_ESTUDANTE NOME_ESTUDANTE LOCKER
1 Raony -2 Diogo -3 Eduardo l1
4 Luiz l2
-Rightjoinoftable1andtable2:-Rightjoin merges both tables withall records fromtable2,in
other words, there might be non-populated fields fromtable1
ID_STUDENT STUDENT_NAME LOCKER
3 Eduardo l1
4 Luiz l2
5- l3
-Outter joinoftable1andtable2:- Returns all records from both tables,in other words, there
might be non-populated fields either fromtable1or2.
ID_STUDENT STUDENT_NAME LOCKER
1 Raony -2 Diogo -3 Eduardo l1
4 Luiz l2
5- l3
Au début, vous devez comprendre ce que fait Join? Nous connectons plusieurs tables et obtenons un résultat spécifique des tables jointes. La façon la plus simple de le faire est la jointure croisée .
Disons que la table A a deux colonnes A et B. Et la table B a trois colonnes C et D. Si nous appliquons la jointure croisée, cela produira beaucoup de lignes sans signification. Ensuite, nous devons faire correspondre la clé primaire pour obtenir des données réelles.
La gauche: il renverra tous les enregistrements de la table de gauche et l'enregistrement correspondant de la table de droite.
Droite: il reviendra en face de la jointure gauche. Il renverra tous les enregistrements de la table de droite et les enregistrements correspondants de la table de gauche.
Inner: C'est comme l'intersection. Il renverra uniquement les enregistrements correspondants des deux tables.
Outer: Et c'est comme l'union. Il renverra tous les enregistrements disponibles des deux tables.
Parfois, nous n'avons pas besoin de toutes les données, et nous ne devons également avoir besoin que de données ou d'enregistrements communs. nous pouvons facilement l'obtenir en utilisant ces méthodes de jointure. N'oubliez pas que les jointures gauche et droite sont également des jointures externes.
Vous pouvez obtenir tous les enregistrements en utilisant simplement la jointure croisée. Mais cela pourrait coûter cher pour des millions d'enregistrements. Donc, faites simple en utilisant la jointure gauche, droite, intérieure ou extérieure.
Réponses:
Exemple simple : disons que vous avez une
Students
table et uneLockers
table. En SQL, la première table que vous spécifiez dans une jointure,Students
est la table LEFT , et la seconde ,,Lockers
est la table RIGHT .Chaque élève peut être affecté à un casier, il y a donc une
LockerNumber
colonne dans leStudent
tableau. Plus d'un élève peut potentiellement se trouver dans un seul casier, mais surtout au début de l'année scolaire, certains élèves entrants peuvent ne pas avoir de casier et certains casiers sans étudiants.Pour les besoins de cet exemple, disons que vous avez 100 élèves , dont 70 ont des casiers. Vous avez un total de 50 casiers , dont 40 ont au moins 1 étudiant et 10 casiers n'ont aucun étudiant.
INNER JOIN équivaut à " me montrer tous les étudiants avec des casiers ".
Tous les étudiants sans casiers, ou tous les casiers sans étudiants manquent.
Renvoie 70 lignes
LEFT OUTER JOIN serait " montrez-moi tous les étudiants, avec leur casier correspondant s'ils en ont un ".
Il peut s'agir d'une liste générale d'étudiants ou peut être utilisé pour identifier des étudiants sans casier.
Renvoie 100 lignes
RIGHT OUTER JOIN serait " montrez-moi tous les casiers et les étudiants qui leur sont affectés s'il y en a ".
Cela pourrait être utilisé pour identifier les casiers auxquels aucun étudiant n'est affecté ou les casiers qui ont trop d'étudiants.
Renvoie 80 lignes (liste de 70 étudiants dans les 40 casiers, plus les 10 casiers sans étudiant)
JOINTURE EXTÉRIEURE COMPLÈTE serait idiot et probablement peu utile.
Quelque chose comme " montrez-moi tous les étudiants et tous les casiers, et faites-les correspondre où vous le pouvez "
Renvoie 110 lignes (tous les 100 étudiants, y compris ceux sans casiers. Plus les 10 casiers sans étudiant)
CROSS JOIN est également assez idiot dans ce scénario.
Il n'utilise pas le
lockernumber
champ lié dans la table des étudiants, vous vous retrouvez donc avec une grande liste géante de tous les appariements étudiants-casiers possibles, qu'ils existent ou non.Renvoie 5000 lignes (100 étudiants x 50 casiers). Peut être utile (avec filtrage) comme point de départ pour faire correspondre les nouveaux étudiants avec les casiers vides.
la source
SELECT * FROM students RIGHT OUTER JOIN lockers...
entraînerait un résultat différent de celuiSELECT * FROM lockers RIGHT OUTER JOIN students...
. Excellente réponse, mais j'aimerais la voir mise à jour avec desSQL
requêtes complètesIl existe trois types de base de jointure:
INNER
join compare deux tables et renvoie uniquement les résultats là où une correspondance existe. Les enregistrements de la 1ère table sont dupliqués lorsqu'ils correspondent à plusieurs résultats dans la 2ème. Les jointures INNER ont tendance à réduire les jeux de résultats, mais comme les enregistrements peuvent être dupliqués, cela n'est pas garanti.CROSS
join compare deux tables et renvoie toutes les combinaisons possibles de lignes des deux tables. Vous pouvez obtenir beaucoup de résultats de ce type de jointure qui peuvent même ne pas être significatifs, alors utilisez-les avec prudence.OUTER
join compare deux tables et renvoie des données lorsqu'une correspondance est disponible ou des valeurs NULL dans le cas contraire. Comme avec la jointure INNER, cela dupliquera les lignes dans une table lorsqu'elle correspond à plusieurs enregistrements dans l'autre table. Les jointures externes ont tendance à agrandir les ensembles de résultats, car elles ne suppriment pas en elles-mêmes les enregistrements de l'ensemble. Vous devez également qualifier une jointure OUTER pour déterminer quand et où ajouter les valeurs NULL:LEFT
signifie conserver tous les enregistrements de la 1ère table quoi qu'il arrive et insérer des valeurs NULL lorsque la 2ème table ne correspond pas.RIGHT
signifie le contraire: conserver tous les enregistrements de la 2ème table, peu importe quoi et insérer des valeurs NULL quand la 1ère table ne correspond pas.FULL
signifie conserver tous les enregistrements des deux tables et insérer une valeur NULL dans l'une ou l'autre table s'il n'y a pas de correspondance.Souvent, le
OUTER
mot clé est omis de la syntaxe. Au lieu de cela, ce sera simplement "LEFT JOIN", "RIGHT JOIN" ou "FULL JOIN". Cela est dû au fait que les jointures INNER et CROSS n'ont aucune signification par rapport à LEFT, RIGHT ou FULL, et donc elles suffisent à elles seules pour indiquer sans ambiguïté une jointure OUTER.Voici un exemple de l'utilisation de chaque type:
INNER
: Vous souhaitez renvoyer tous les enregistrements de la table "Facture", ainsi que leurs "Lignes de facture" correspondantes. Cela suppose que chaque facture valide aura au moins une ligne.OUTER
: Vous souhaitez renvoyer tous les enregistrements "InvoiceLines" pour une facture particulière, ainsi que leurs enregistrements "InventoryItem" correspondants. Il s'agit d'une entreprise qui vend également des services, de sorte que toutes les InvoiceLines n'auront pas un IventoryItem.CROSS
: Vous avez un tableau de chiffres avec 10 lignes, chacune contenant des valeurs de «0» à «9». Vous souhaitez créer une table de plage de dates à laquelle vous souhaitez vous joindre, afin de vous retrouver avec un enregistrement pour chaque jour de la plage. En joignant plusieurs fois cette table avec elle-même, vous pouvez créer autant d'entiers consécutifs que nécessaire (étant donné que vous commencez à 10 à la 1ère puissance, chaque jointure ajoute 1 à l'exposant). Utilisez ensuite la fonction DATEADD () pour ajouter ces valeurs à votre date de base pour la plage.la source
Il n'y a que 4 types:
NULL
pour chaque valeur dans le tableau de droite. Cela signifie que chaque ligne du tableau de gauche apparaîtra au moins une fois dans la sortie.Une "jointure croisée" ou "jointure cartésienne" est simplement une jointure interne pour laquelle aucune condition de jointure n'a été spécifiée, entraînant la sortie de toutes les paires de lignes.
Merci à RusselH d'avoir souligné les jointures complètes, que j'avais omises.
la source
Différence SQL JOINS:
Très simple à retenir:
INNER JOIN
n'afficher que les enregistrements communs aux deux tables.OUTER JOIN
tout le contenu des deux tableaux est fusionné, qu'ils correspondent ou non.LEFT JOIN
est identique àLEFT OUTER JOIN
- (Sélectionnez les enregistrements de la première table (la plus à gauche) avec les enregistrements de la table de droite correspondants.)RIGHT JOIN
est identique àRIGHT OUTER JOIN
- (Sélectionnez les enregistrements de la deuxième table (la plus à droite) avec les enregistrements de la table de gauche correspondants.)la source
Découvrez Join (SQL) sur Wikipedia
jointure gauche / droite (externe) - Étant donné que deux tables renvoient toutes les lignes qui existent dans la table gauche ou droite de votre jointure, plus les lignes de l'autre côté seront renvoyées lorsque la clause join est une correspondance ou null sera renvoyé pour ces colonnes
Full Outer - Étant donné que deux tables renvoient toutes les lignes, et renverront des valeurs nulles lorsque la colonne de gauche ou de droite n'est pas là
Jointures croisées - jointure cartésienne et peut être dangereuse si elle n'est pas utilisée avec précaution
la source
Le rendre plus visible pourrait aider. Un exemple:
Tableau 1:
ID_STUDENT STUDENT_NAME
Tableau 2:
ID_STUDENT LOCKER
Ce que j'obtiens quand je fais:
la source
LEFT JOIN
etRIGHT JOIN
sont des types de parOUTER JOIN
.INNER JOIN
est la valeur par défaut - les lignes des deux tables doivent correspondre à la condition de jointure.la source
Jointure interne : affiche uniquement les lignes, quand a-t-elle des données des deux tables.
Jointure externe : (gauche / droite) : Voir le résultat de la toute gauche / droite table avec les lignes jumelées ( s ), si elle existe ou non.
la source
Au début, vous devez comprendre ce que fait Join? Nous connectons plusieurs tables et obtenons un résultat spécifique des tables jointes. La façon la plus simple de le faire est la jointure croisée .
Disons que la table A a deux colonnes A et B. Et la table B a trois colonnes C et D. Si nous appliquons la jointure croisée, cela produira beaucoup de lignes sans signification. Ensuite, nous devons faire correspondre la clé primaire pour obtenir des données réelles.
La gauche: il renverra tous les enregistrements de la table de gauche et l'enregistrement correspondant de la table de droite.
Droite: il reviendra en face de la jointure gauche. Il renverra tous les enregistrements de la table de droite et les enregistrements correspondants de la table de gauche.
Inner: C'est comme l'intersection. Il renverra uniquement les enregistrements correspondants des deux tables.
Outer: Et c'est comme l'union. Il renverra tous les enregistrements disponibles des deux tables.
Parfois, nous n'avons pas besoin de toutes les données, et nous ne devons également avoir besoin que de données ou d'enregistrements communs. nous pouvons facilement l'obtenir en utilisant ces méthodes de jointure. N'oubliez pas que les jointures gauche et droite sont également des jointures externes.
Vous pouvez obtenir tous les enregistrements en utilisant simplement la jointure croisée. Mais cela pourrait coûter cher pour des millions d'enregistrements. Donc, faites simple en utilisant la jointure gauche, droite, intérieure ou extérieure.
Merci
la source