[T-SQL] Les jointures

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

Laisser un commentaire