Quelle est la différence entre les jointures gauche, droite, extérieure et intérieure?

562

Je me demande comment différencier toutes ces jointures différentes ...

MrM
la source
60
de Coding Horror Une explication visuelle des jointures SQL
SQLMenace
3
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
SQLMenace
6
Ceci est un doublon de stackoverflow.com/questions/419375/sql-join-differences et sans aucun doute d'autres ...
cletus
1
Cela m'a beaucoup aidé ... le plus simple est de faire des tables de test et de jouer avec. = P
daGrevis
1
doublon possible de la différence entre jointure interne et externe
tacaswell

Réponses:

797

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.

BradC
la source
12
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.
Joel Coehoorn
la source
1
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:

  1. 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.
  2. 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.
  3. Jointure extérieure droite : identique à une jointure externe gauche, sauf avec les rôles des tables inversés.
  4. 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.

j_random_hacker
la source
1
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.)

entrez la description de l'image ici

Laxmi
la source
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é".
philipxy
9

Découvrez Join (SQL) sur Wikipedia

  • 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

JoshBerke
la source
6

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:

-Inner join of Table 1 and Table 2: 

    - Inner join returns both tables merged only when the key 
      (ID_STUDENT) exists in both tables

    ID_STUDENT       STUDENT_NAME      LOCKER   

        3               Eduardo          l1
        4               Luiz             l2

-Left join of Table 1 and Table 2:

    - Left join merges both tables with all records form table 1, in 
      other words, there might be non-populated fields from table 2

    ID_ESTUDANTE    NOME_ESTUDANTE     LOCKER   

        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2

-Right join of table 1 and table 2:

    - Right join merges both tables with all records from table 2, in 
      other words, there might be non-populated fields from table 1

    ID_STUDENT        STUDENT_NAME     LOCKER   

        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3

-Outter join of table 1 and table 2:

    - Returns all records from both tables, in other words, there
      might be non-populated fields either from table 1 or 2.

    ID_STUDENT        STUDENT_NAME     LOCKER   
        1               Raony            -
        2               Diogo            -
        3               Eduardo          l1
        4               Luiz             l2
        5               -                l3
lfvv
la source
4

LEFT JOINet RIGHT JOINsont des types de par OUTER JOIN.

INNER JOIN est la valeur par défaut - les lignes des deux tables doivent correspondre à la condition de jointure.

RussellH
la source
5
Je ne peux pas croire à quel point cette réponse a eu beaucoup de votes positifs et en même temps, elle est si incomplète.
nbro
Je pense que c'était une meilleure réponse à la question initiale.
RussellH
3

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.

Pethő Jonatán
la source
2

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

HM Nayem
la source