Les jointures

Lorsque deux tables sont mises en relation dans une requête, on établit alors une jointure. Le but recherché est de mettre en relation les données d’une table avec les données d’une autre table. Le résultat correspond à mettre bout à bout les lignes des deux tables.

Pour que ceci soit réalisable et pour que la relation soit sémantiquement valable, les tables en cause doivent posséder une colonne commune. Habituellement, cette colonne commune prend la forme d’une clé primaire dans une table et d’une clé lointaine dans l’autre table. Pour simplifier les choses ces deux colonnes portent généralement le même nom.

Les jointures peuvent être établies avec des opérateurs comme « < » et « > ». Cependant, les jointures les plus habituelles portent sur une comparaison d’égalité entre une clé lointaine et une clé primaire.

1.1 Jointures à partir du produit cartésien

Le produit cartésien entre deux tables est l’association de chacune des lignes de la première table avec chacune des lignes de la seconde table. C’est ce que l’on produit lorsque deux tables sont simplement mentionnées dans la clause FROM.

SELECT *
FROM produit, classe;

Un pur produit cartésien n’a aucun sens (i.e. il ne s’interprète pas). Il est plutôt désirable d’établir une relation qui se définit comme un sous-ensemble du produit cartésien. La relation désirée s’établit sur la base d’une condition de comparaison entre deux colonnes (habituellement, une clé primaire et une clé lointaine). Ainsi, les seules paires de lignes conservées seront celles qui respectent la condition de jointure.

L’instruction prend la forme suivante:

SELECT liste des colonnes
FROM liste des tables
WHERE condition de jointure entre deux tables,
[AND condition de jointure entre deux tables, ...] ;

Remarque:

  • Comme les colonnes de comparaison ont souvent le même nom, il est
    nécessaire d’utiliser les noms explicites des colonnes.
    
  • Lorsque des colonnes de même nom sont présentes dans des tables différentes de la requête, il est nécessaire d’utiliser les noms explicites des colonnes dans n’importe quelle clause de la requête où ces colonnes sont mentionnées.
SELECT *
FROM produit, classe
WHERE produit.classe = classe.classe;

1.2 Jointures explicites (INNER JOIN)

Avec le premier standard de SQL, les jointures à partir du produit cartésien était la seule façon d’établir une jointure. Maintenant, avec le standard de 1992, il est possible de définir des jointures explicitement dans la clause FROM en utilisant le mot clé JOIN.

FROM table INNER JOIN table ON condition de jointure

Associez à chacun des produit le nom de la classe à laquelle celui-ci appartient.

SELECT code_produit, nom
FROM produit INNER JOIN classe ON produit.classe = classe.classe;

1.3 Jointures « externes » (OUTER JOIN)

La façon de définir une jointure implique que seules les lignes qui satisfassent la condition vont être retenues. Ainsi, toute ligne d’une table, pour laquelle la valeur de la colonne de jointure n’arrive pas à trouver une valeur similaire dans l’autre table, sera rejetée. Si on désire conserver néanmoins des lignes qui ne respectent pas la condition de jointure, alors il faut établir une jointure « externe ». Celle-ci aura pour effet de conserver toutes les lignes (celles qui respectent néanmoins les autres conditions de la clause WHERE) d’une table dans le résultat. L’espace, normalement occupé par une ligne de l’autre table, sera remplacé par des NULLs.

FROM table [ LEFT | RIGHT ] OUTER JOIN table ON condition de jointure

Une jointure qui utilise un LEFT OUTER JOIN fera apparaître toutes les lignes de la première table, alors qu’une jointure qui utilise un RIGHT OUTER JOIN fera apparaître toutes les lignes de la seconde table.

Donnez la liste des noms de tous les employés, avec le numéro des projets dont ils sont responsables (s’il y a lieu).

SELECT nom, code_projet
FROM chef LEFT OUTER JOIN projet
ON chef.matricule = projet.matricule
ORDER BY nom;

 

 

 

Print Friendly, PDF & Email

Laisser un commentaire