Initiation à SQL

Jointures

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 :

Figure 5. TABLE SAMP_PROJECT


REQTEXT

Figure 6. TABLE SAMP_STAFF


REQTEXT

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 :

  1. Une jointure externe gauche, qui inclut la jointure interne et les lignes de la table de gauche non comprises dans la jointure interne.
  2. Une jointure externe droite, qui inclut la jointure interne et les lignes de la table de droite non comprises dans la jointure interne.
  3. Une jointure externe complète, qui inclut la jointure interne et les lignes des tables de gauche et de droite non comprises dans la jointure interne.

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.


[ Début de page | Page précédente | Page suivante | Table des matières | Index ]