Une jointure interne nécessite que chaque ligne des deux tables jointes ait des valeurs de colonne correspondantes, et est une opération de jointure couramment utilisée dans les applications mais ne doit pas être considérée comme le meilleur choix dans toutes les situations. La jointure interne crée une nouvelle table de résultats en combinant les valeurs de colonne de deux tables (A et B) en fonction du prédicat de jointure. La requête compare chaque ligne de A avec chaque ligne de B pour trouver toutes les paires de lignes qui satisfont le prédicat de jointure. Lorsque le prédicat de jointure est satisfait en faisant correspondre des valeurs non NULL, les valeurs de colonne pour chaque paire de lignes de A et B correspondantes sont combinées en une ligne de résultat.
Le résultat de la jointure peut être défini comme le résultat de la première prise du produit cartésien (ou jointure croisée) de toutes les lignes des tables (combinant chaque ligne de la table A avec chaque ligne de la table B), puis retour de toutes les lignes qui satisfont le prédicat de jointure. Les implémentations SQL réelles utilisent normalement d’autres approches, telles que les jointures par hachage ou les jointures par tri-fusion, car le calcul du produit cartésien est plus lent et nécessiterait souvent une quantité de mémoire prohibitive à stocker.
SQL spécifie deux syntaxiques différentes façons d’exprimer les jointures: la « notation de jointure explicite » et la « notation de jointure implicite ». La « notation de jointure implicite » n’est plus considérée comme une bonne pratique, bien que les systèmes de base de données la prennent toujours en charge.
La « notation de jointure explicite » utilise le mot-clé JOIN
, éventuellement précédé du mot clé INNER
, pour spécifier la table à joindre, et du mot clé ON
pour spécifier les prédicats de la jointure, comme dans l’exemple suivant:
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee INNER JOIN department ONemployee.DepartmentID = department.DepartmentID;
Employee.LastName |
Employee.DepartmentID |
Department.DepartmentName |
Robinson |
34 |
Clérical |
Jones |
33 |
Ingénierie |
Smith |
34 |
Commis de bureau |
Heisenberg |
33 |
Ingénierie |
Rafferty |
31 |
Ventes |
La « notation de jointure implicite » répertorie simplement t Les tables de jonction, dans la clause FROM
de l’instruction SELECT
, en utilisant des virgules pour les séparer. Ainsi, il spécifie une jointure croisée, et la clause WHERE
peut appliquer des prédicats de filtre supplémentaires (qui fonctionnent de manière comparable aux prédicats de jointure dans la notation explicite).
L’exemple suivant est équivalent au précédent, mais cette fois en utilisant la notation de jointure implicite:
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;
Les requêtes données dans les exemples ci-dessus rejoindra les tables Employee et Department en utilisant la colonne DepartmentID des deux tables. Lorsque le DepartmentID de ces tables correspond (c’est-à-dire que le prédicat de jointure est satisfait), la requête combinera les colonnes LastName, DepartmentID et DepartmentName des deux tables en une ligne de résultat. Là où le DepartmentID ne correspond pas, aucune ligne de résultat n’est générée.
Ainsi, le résultat de l’exécution de la requête ci-dessus sera:
Employee.LastName |
Employee.DepartmentID |
Department.DepartmentName |
Robinson |
34 |
Clérical |
Jones |
33 |
Ingénierie |
Smith |
34 |
Clerical |
Heisenberg |
33 |
Ingénierie |
Rafferty |
31 |
Ventes |
L’employé « Williams » et le service « Marketing » n’apparaissent pas dans les résultats de l’exécution de la requête. Aucun de ces éléments n’a de ligne correspondante dans l’autre table respective: « Williams » n’a pas de service associé et aucun employé n’a l’ID de service 35 (« Marketing »). Selon les résultats souhaités, ce comportement peut être un bogue subtil, qui peut être évité en remplaçant la jointure interne par une jointure externe.
Jointure interne et valeurs NULL Modifier
Les programmeurs devraient prendre attention particulière lors de la jonction de tables sur des colonnes pouvant contenir des valeurs NULL, car NULL ne correspondra jamais à aucune autre valeur (même pas NULL elle-même), à moins que la condition de jointure n’utilise explicitement un prédicat de combinaison qui vérifie d’abord que les colonnes de jointure sont NOT NULL
avant d’appliquer la ou les conditions de prédicat restantes. La jointure interne ne peut être utilisée en toute sécurité que dans une base de données qui applique l’intégrité référentielle ou dans laquelle il est garanti que les colonnes de jointure ne sont pas NULL. De nombreuses bases de données relationnelles de traitement des transactions reposent sur les normes de mise à jour des données Atomicité, Cohérence, Isolation, Durabilité (ACID) pour garantir l’intégrité des données, faisant des jointures internes un choix approprié. Cependant, les bases de données de transaction ont généralement également des colonnes de jointure souhaitables qui peuvent être NULL.De nombreuses bases de données relationnelles de rapports et entrepôts de données utilisent des mises à jour par lots d’extraction, de transformation, de chargement (ETL) à grand volume qui rendent l’intégrité référentielle difficile voire impossible à appliquer, ce qui entraîne des colonnes de jointure potentiellement NULL qu’un auteur de requête SQL ne peut pas modifier et qui entraînent l’omission des jointures internes. données sans indication d’erreur. Le choix d’utiliser une jointure interne dépend de la conception de la base de données et des caractéristiques des données. Une jointure externe gauche peut généralement être remplacée par une jointure interne lorsque les colonnes de jointure d’une table peuvent contenir des valeurs NULL.
Toute colonne de données pouvant être NULL (vide) ne doit jamais être utilisée comme lien dans un jointure interne, sauf si le résultat attendu est d’éliminer les lignes avec la valeur NULL. Si les colonnes de jointure NULL doivent être délibérément supprimées du jeu de résultats, une jointure interne peut être plus rapide qu’une jointure externe car la jointure de table et le filtrage sont effectués en une seule étape. À l’inverse, une jointure interne peut entraîner des performances désastreusement lentes ou même un plantage du serveur lorsqu’elle est utilisée dans une requête de grand volume en combinaison avec des fonctions de base de données dans une clause SQL Where. Une fonction dans une clause SQL Where peut amener la base de données à ignorer les index de table relativement compacts. La base de données peut lire et joindre en interne les colonnes sélectionnées des deux tables avant de réduire le nombre de lignes à l’aide du filtre qui dépend d’une valeur calculée, ce qui entraîne une quantité relativement énorme de traitement inefficace.
Lorsqu’un ensemble de résultats est produite en joignant plusieurs tables, y compris les tables maîtres utilisées pour rechercher des descriptions en texte intégral des codes d’identificateurs numériques (une table de recherche), une valeur NULL dans l’une des clés étrangères peut entraîner l’élimination de la ligne entière du jeu de résultats, sans indication d’erreur. Une requête SQL complexe qui comprend une ou plusieurs jointures internes et plusieurs jointures externes présente le même risque pour les valeurs NULL dans les colonnes de lien de jointure interne.
Un engagement envers un code SQL contenant des jointures internes suppose que les colonnes de jointure NULL ne le seront pas être introduit par les futures modifications, y compris les mises à jour du fournisseur, les modifications de conception et le traitement en masse en dehors des règles de validation des données de l’application telles que les conversions de données, les migrations, les importations en masse et les fusions.
On peut classer davantage les jointures internes comme équi-jointures, comme jointures naturelles ou comme jointures croisées.
Equi-joinEdit
Une équi-jointure est un type spécifique de jointure basée sur un comparateur, qui utilise uniquement des comparaisons d’égalité dans le prédicat de jointure. L’utilisation d’autres opérateurs de comparaison (tels que <
) disqualifie une jointure en tant qu’équi-jointure. La requête ci-dessus a déjà fourni un exemple d’équi-jointure:
SELECT *FROM employee JOIN department ON employee.DepartmentID = department.DepartmentID;
Nous pouvons écrire une équi-jointure comme ci-dessous,
SELECT *FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;
Si co les lumns dans une équi-jointure ont le même nom, SQL-92 fournit une notation abrégée facultative pour exprimer les équi-jointures, via la construction USING
:
SELECT
read more