Je me demande comment différencier toutes ces jointures différentes ...
Je me demande comment différencier toutes ces jointures différentes ...
Réponses:
Exemple simple : disons que vous avez une Students
table et une Lockers
table. 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 RIGHT .
Chaque élève peut être affecté à un casier, il y a donc une LockerNumber
colonne dans le Student
tableau. 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 lockernumber
champ 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.
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 SQL
requêtes complètes
Il existe trois types de base de jointure:
INNER
join 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.CROSS
join 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.OUTER
join 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 OUTER
mot 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.Il n'y a que 4 types:
NULL
pour 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. 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.
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 JOIN
est 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 JOIN
est 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.)
Découvrez Join (SQL) sur Wikipedia
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
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
LEFT JOIN
et RIGHT JOIN
sont 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.
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.
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