Introduction
Les jointures SQL, représentées par la clause JOIN, sont une façon standardisée de combiner les éléments de deux ou plusieurs tables en leur demandant de suivre une condition.
Ces jointures, ces combinaisons, peuvent parfois s'appliquer sur la même table plusieurs fois (par exemple pour les classements sportifs).
Grossièrement, il existe deux types de jointures : les internes, représentées par la clause INNER JOIN, et les externes, par OUTER JOIN.
Ces notes sont tirées du chapitre 9 de SQL Bible, A. Kriegel & B. Trukhnov, Wiley 2003 et ne représentent certainement pas un tutorial mais un pense-bête personnel.
Les jointures internes
Les clauses INNER JOIN combinent donc deux tables, ou plus, et renvoient les lignes pour lesquelles la condition de jointure se vérifie, à l'exclusion de toutes les autres.
...FROM <table1>
[INNER | NATURAL | CROSS] JOIN <table2>
[ON <condition> | USING <col_name>, ...]...
Syntaxe d'un INNER JOIN
Les jointures internes naturelles et libres
L'option NATURAL est appliquée quand les tables à joindre possède des noms de colonnes en commun et que l'on veut que la jointure les suivent. L'intérêt est que la requête est simple à écrire (mais pas forcément à comprendre) mais ceci impose que les colonnes liées aient les même noms.
Si NATURAL ne peut pas être utilisé (par exemple si les colonnes liées n'ont pas le même nom ou si on ne veut pas qu'elles soient TOUTES concernées par la jointure), on va utiliser les options INNER (le plus souvent) ou CROSS (dans des cas rares).
Ces deux options s'utilisent avec des conditions de jointures : les clauses USING et ON.
USING est suivi d'une série de noms de colonnes qui doivent être les mêmes dans les deux tables, cette clause permettant de réaliser une jointure interne comme NATURAL mais sur un sous-ensemble de colonnes communes.
La clause ON quand à elle permet de spécifier une série de conditions comme WHERE peut le faire, on est donc cette fois totalement libre de définir la jointure. Par contre la requête se complexifie d'autant (on n'a rien sans rien).
NATURAL : toutes les colonnes de même noms
INNER/CROSS avec USING : les colonnes de même noms que l'on choisit
INNER/CROSS avec ON : jointure que l'on peut définir librement
simplicité d'écriture vs liberté de jointure
Donc pour résumer : on utilisera soit NATURAL sans conditions de jointures, soit INNER/CROSS avec des conditions de jointures.
Le CROSS JOIN
Un CROSS JOIN est le produit cartésien des tenseurs en algèbre : pour chacune des lignes de la table A on associe toutes les lignes de la table B.
On peut se servir de ce type de jointure pour l'élaboration de données de test car on a immédiatement un grand nombre d'éléments après son application.
Les jointures externes
OUTER JOIN : les jointures externes car les INNER JOIN ignorent par définition les colonnes contenant des NULLs dans une seule des deux tables et que ces lignes peuvent tout de même nous intéresser.
Une jointure externe renvoie TOUTES les entrées de la table A (à la clause WHERE près évidemment) et celles de la table B qui leur correspondent SI elles existent.
...FROM <table1>
((LEFT | RIGHT | FULL) [OUTER] | UNION) JOIN <table2>
[ON <condition>] | [USING <col_name>, ...], ...
Syntaxe d'une jointure externe
Les jointures externes gauche et droite
Les jointures externes complètes
Un FULL OUTER JOIN renverra la combinaison des deux A LEFT OUTER JOIN B et A RIGHT OUTER JOIN B.
Les UNION JOINs
Les UNION JOINs représentent l'intersection des deux JOINs suivants : (A FULL OUTER JOIN B) et (A INNER JOIN B)
On extrait donc les lignes jointées qui correspondent entre les deux tables ou celles qui ont un NULL parmi les champs considérés, on extrait d'autre part les lignes dont les éléments correspondent entre les deux tables et on prend l'intersection de ces deux résultats.
On obtient donc toutes les lignes jointées qui ont un NULL dans une des deux tables.
Ex : on doit donc pouvoir avoir les matches non joués de toutes les équipes.
Les jointures à l'ancienne, i.e. sans JOIN explicites mais avec une clause WHERE
On peut effectivement facilement trouver une correspondance entre les INNER JOINs et la "l'ancienne notation" qui n'utilise que la clause WHERE.
Mais qu'en est-il des OUTER JOINs, ça a l'air bien plus compliqué de trouver une équivalence de ce type ? Ceci sans utiliser les notations batardes d'Oracle ou MS...
/*
Ex : les matches de foot joués par une équipe. Un INNER JOIN ne renverra pas les matches non joués, i.e. ceux qui ont NULL dans les scores.
Ex : on peut prendre comme exemple les matches de foot que j'ai déjà fait pour expliquer les LEFT et RIGHT OUTER JOINs. On aura tous les matches d'une équipe, joués ou pas.
Pour les FULL OUTER JOINs
>On peut peut-être séparer la notion de score à domicile et à l'extérieur pour illustrer les LEFT, RIGHT et FULL OUTER JOINs !
*/
//OUTER JOINs simplification : http://dev.mysql.com/doc/refman/5.1/en/outer-join-simplification.html
//LEFT and RIGHT JOINs optimization : http://dev.mysql.com/doc/refman/5.1/en/left-join-optimization.html
//JOINs syntax : http://dev.mysql.com/doc/refman/5.1/en/join.html