Je me demande comment différencier toutes ces jointures différentes ...
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.
Il existe trois types de base de 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.Il y a seulement 4 sortes:
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.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.
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 JOIN
sé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).
--- (
Départ Rejoindre (SQL) sur Wikipedia
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
LEFT JOIN
et RIGHT JOIN
sont des types de OUTER JOIN
s.
INNER JOIN
est la valeur par défaut - les lignes des deux tables doivent correspondre à la condition de jointure.
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
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.
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