Quelle est la différence entre les jointures Gauche, Droite, extérieure et intérieure?

je me demande comment différencier ces différentes jointures ...

506
demandé sur mwigdahl 2009-01-15 22:07:31

10 réponses

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 gauche , et la seconde, Lockers , est la table droite .

chaque élève peut être affecté à un casier, il y a donc une colonne LockerNumber dans le tableau Student . Plus d'un élève pourrait être dans un seul casier, mais surtout au début de l'année scolaire, vous pouvez avoir des étudiants entrants sans casiers et certains casiers qui n'ont pas d'élèves affectés.

pour 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 un élève et 10 casiers n'ont pas d'élève.

JOINT INTÉRIEUR est l'équivalent de montrez-moi tous les étudiants avec des casiers ".

Tous les élèves sans casiers, ou tous les casiers sans élèves ont disparu.

retourne 70 lignes

LEFT OUTER JOIN serait " montrez-moi tous les élèves, avec leurs correspondants locker si ils ont un ".

Cela pourrait être un liste générale des étudiants, ou pourrait être utilisé pour identifier les étudiants sans casier.

retourne 100 lignes

droit extérieur joindre serait" montrez-moi tous les casiers, et les étudiants qui leur sont assignés s'il y a un ".

Cela pourrait être utilisé pour identifier les casiers qui n'ont pas d'élèves affectés, ou des casiers qui ont trop d'étudiants.

retourne 80 lignes (liste de 70 étudiants dans les 40 casiers, plus les 10 casiers sans étudiant)

FULL OUTER JOIN serait stupide et probablement pas beaucoup d'utilisation.

Quelque chose comme montrez-moi tous les étudiants et tous les casiers, et faites les correspondre où vous pouvez "

renvoie 110 lignes (les 100 élèves, y compris ceux qui n'ont pas de casier. Plus les 10 casiers sans étudiant)

CROSS JOIN est également assez stupide dans ce scénario.

il n'utilise pas le champ lockernumber lié dans la table des étudiants, donc vous finissez fondamentalement avec une grande liste géante de chaque possible appariement étudiant-casier, qu'il existe ou non.

retourne 5000 lignes (100 étudiants x 50 casiers). Pourrait être utile (avec filtrage) comme point de départ pour faire le lien entre les nouveaux élèves et les casiers vides.

743
répondu BradC 2017-11-02 15:02:48

Voici une vue graphique de toutes les jointures qui donne des explications visuelles claires.

visual explanation of joins

et ici Visual-Représentation-de-SQL-Joint , a expliqué en détail par C. L. Moffatt

377
répondu vels4j 2014-08-06 14:09:39

il existe trois types de jointure de base:

  • INNER join compare deux tables et ne renvoie les résultats que lorsqu'il y a correspondance. Les enregistrements du 1er tableau sont dupliqués lorsqu'ils correspondent à plusieurs résultats du 2e tableau. Les jointures internes ont tendance à rendre les ensembles de résultats plus petits, mais parce que les enregistrements peuvent être dupliqués ce n'est pas garanti.
  • CROSS join compare deux tableaux et retourner chaque combinaison possible de lignes de les deux tables. Vous pouvez obtenir beaucoup de résultats de ce type de jointure qui pourrait même ne pas être significative, donc à utiliser avec précaution.
  • OUTER join compare deux tables et renvoie des données lorsqu'une correspondance est disponible ou des valeurs nulles autrement. Comme avec la jointure interne, cela dupliquera les lignes dans une table quand elle correspond à plusieurs enregistrements dans l'autre table. Les jointures externes ont tendance à rendre les ensembles de résultats plus grands, parce qu'ils ne vont pas par eux-mêmes supprimer tous les enregistrements de l'ensemble. Vous devez qualifier également une jointure externe pour déterminer quand et où ajouter les valeurs NULL:
    • LEFT signifie conserver tous les enregistrements de la première table peu importe ce qu'ils contiennent et insérer des valeurs nulles lorsque la deuxième table ne correspond pas.
    • RIGHT signifie le contraire: conservez tous les enregistrements de la 2e table peu importe ce qu'ils contiennent et insérez des valeurs nulles lorsque la 1re table ne correspond pas.
    • FULL désigne la conservation de tous les registres des deux tables; insérez une valeur nulle dans l'une ou l'autre des tables s'il n'y a pas de correspondance.

souvent, vous verrez le mot-clé OUTER omis de la syntaxe. Au lieu de cela, il sera simplement "gauche rejoindre"," droite rejoindre", ou"pleine jointure". Ceci est fait parce que les jointures intérieure et de croix n'ont pas de sens par rapport à gauche, droite, ou pleine, et donc ceux-ci sont suffisants par eux-mêmes pour indiquer sans ambiguïté une jointure extérieure.

Voici un exemple de quand vous pourriez vouloir utiliser chaque type:

  • INNER : vous souhaitez retourner tous les enregistrements de la table "facture", ainsi que leurs"lignes de facturation" correspondantes. Cela suppose que chaque facture valide aura au moins une ligne.
  • OUTER : vous voulez retourner 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 factures auront un IventoryItem.
  • CROSS : vous avez un tableau de chiffres avec 10 lignes, chaque valeur de maintien '0' à '9'. Vous voulez créer une table de gamme de date à joindre contre, de sorte que vous finissez avec un enregistrement pour chaque jour dans la gamme. En croisant cette table avec elle-même à plusieurs reprises vous pouvez créer autant d'entiers consécutifs que vous avez besoin (étant donné que vous commencez à 10 à la première puissance, chaque join ajoute 1 à l'exposant). Ensuite, utilisez la DATEADD() la fonction pour ajouter ces valeurs à votre date de base pour la plage.
136
répondu Joel Coehoorn 2009-05-26 20:48:52

il n'y a que 4 sortes:

  1. Inner join : le type le plus courant. Une ligne de sortie est produite pour chaque paire de lignes d'entrée qui correspondent sur les conditions de jointure.
  2. jointure extérieure gauche : identique à une jointure intérieure, sauf que s'il y a une ligne pour laquelle aucune ligne correspondante dans la table de droite ne peut être trouvée, une ligne est sortie contenant les valeurs de la table de gauche, avec NULL pour chaque valeur du tableau de droite. Cela signifie que chaque ligne de la table sur la gauche apparaissent au moins une fois dans la sortie.
  3. jointure extérieure droite : identique à une jointure extérieure gauche, sauf avec les rôles des tables inversées.
  4. FULL outer join : une combinaison de jointures externes gauche et droite. Chaque ligne des deux tableaux apparaîtra dans la sortie au moins une fois.

Une "jointure croisée" ou "cartésien rejoindre" est tout simplement une jointure interne, pour laquelle aucune des conditions de jointure ont été spécifiés, de sorte que toutes les paires de lignes de sortie.

merci à RusselH d'avoir pointé des joints pleins, que j'avais omis.

46
répondu j_random_hacker 2009-01-16 19:15:48

SQL JOINS difference:

très simple à retenir:

INNER JOIN ne présentent que des enregistrements communs aux deux tableaux.

OUTER JOIN tout le contenu des deux tableaux est fusionné soit ils sont appariés ou non.

LEFT JOIN est le même que le LEFT OUTER JOIN - (Sélectionner les enregistrements à partir de la première (la plus à gauche) de la table de correspondance avec à droite les enregistrements de la table.)

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

enter image description here

10
répondu Laxmi 2018-01-12 04:33:03

Check out Join (SQL) on Wikipedia

  • Inner join - étant Donné les deux tables de jointure interne renvoie toutes les lignes qui existent dans les deux tableaux
  • jointure gauche / droite (externe) - donné deux tables retourne toutes les lignes qui existent dans la table gauche ou droite de votre jointure, plus les lignes de l'autre côté seront retournés quand la clause de jointure est une correspondance ou null sera retourné pour ces colonnes

  • Full Outer - compte tenu deux tables retourne toutes les lignes, et sera de retour null lorsque soit la gauche ou la colonne de droite n'est pas là

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

9
répondu JoshBerke 2009-01-15 19:19:19

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

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

4
répondu RussellH 2015-09-16 07:36:54

Inner join : afficher uniquement les lignes, lorsqu'il a des données des deux tableaux.

jointure extérieure : (gauche/droite) : afficher le résultat total du tableau gauche / droite avec la ligne jumelée ( s ), si le tableau existe ou non.

3
répondu Pethő Jonatán 2015-02-15 20:20:53

le rendre plus visible pourrait aider. Un exemple:

Tableau 1:

ID_STUDENT STUDENT_NAME

1               Raony
2               Diogo
3               Eduardo
4               Luiz

Tableau 2:

CASIER ID_STUDENT

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
1
répondu lfvv 2017-06-28 18:16:58

vous devez d'abord comprendre ce que fait join do? Nous connectons plusieurs tables et obtenons des résultats spécifiques à partir des tables jointes. La manière la plus simple de le faire est Croix de jointure .

disons que tableA a deux colonnes A et B. et tableB a trois colonnes C et D. Si nous appliquons la jointure croisée, cela produira beaucoup de rang dénué de sens. Ensuite, nous devons faire la correspondance en utilisant la clé primaire pour obtenir des données réelles.

à gauche: it retournera tous les enregistrements de la table de gauche et les enregistrements appariés de la table de droite.

à droite: il reviendra en face à gauche rejoindre. Il retournera tous les enregistrements de la table droite et les enregistrements appariés de la table gauche.

intérieur: c'est comme une intersection. Il ne retournera que les enregistrements appariés des deux tables.

Extérieur": Et c'est comme l'union. Il sera de retour tous les enregistrement disponible de table.

parfois, nous n'avons pas besoin de toutes les données, et nous ne devrions avoir besoin que de données ou d'enregistrements communs. nous pouvons facilement le faire en utilisant ces méthodes de jointure. Rappelez-vous que les jointures gauche et droite sont aussi externes.

vous pouvez obtenir tous les enregistrements juste en utilisant la jointure croisée. Mais ça pourrait être cher quand il s'agit de millions de disques. Alors simplifiez-le en utilisant la jointure gauche, droite, intérieure ou extérieure.

merci

1
répondu HM Nayem 2017-11-02 15:47:16