Les jointures
Les jointures servent à associer les enregistrements d’une table avec les enregistrements d’une autre table. Il existe plusieurs types de jointures, nous allons toutes les passer en revue.
CROSS JOIN
Un CROSS JOIN sert à associer toutes les lignes de la première table avec toutes les lignes de la seconde table:
tutorial=> select nom,prenom,classes.classe from eleves cross join classes;
nom | prenom | classe
--------------+----------+-----------
Sophie | Favier | Terminale
Pierre | Perret | Terminale
Jean Jacques | Goldman | Terminale
Jacques | Brel | Terminale
Jacques | Martin | Terminale
Mel | Gibson | Terminale
François | Hollande | Terminale
Donald | Trump | Terminale
Etienne | Martin | Terminale
Sophie | Favier | Première
Pierre | Perret | Première
Jean Jacques | Goldman | Première
Jacques | Brel | Première
Jacques | Martin | Première
Mel | Gibson | Première
François | Hollande | Première
Donald | Trump | Première
Etienne | Martin | Première
Sophie | Favier | Seconde
Pierre | Perret | Seconde
Jean Jacques | Goldman | Seconde
Jacques | Brel | Seconde
Jacques | Martin | Seconde
Mel | Gibson | Seconde
François | Hollande | Seconde
Donald | Trump | Seconde
Etienne | Martin | Seconde
(27 rows)
tutorial=>
Noter que lorsque le nom d’une colonne est commune aux deux tables, il faut la différencier en précisant la table devant.
INNER JOIN
Un INNER JOIN
Une requête INNER JOIN permet d’associer les données d’une table avec une autre table selon un critère commun que l’on spécifie après le mot clef ON:
tutorial=> select nom,prenom,classes.classe from eleves inner join classes on eleves.classe = classes.id;
nom | prenom | classe
--------------+----------+-----------
Sophie | Favier | Terminale
Pierre | Perret | Terminale
Jean Jacques | Goldman | Terminale
Jacques | Brel | Première
Jacques | Martin | Seconde
Mel | Gibson | Première
François | Hollande | Seconde
Donald | Trump | Première
Etienne | Martin | Seconde
(9 rows)
Un OUTER JOIN
Ce type de jointure fonctionne de la même façon que le INNER JOIN sauf que lorsque que la condition n’est pas remplie, elle retourne une valeur NULL.
Il y a trois type de OUTER JOIN:
- LEFT OUTER JOIN Qui retourne un NULL dans la colonne de la seconde table.
- RIGHT OUTER JOIN Qui retourne un NULL dans la colonne de la première table.
- FULL OUTER JOIN Qui retourne un NULL dans les deux cas.
Rajoutons un élève qui ne serait dans aucune classe dans notre table:
tutorial=> insert into eleves (nom,prenom) values ('Mitterand','François');
INSERT 0 1
tutorial=> select nom,prenom,classes.classe from eleves LEFT OUTER join classes on eleves.classe = classes.id;
nom | prenom | classe
--------------+----------+-----------
Sophie | Favier | Terminale
Pierre | Perret | Terminale
Jean Jacques | Goldman | Terminale
Jacques | Brel | Première
Jacques | Martin | Seconde
Mel | Gibson | Première
François | Hollande | Seconde
Donald | Trump | Première
Etienne | Martin | Seconde
Mitterand | François |
(10 rows)