Question Quelle est la différence entre Left, Right, Outer et Inner Joins?


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


499
2018-01-15 19:07


origine


Réponses:


Exemple simple: Disons que vous avez un Students table, et un Lockers table. En SQL, la première table que vous spécifiez dans une jointure, Students, est le LA GAUCHE table, et la seconde, Lockers, est le DROITE table.

Chaque étudiant peut être affecté à un casier, il y a donc un LockerNumber colonne dans le Student table. Plus d'un élève pourrait potentiellement être dans un seul casier, mais surtout au début de l'année scolaire, il se peut que vous ayez des élèves entrants sans casiers et des casiers qui n'ont pas d'élèves assignés.

Dans l'intérêt de cet exemple, disons que vous avez 100 étudiants, Dont 70 ont des casiers. Vous avez un total de 50 casiers40 d'entre eux ont au moins un étudiant et 10 casiers n'ont aucun étudiant.

JOINTURE INTERNE est équivalent à "montre-moi tous les étudiants avec des casiers".
Il manque des étudiants sans casiers ou des casiers sans étudiants.
Renvoie 70 lignes

JOINTURE EXTERNE GAUCHE serait "montre-moi tous les élèves, avec leur casier correspondant s'ils en ont un".
Cela pourrait être une liste générale d'étudiants, ou pourrait être utilisé pour identifier les étudiants sans casier.
Retourne 100 lignes

DROIT OUTER JOIN serait "montre moi tous les casiers, et les étudiants qui leur sont assignés s'il y en a".
Cela pourrait être utilisé pour identifier les casiers auxquels aucun étudiant n'a été affecté, ou les casiers qui ont trop d'élèves.
Renvoie 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 "montre-moi tous les étudiants et tous les casiers et fais-les correspondre où tu peux"
Retourne 110 lignes (tous les 100 étudiants, y compris ceux sans casiers. Plus les 10 casiers sans étudiant)

CROSS JOIN est également assez stupide dans ce scénario.
 Il n'utilise pas le lien lockernumber champ dans la table des étudiants, de sorte que vous vous retrouvez avec une grande liste géante de tous les couples possibles d'étudiants à casiers, 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.


739
2018-01-15 19:18



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

visual explanation of joins

et ici Visual-Representation-of-SQL-Jointures expliqué en détail par C.L. Moffatt


373
2017-07-17 06:01



Il existe trois types de jointure de base:

  • INNER join compare deux tables et ne renvoie que les résultats 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 internes ont tendance à réduire les ensembles 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 peut ne pas être significatif, donc utilisez 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, cela dupliquera des lignes dans la table une quand elle correspond à plusieurs enregistrements dans l'autre table. Les jointures externes ont tendance à rendre les jeux de résultats plus volumineux, car ils ne supprimeront aucun enregistrement de l'ensemble. Vous devez également qualifier une jointure OUTER pour déterminer quand et où ajouter les valeurs NULL:
    • LEFT signifie garder tous les enregistrements de la 1ère table, peu importe quoi 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 et insérez des valeurs NULL lorsque la premiè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 voyez souvent que le OUTER mot-clé 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 sont donc suffisantes par elles-mêmes pour indiquer sans ambiguïté une jointure OUTER.

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

  • INNER: Vous souhaitez renvoyer tous les enregistrements de la table "Invoice", avec leurs "InvoiceLines" 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 activité qui vend également des services, de sorte que toutes les lignes de facturation ne possèdent 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 plages de dates à laquelle vous souhaitez vous joindre, afin de vous retrouver avec un enregistrement pour chaque jour compris dans la plage. En reliant à plusieurs reprises cette table avec elle-même, vous pouvez créer autant d'entiers consécutifs que nécessaire (étant donné que vous commencez à une puissance de 10 à 1, chaque jointure ajoute 1 à l'exposant). Utilisez ensuite la fonction DATEADD () pour ajouter ces valeurs à votre date de base pour la plage.

135
2018-01-15 19:13



Il n'y a que 4 sortes:

  1. Jointure interne: Le type le plus commun Une ligne de sortie est produite pour chaque paire de lignes d'entrée correspondant aux conditions de jointure.
  2. Jointure externe gauche: La même chose qu'une jointure interne, sauf que s'il existe une ligne pour laquelle aucune ligne correspondante dans la table à droite ne peut être trouvée, une ligne contient les valeurs de la table à gauche, avec NULL pour chaque valeur dans le tableau sur la droite. Cela signifie que chaque ligne de la table à gauche apparaîtra au moins une fois dans la sortie.
  3. Jointure externe droite: Identique à une jointure externe gauche, sauf avec les rôles des tables inversés.
  4. Jointure externe complète: Une 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 une "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 pour avoir souligné les jointures FULL, que j'ai omises.


46
2018-01-15 19:15



Check-out Rejoindre (SQL) sur Wikipedia

  • Jointure interne - Avec deux tables, une jointure interne renvoie toutes les lignes existant dans les deux tables
  • jointure gauche / droite (externe) - Si deux tables renvoient toutes les lignes existant dans la table gauche ou droite de votre jointure, 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 renvoient des valeurs nulles lorsque la colonne de gauche ou de droite n'est pas là

  • Cross Joins - joindre cartésien et peut être dangereux s'il n'est pas utilisé avec soin


9
2018-01-12 04:26



SQL JOINS différence:

Très simple à retenir:

INNER JOIN Afficher uniquement les enregistrements communs aux deux tables.

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

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

RIGHT JOIN est le même que RIGHT OUTER JOIN - (Sélectionnez les enregistrements de la deuxième table (la plus à droite) avec les enregistrements de la table de gauche correspondante.)

enter image description here


7
2018-01-15 19:14



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

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


5
2018-02-15 20:20



Jointure interne: Afficher uniquement les lignes, quand il a des données à partir des deux tables.

Jointure externe: (gauche droite): Afficher tous les résultats du gauche droite table avec la rangée appariée (s), si ça existe ou pas.


4
2018-06-28 18:16



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 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

2
2017-11-02 15:47



Au début, vous devez comprendre ce que fait l'adhésion? Nous connectons plusieurs tables et obtenons des résultats spécifiques à partir des tables jointes. Le moyen le plus simple de le faire est 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 cross join, cela produira beaucoup de rang sans signification. Ensuite, nous devons utiliser une clé primaire pour obtenir des données réelles.

La gauche: il retournera tous les enregistrements de la table de gauche et de l'enregistrement correspondant de la table de droite.

Droite: il reviendra en face de la jointure gauche. Il retournera tous les enregistrements de la table de droite et les enregistrements correspondants de la table de gauche.

Interne: C'est comme une intersection. Il ne renverra que les enregistrements correspondants des deux tables.

Extérieur: Et c'est comme l'union. Il retournera tous les enregistrements disponibles des deux tables.

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 l'obtenir en utilisant ces méthodes de jointure. Rappelez-vous que les jointures gauche et droite sont également une jointure externe.

Vous pouvez obtenir tous les enregistrements en utilisant simplement la jointure croisée. Mais cela pourrait coûter cher quand il s'agit de millions de disques. Donc, simplifiez-vous en utilisant la jointure gauche, droite, interne ou externe.

Merci


2