Lors de mes participations à ce forum, je vois parfois des jointures entre les tables qui sont spécifiées à travers la clause WHERE, ou encore quelques participants demander le fonctionnement des jointures.
Voyons ce qu’il en est dans le T-SQL de SQL Server …
Les jointures constituent le mécanisme le plus puissant du langage SQL.
Il est donc dommage de s’en passer en utilisant par exemple l’opérateur IN pour obtenir le même résultat.
Les jointures permettent de récupérer les données de plusieurs tables en les liant logiquement suivant les relations qui existent entre elles (clés primaires, clés étrangères).
Voyons en détail tous les opérateurs de jointures implémentés dans le T-SQL de SQL Server :
– Une équi-jointure, spécifiée en T-SQL par [INNER] JOIN, vous retournera les lignes pour lesquelles chaque clé des deux tables sur laquelle vous effectuez la jointure existe dans les deux tables.
Les clés n’existant pas dans l’une ou dans l’autre table sont exclues.
– Une demi-jointure, spécifiée en T-SQL par LEFT|RIGHT [OUTER] JOIN, vous retournera toutes les lignes de la table à gauche|droite de l’opérateur de jointure, y compris celles qui n’ont pas de correspondance dans la table à droite|gauche de l’opérateur de jointure.
– Une jointure externe complète, spécifiée en T-SQL par FULL [OUTER] JOIN vous retournera tous les lignes des deux tables, y compris celles qui n’ont pas de correspondance dans la table à gauche ou (inclusif) à droite de l’opérateur de jointure.
– Une jointure croisée, spécifiée en T-SQL par CROSS JOIN, effectue le produit cartésien de deux tables.
Un démonstration valant mieux que mille lignes, voyons ce qu’il en est en T-SQL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | CREATE TABLE A ( A TINYINT ) GO CREATE TABLE B ( B TINYINT ) GO INSERT INTO A VALUES (1) INSERT INTO A VALUES (2) INSERT INTO A VALUES (3) INSERT INTO A VALUES (4) INSERT INTO A VALUES (5) GO INSERT INTO B VALUES (1) INSERT INTO B VALUES (2) INSERT INTO B VALUES (3) GO -- Equi-jointure SELECT A.A, B.B FROM A INNER JOIN B ON B.B = A.A GO -- Demi-jointure gauche OU jointure externe gauche SELECT A.A, B.B FROM A LEFT OUTER JOIN B ON B.B = A.A GO INSERT INTO B VALUES (6) GO -- Demi-jointure droite OU jointure externe droite SELECT A.A, B.B FROM A RIGHT OUTER JOIN B ON B.B = A.A GO -- Jointure externe complète SELECT A.A, B.B FROM A FULL OUTER JOIN B ON B.B = A.A -- Jointure croisée (produit cartésien) SELECT A.A, B.B FROM A CROSS JOIN B |
Les mots-clé INNER et OUTER sont facultatifs (mais pas CROSS !)
Pourquoi ne faut-il pas spécifier les jointures dans une clause WHERE ?
Deux raisons à cela :
– Comme tout SGBDR, SQL Server possède un optimiseur de requête, qui recherche les mots-clé dans le code que vous lui soumettez, pour établir un plan de requête.
Dans une clause WHERE, il s’attend à trouver des contraintes (WHERE maColonne = uneValeur), et après un JOIN, une jointure.
Bien sûr, il a été programmé suffisamment intelligemment pour détecter les jointures dans les WHERE, mais dans certains cas très particuliers, il ne les trouve pas, ce qui peut rendre l’exécution de la requête peu rapide.
– Par pur souci de lisibilité de votre code : le seul mot-clé JOIN permet de séparer les jointures des contraintes de votre requête.
On réservera aussi l’opérateur IN à renseigner une liste de valeurs.
ElSuket