Bonjour,


Xo a évoqué il y a déjà un moment l’alternative : Faire les jointures dans la clause WHERE ou avec des JOIN ?

Je dirais pour ma part que la question est à formuler autrement, car on n’effectue pas de jointure dans une clause WHERE, mais seulement une restriction appliquée à un produit cartésien, lui même formulé dans la clause FROM.

Quelques remarques :

  1. Il est parfaitement légitime de considérer la jointure comme une primitive, et de suivre la norme en utilisant JOIN. Comme à une clause SELECT ne peut être associée qu’une clause FROM unique, cette dernière peut comporter une liste de jointures (JOIN donc) de tous types (naturelle, thêta, externe, croisée, semi, etc.) : rien à redire. La clause WHERE sert alors seulement pour une salade composée de RESTRICT et de constructions telles que IN et EXISTS, relevant plus ou moins de l’algèbre relationnelle ou du calcul relationnel. JOIN n’entrant pas dans la composition de cette salade, il a le mérite de ne pas contribuer à la rendre indigeste.

  2. Maintenant, si à l’instar de Ted Codd, l’inventeur du Modèle Relationnel de Données, vous considérez la jointure comme n’étant pas une opération primitive (Cf. "Relational completeness of data base sublanguages", March 6, 1972, page 9), mais plutôt comme un RESTRICT appliqué au résultat d’un PRODUIT cartésien, alors dans le contexte de SQL, il est logique de nommer les opérandes du PRODUIT dans la clause FROM et de fournir dans la clause WHERE le prédicat du RESTRICT associé. Les parents de SQL, à savoir Don Chamberlin et al., ont manifestement utilisé la définition de Codd. Je ne cherche pas à justifier leur choix, mais simplement à remettre en perspective les choses dans le contexte de l'époque (plus de trente ans déjà...)

  3. Si IBM avait demandé à Codd de superviser le projet SQL (Codd faisait alors partie du centre de recherche d’IBM à San Jose), SQL ressemblerait aujourd’hui plus à Phoebus qu’à Quasimodo (dont je ne mets pas en cause le bon cœur), mais ceci est une autre histoire, on ne refait pas le passé...


Toujours à l’attention de Xo :

Vous écrivez "Les jointures faites dans la clause WHERE (ancienne syntaxe de 1986 !)..."

Vous pouvez remonter encore au moins de 10 ans dans le temps, pour trouver l’utilisation de WHERE en conjugaison avec la jointure, quand SQL s’appelait encore SEQUEL (nom qu’il a fallu changer pour des problèmes de copyright). L’opérateur JOIN a pour sa part été déjà décrit par Ted Codd en 1969, du temps où celui-ci était chercheur chez IBM ("Derivability, Redundancy, and Consistency of Relations Stored in Large Data Banks").


Étant un vieux de la vieille, j'utilise plutôt l'ancienne syntaxe, me contentant d'énumérer les tables à joindre, sagement rangées dans la clause FROM, accompagnées de leur noms de corrélation et je laisse le soin à l'optimiseur de s'accommoder des prédicats de jointure, très facilement repérables dans la clause WHERE, tous bien regroupés dans un coin du saladier. Je suis confus de ne pas être un très bon exemple, mais que voulez vous, après plus de 20 ans de SQL...