Le processus qui consiste à combiner des données provenant de plusieurs tables est appelé jointure. Avec le gestionnaire de bases de données, il est possible d'obtenir toutes sortes de combinaisons de lignes à partir des tables précisées. Il teste la condition de jointure de chaque combinaison. Une condition de jointure est une condition de recherche, avec quelques restrictions. Consultez le document SQL Reference qui recense ces restrictions.
Il est à noter que les colonnes impliquées dans la condition de jointure ne doivent pas forcément contenir des données de même type. Cependant, les données doivent être de types compatibles. La condition de jointure est évaluée de la même façon que n'importe quelle autre condition de recherche, et les mêmes règles de comparaison s'y appliquent.
Si vous ne précisez pas de condition de jointure, toutes les combinaisons de lignes possibles à partir des tables citées dans la clause FROM sont renvoyées, même si les lignes n'ont aucune relation entre elles. Le résultat peut être considéré comme un produit croisé des deux tables.
Les exemples de cette section sont basés sur les deux tables présentées ci-après. Il s'agit de versions simplifiées des tables de la base de données SAMPLE, mais elles n'existent pas dans la base. Elles illustrent quelques points intéressants sur les jointures en général. SAMP_STAFF dresse la liste des employés qui ne sont pas sous contrat, accompagnée des descriptions de poste. SAMP_PROJECT liste les employés (sous contrat et à plein temps) et les projets sur lesquels ils travaillent.
Voici comment se présentent les tables :
![]() |
![]() |
L'exemple suivant permet d'obtenir un résultat issu du produit croisé des deux tables. Aucune condition de jointure n'étant précisée, toutes les combinaisons de lignes possibles ont été trouvées :
SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB FROM SAMP_PROJECT, SAMP_STAFF
Cette instruction donne le résultat suivant :
NAME PROJ NAME JOB ---------- ------ ---------- -------- Haas AD3100 Haas PRES Thompson PL2100 Haas PRES Walker MA2112 Haas PRES Lutz MA2111 Haas PRES Haas AD3100 Thompson MANAGER Thompson PL2100 Thompson MANAGER Walker MA2112 Thompson MANAGER Lutz MA2111 Thompson MANAGER Haas AD3100 Lucchessi SALESREP Thompson PL2100 Lucchessi SALESREP Walker MA2112 Lucchessi SALESREP Lutz MA2111 Lucchessi SALESREP Haas AD3100 Nicholls ANALYST Thompson PL2100 Nicholls ANALYST Walker MA2112 Nicholls ANALYST Lutz MA2111 Nicholls ANALYST
Il y a deux principaux types de jointure : les jointures internes et les jointures externes. Jusqu'à présent, dans tous nos exemples, nous avons utilisé une jointure interne. Ce type de jointure ne garde du produit croisé que les lignes remplissant la condition de jointure. Si une ligne existe dans une table et pas dans l'autre, ses informations n'apparaissent pas dans la table résultat.
L'exemple suivant assure la jointure interne de deux tables. La jointure interne dresse la liste de tous les employés à plein temps affectés à un projet :
SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB FROM SAMP_PROJECT, SAMP_STAFF WHERE SAMP_STAFF.NAME = SAMP_PROJECT.NAME
Il serait aussi possible de préciser la jointure interne de la manière suivante :
SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB FROM SAMP_PROJECT INNER JOIN SAMP_STAFF ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
Voici le résultat obtenu :
NAME PROJ NAME JOB ---------- ------ ---------- -------- Haas AD3100 Haas PRES Thompson PL2100 Thompson MANAGER
Le résultat de la jointure externe se compose de lignes dont les valeurs de la colonne NAME correspondent dans les tables de droite et de gauche - 'Haas' et 'Thompson' sont des noms que l'on retrouve dans la table SAMP_STAFF contenant la liste de tous les employés à plein temps, et dans la table SAMP_PROJECT contenant la liste des employés à plein temps et sous contrat affectés à un projet.
Les jointures externes sont une concaténation de la jointure interne et des lignes de la table de gauche, de la table de droite, ou des deux tables absentes de la jointure interne. Lorsque vous exécutez une jointure externe sur deux tables, vous affectez arbitrairement l'une en tant que table de gauche et l'autre en tant que table de droite. Il existe trois types de jointure :
Utilisez l'instruction SELECT pour préciser les colonnes à afficher. Dans la clause FROM, citez le nom de la table, suivi des mots clés LEFT OUTER JOIN, RIGHT OUTER JOIN ou FULL OUTER JOIN. Ensuite, précisez le nom de la seconde table, suivi du mot clé ON. Après le mot clé ON, précisez la condition de jointure, qui exprimera la relation entre les tables à joindre.
Dans l'exemple suivant, SAMP_STAFF est la table de droite et SAMP_PROJECT est la table de gauche. LEFT OUTER JOIN permet de dresser la liste des noms et des numéros de projet de tous les employés, à plein temps et sous contrat (liste de la table SAMP_PROJECT) ainsi que leur poste s'ils sont à plein temps (liste de la table SAMP_STAFF) :
SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB FROM SAMP_PROJECT LEFT OUTER JOIN SAMP_STAFF ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
Cette instruction donne le résultat suivant :
NAME PROJ NAME JOB ---------- -------------------- ---------- -------------------- Haas AD3100 Haas PRES Lutz MA2111 - - Thompson PL2100 Thompson MANAGER Walker MA2112 - -
Les lignes comportant des valeurs dans toutes les colonnes sont le résultat de la jointure interne. Elles remplissent la condition de jointure : 'Haas' et 'Thompson' sont présents dans les deux tables, SAMP_PROJECT (table de gauche) et SAMP_STAFF (table de droite). Sur les lignes ne remplissant pas la condition de jointure, la valeur NULL apparaît dans les colonnes de la table de droite : 'Lutz' et 'Walker' sont des employés sous contrat, présents dans la table SAMP_PROJECT mais absents de la table SAMP_STAFF. Toutes les lignes de la table de gauche sont incluses dans l'ensemble de résultats.
Dans l'exemple suivant, SAMP_STAFF est la table de droite et SAMP_PROJECT est la table de gauche. RIGHT OUTER JOIN permet de dresser la liste des noms et des postes de tous les employés à plein temps (liste de la table SAMP_STAFF), et d'indiquer également leur numéro de projet, s'ils ont été affectés à un projet (liste de la table SAMP_PROJECT) :
SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB FROM SAMP_PROJECT RIGHT OUTER JOIN SAMP_STAFF ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
Voici le résultat obtenu :
NAME PROJ NAME JOB ---------- -------------------- ---------- -------------------- Haas AD3100 Haas PRES - - Lucchessi SALESREP - - Nicholls ANALYST Thompson PL2100 Thompson MANAGER
Comme dans le cas de la jointure externe gauche, les lignes comportant des valeurs dans toutes les colonnes sont le résultat de la jointure interne. Elles remplissent la condition de jointure : 'Haas' et 'Thompson' sont présents dans les deux tables, SAMP_PROJECT (table de gauche) et SAMP_STAFF (table de droite). Sur les lignes ne remplissant pas la condition de jointure, la valeur NULL apparaît dans les colonnes de la table de droite : 'Lucchessi' et 'Nicholls' sont des employés à plein temps non affectés à un projet. Ils font partie de la liste du personnel de la table SAMP_STAFF, mais sont absents de la table SAMP_PROJECT. Toutes les lignes de la table de droite sont incluses dans l'ensemble de résultats.
L'exemple suivant utilise FULL OUTER JOIN sur les tables SAMP_PROJECT et SAMP_STAFF. Il donne les noms de tous les employés à plein temps, y compris ceux qui ne sont pas affectés à un projet, et de tous les employés sous contrat :
SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB FROM SAMP_PROJECT FULL OUTER JOIN SAMP_STAFF ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
Voici le résultat obtenu :
NAME PROJ NAME JOB ---------- -------------------- ---------- -------------------- Haas AD3100 Haas PRES - - Lucchessi SALESREP - - Nicholls ANALYST Thompson PL2100 Thompson MANAGER Lutz MA2111 - - Walker MA2112 - -
Le résultat inclut la jointure externe gauche, la jointure externe droite et la jointure interne. La liste inclut tous les employés à plein temps et sous contrat. Comme dans le cas d'une jointure externe gauche ou droite, la valeur NULL apparaît lorsque la condition de jointure n'est pas remplie. Toutes les lignes des tables SAMP_STAFF et SAMP_PROJECT sont incluses dans l'ensemble de résultats.