web-dev-qa-db-fra.com

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

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

538
MrM

Exemple simple: Disons que vous avez une table Students et une table Lockers. 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 DROITE table.

Chaque élève peut être assigné à un casier, il y a donc une colonne LockerNumber dans la table Student. Plusieurs élèves pourraient éventuellement se trouver dans un seul casier, mais en début d’année scolaire en particulier, il se peut que certains étudiants entrants ne disposent pas de casiers et que certains casiers n’y soient pas attribués.

Dans cet exemple, supposons que vous ayez 100 étudiants, dont 70 disposent de casiers. Vous avez un total de 50 casiers, dont 40 avec au moins 1 étudiant et 10 casiers sans élève.

INNER JOIN est équivalent à " montre-moi tous les étudiants avec des casiers ".
Il manque tout étudiant sans casier ou tout autre casier sans étudiant.
retourne 70 lignes

LEFT OUTER JOIN serait " montrez-moi tous les étudiants, avec le casier correspondant s'ils en ont un ".
Il peut s’agir d’une liste générale d’étudiants ou d’identifications d’étudiants sans casier.
retourne 100 lignes

RIGHT OUTER JOIN serait " affichez-moi tous les casiers et les étudiants qui leur sont affectés s'il y en a ".
Ceci pourrait être utilisé pour identifier des casiers n’ayant pas d’étudiants attribués, ou des casiers ayant trop d’étudiants.
Retourne 80 lignes (liste de 70 étudiants dans les 40 casiers, plus les 10 casiers sans étudiant)

FULL OUTER JOIN serait idiot et probablement pas très utile.
Quelque chose comme " montre-moi tous les étudiants et tous les casiers, et faites-les correspondre où vous pouvez "
Retourne 110 lignes (tous les 100 étudiants, y compris ceux sans casiers. En plus des 10 casiers sans étudiants)

CROSS JOIN est également assez stupide dans ce scénario.
Il n’utilise pas le champ lié lockernumber de la table des étudiants, vous obtenez donc une liste géante de tous les couplages possibles d’étudiants à casiers, qu’ils existent ou non.
Retourne 5000 lignes (100 étudiants x 50 casiers). Pourrait être utile (avec filtrage) comme point de départ pour faire correspondre les nouveaux étudiants aux casiers vides.

778
BradC

Il existe trois types de base de jointure:

  • La jointure INNER compare deux tables et ne renvoie que les résultats pour lesquels 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 à rendre les jeux de résultats plus petits, 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 de nombreux résultats avec ce type de jointure qui pourraient même ne pas être significatifs. Utilisez-les avec prudence.
  • OUTER join compare deux tables et renvoie des données lorsqu'une correspondance est disponible ou des valeurs NULL sinon. Comme avec INNER join, ceci dupliquera des lignes dans une table lorsqu'il correspond à plusieurs enregistrements de l'autre table. Les jointures OUTER ont tendance à élargir les ensembles de résultats, car elles ne suppriment pas d'elles-mêmes aucun enregistrement 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: conservez tous les enregistrements de la 2ème table, peu importe quoi, et insérez des valeurs NULL lorsque 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.

Vous verrez souvent que le mot clé OUTER sera omis de la syntaxe. Au lieu de cela, il s'agira simplement de "LEFT JOIN", "RIGHT JOIN" ou "FULL JOIN". Ceci est fait parce que les jointures INNER et CROSS n'ont aucune signification en ce qui concerne LEFT, RIGHT ou FULL et qu'elles sont donc suffisantes pour indiquer sans ambiguïté une jointure OUTER.

Voici un exemple d'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 comporte au moins une ligne.
  • OUTER: vous souhaitez renvoyer tous les enregistrements "InvoiceLines" d'une facture particulière, ainsi que leurs enregistrements "InventoryItem" correspondants. Il s’agit également d’une entreprise vendant des services, de sorte que toutes les InvoiceLines n’ont pas d’IventoryItem.
  • CROSS: Vous avez un tableau de chiffres avec 10 lignes, chacune contenant les valeurs '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 de manière répétée cette table avec elle-même, vous pouvez créer autant d'entiers consécutifs que nécessaire (en partant de 10 à la 1ère puissance, chaque jointure ajoute 1 à l'exposant). Ensuite, utilisez la fonction DATEADD () pour ajouter ces valeurs à votre date de base pour la plage.
140
Joel Coehoorn

Il y a seulement 4 sortes:

  1. jointure interne: le type le plus courant. Une ligne de sortie est générée pour chaque paire de lignes en entrée correspondant aux conditions de jointure.
  2. Jointure externe gauche: Identique à une jointure interne, sauf que s'il existe une ligne pour laquelle aucune ligne correspondante ne peut être trouvée dans la table de droite, une ligne est générée et contient les valeurs de la table. à gauche, avec NULL pour chaque valeur du tableau à droite. Cela signifie que chaque ligne du tableau de gauche apparaîtra au moins une fois dans la sortie.
  3. Jointure externe droite: Identique à une jointure externe gauche, sauf que les rôles des tables sont inversés.
  4. Jointure externe complète: Combinaison de jointures externes gauche et droite. Chaque ligne des deux tables 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, ce qui entraîne la sortie de toutes les paires de lignes.

Merci à RusselH d’avoir signalé les jointures complètes, que j’avais omises.

47
j_random_hacker

Différence SQL JOINS:

Très simple à retenir:

INNER JOIN affiche uniquement les enregistrements communs aux deux tables.

OUTER JOIN tout le contenu des deux tables est fusionné, qu'elles correspondent ou non.

LEFT JOIN est identique à LEFT OUTER JOINsélection des enregistrements de la première table (la plus à gauche) avec les enregistrements correspondants de la droite.)

RIGHT JOIN est identique à RIGHT OUTER JOIN - (sélection des enregistrements de la deuxième table (la plus à droite) avec les enregistrements correspondants de la gauche).

--- (enter image description here

18
Laxmi

Départ Rejoindre (SQL) sur Wikipedia

  • Jointure interne - Dans deux jointures, une jointure interne renvoie toutes les lignes présentes dans les deux tables.
  • jointure gauche/droite (externe) - Deux tables retournées renvoient toutes les lignes présentes dans la table gauche ou droite de votre jointure, plus les lignes de l'autre côté seront renvoyées lorsque la clause de jointure est une correspondance ou la valeur null sera renvoyée pour ces colonnes

  • Plein extérieur - Deux tables retournées retournent toutes les lignes et renverront des valeurs nulles lorsque la colonne de gauche ou de droite n'y est pas

  • Cross Joins - Les jointures cartésiennes peuvent être dangereuses si elles ne sont pas utilisées avec précaution

9
JoshBerke

LEFT JOIN et RIGHT JOIN sont des types de OUTER JOINs.

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

4
RussellH

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 je reçois quand je le 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
4
lfvv

jointure interne: Affiche uniquement les lignes, quand y a-t-il des données provenant des deux tables.

Jointure externe: (gauche/droite) : Affiche tout le résultat de la à gauche/right table avec la ligne appariée ( s ), si elle existe ou pas.

3
Pethő Jonatán

Au début, vous devez comprendre à quoi sert la jointure? Nous connectons plusieurs tables et obtenons un résultat spécifique à partir des tables jointes. Le moyen le plus simple de procéder est cross join.

Disons que tableA a deux colonnes A et B. Et tableB a trois colonnes C et D. Si nous appliquons une jonction croisée, cela produira beaucoup de lignes sans signification. Ensuite, nous devons faire correspondre à l'aide de la clé primaire pour obtenir les données réelles.

Left: il retournera tous les enregistrements de la table de gauche et les enregistrements correspondants de la table de droite.

Right: il retournera en face de Left join. Il renverra tous les enregistrements de la table de droite et les enregistrements correspondants de la table de gauche.

Inner: C'est comme une intersection. Il ne renverra que 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 n’aurons 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 simplement en utilisant une jointure croisée. Mais cela pourrait coûter cher quand il s'agit de millions de disques. Donc, simplifiez les choses en utilisant les jointures gauche, droite, intérieure ou extérieure.

merci

2
HM Nayem