86
CHAPITRE 4. LANGAGE SQL
4.7
Interrogerunebase –Langagedemanipulationdedonnées (LMD) :
SELECT (2e partie)
4.7.1 La clause FROM (2e partie) : les jointures
Recommandation
Dans lamesure du possible, et contrairement à ce que nous avons fait jusqu’à présent, il est préférable
d’utiliser un opérateur de jointure normalisé SQL2 (mot-clef JOIN) pour effectuer une jointure. En effet,
les jointures faites dans la clause WHERE (ancienne syntaxe datant de 1986) ne permettent pas de faire la
distinction, de prime abord, entre ce qui relève de la sélection et ce qui relève de la jointure puisque tout
est regroupé dans une seule clause (la clause WHERE). La lisibilité des requêtes est plus grande en utilisant
la syntaxe de l’opérateur JOIN qui permet d’isoler les conditions de sélections (clause WHERE) de celles de
jointures (clauses JOIN), et qui permet également de cloisonner les conditions de jointures entre chaque
couples de table. De plus, l’optimisation d’exécution de la requête est souvent plus pointue lorsque l’on
utilise l’opérateur JOIN. Enfin, lorsque l’on utilise l’ancienne syntaxe, la suppression de la clause WHERE
à des fins de tests pose évidemment des problèmes.
Le produit cartésien
Prenons une opération de jointure entre deux tables R1 et R2 selon une expression logique E. En
algèbre relationnelle, cette opération se note :
R1 ER2
Dans la section 3.4.8, nous avons vu que la jointure n’est rien d’autre qu’un produit cartésien suivi d’une
sélection :
R1 ER2 = σE(R1 × R2)
On peut également dire que le produit cartésien n’est rien d’autre qu’une jointure dans laquelle l’expres-
sion logique E est toujours vraie :
R1 × R2 = R1 trueR2
Nous avons vu section 4.5.5 que le produit cartésien entre deux tables table_1 et table_2 peut
s’écrire en SQL :
SELECT * FROM table_1, table_2
Il peut également s’écrire en utilisant le mot-clé JOIN dédié aux jointures de la manière suivante :
SELECT * FROM table_1 CROSS JOIN table_2
En fait, sous PostgreSQL, les quatre écritures suivantes sont équivalentes :
SELECT * FROM ta