Les jointures
Présentation
Les jointures permettent de coupler les lignes de plusieurs tables afin d’en extraire des données corrélées.
En reprenant notre schéma de base de données fil rouge :
1Clients (numero, nom, prenom, rue, codePostal, ville, telephone, categorie, compte)2Commandes (numero, numeroClient*, dateCommande, statut)3Produits (numero, nom, prix, stock)4Details (numeroCommande*, numeroProduit*, quantite)
Et la requête SQL suivante :
1SELECT2
3Co.numero AS nCom, Co.dateCommande, Co.numeroClient AS nCliCom,4C.numero AS nCli, C.nom5
6FROM Commandes Co, Clients C7
8WHERE Co.numeroClient = C.numero ;
Commandes | ||||
---|---|---|---|---|
nCom | dateCommande | nCliCom | nCli | nom |
1 | 2024-02-01 | 1 | 1 | Lebreton |
2 | 2024-03-15 | 1 | 1 | Lebreton |
3 | 2024-04-28 | 3 | 3 | Da Costa |
4 | 2024-06-24 | 4 | 4 | Rey |
5 | 2024-06-30 | 5 | 5 | Weiss |
6 | 2024-07-12 | 5 | 5 | Weiss |
7 | 2024-08-19 | 4 | 4 | Rey |
Cette requête produit une table temporaire qui contient :
- des colonnes des 2 tables
Clients
etCommandes
- des lignes qui vérifient que le numéro du client dans la table
Commandes
est égal au numéro du client dans la tableClients
Explication
Conceptuellement, le résultat de cette jointure pourrait être construit comme suit :
- On réalise un produit cartésien des tables
Commandes Co
etClients C
- On ne conserve que les lignes qui vérifient la condition de jointure :
Co.numeroClient = C.numero
- On ne retient que les colonnes demandées :
Co.numero as nCom, Co.dateCommande, Co.numeroClient as nCliCom, C.numero as nCli, C.nom
On parlera ici d’une jointure interne (ou INNER JOIN
), c.-à-d. que seules les lignes qui vérifient la condition de jointure sont conservées.
La jointure interne est la jointure la plus courante en SQL.
Elle représente une intersection des ensembles de lignes des tables jointes.
Le produit cartésien
Une jointure, sans condition de jointure, n’est pas interdite :
1SELECT * FROM Commandes, Clients;
Cette jointure particulière porte le nom de produit relationnel ou produit cartésien
Syntaxes
Il existe plusieurs syntaxes pour réaliser une jointure en SQL.
La syntaxe la plus ancienne utilise la clause FROM
avec une virgule pour séparer les tables et la clause WHERE
pour spécifier la condition de jointure :
1SELECT *2FROM Commandes Co, Clients C3WHERE Co.numeroClient = C.numero ;
La syntaxe la plus récente utilise la clause JOIN
avec la clause ON
pour spécifier la condition de jointure.
1SELECT *2FROM Commandes Co3JOIN Clients C4ON Co.numeroClient = C.numero ;
Dans cet exemple, le résultat produit est exactement le même.
Les jointures
Jointures multiples
Une jointure peut s’appliquer sur de multiples tables.
Pour n
tables impliquées dans la requête, il faut au moins n-1
conditions de jointures.
Exemple
On souhaite obtenir les détails des commandes, avec pour chaque ligne de résultat les numéros de commande, nom du client, nom du produit et quantité commandée.
On doit donc joindre les 4 tables Commandes
, Clients
, Details
et Produits
pour obtenir les informations souhaitées.
1SELECT2
3Co.numero AS 'Commande',4C.nom AS 'Client',5P.nom AS 'Produit',6D.quantite AS 'Quantité'7
8FROM Commandes Co, Clients C, Details D, Produits P9
10WHERE Co.numeroClient = C.numero11AND Co.numero = D.numeroCommande12AND D.numeroProduit = P.numero;
Jointures multiples
La même requête, mais cette fois-ci avec la syntaxe JOIN
:
1SELECT2
3Co.numero AS 'Commande',4C.nom AS 'Client',5P.nom AS 'Produit',6D.quantite7
8FROM Commandes Co9JOIN Clients C ON Co.numeroClient = C.numero10JOIN Details D ON Co.numero = D.numeroCommande11JOIN Produits P ON D.numeroProduit = P.numero;
Détails | |||
---|---|---|---|
Commande | Client | Produit | quantite |
1 | Lebreton | T-shirt | 3 |
1 | Lebreton | Pantalon | 1 |
1 | Lebreton | Chaussures | 1 |
2 | Lebreton | Casquette | 1 |
2 | Lebreton | Sac à dos | 1 |
3 | Da Costa | T-shirt | 4 |
3 | Da Costa | Pantalon | 1 |
3 | Da Costa | Chaussures | 2 |
3 | Da Costa | Casquette | 1 |
3 | Da Costa | Sac à dos | 1 |
4 | Rey | T-shirt | 7 |
4 | Rey | Pantalon | 1 |
5 | Weiss | T-shirt | 2 |
5 | Weiss | Pantalon | 1 |
5 | Weiss | Chaussures | 1 |
6 | Weiss | T-shirt | 10 |
7 | Rey | T-shirt | 1 |
On a bien 3 conditions de jointure pour 4 tables impliquées.
Conditions multiples
Il est possible de spécifier d’autres conditions dans la clause WHERE
pour filtrer les résultats, quelle que soit la syntaxe utilisée.
Exemple : Donner pour chaque commande antérieure au 27/09/2024 passée par des clients de catégorie C1 le numéro de commande, sa date, le numéro du client, son nom et sa ville
On doit donc joindre les tables Commandes
et Clients
pour obtenir les informations souhaitées, puis filtrer les résultats avec la condition C.categorie = 'C1'
et Co.dateCommande < '2024-09-27'
.
Avec la syntaxe classique :
1SELECT2 Co.numero AS nCom, Co.dateCommande, Co.numeroClient AS nCliCom,3 C.numero AS nCli, C.nom4
5FROM Commandes Co, Clients C6
7WHERE Co.numeroClient = C.numero8AND C.categorie = 'C1'9AND Co.dateCommande < '2024-09-27';
Avec la syntaxe JOIN
:
1SELECT2Co.numero AS nCom, Co.dateCommande, Co.numeroClient AS nCliCom,3C.numero AS nCli, C.nom4
5FROM Commandes Co6JOIN Clients C ON Co.numeroClient = C.numero7
8WHERE C.categorie = 'A1'9AND Co.dateCommande < '2024-09-27';
Détails | ||||
---|---|---|---|---|
nCom | dateCommande | nCliCom | nCli | nom |
1 | 2024-02-01 | 1 | 1 | Lebreton |
2 | 2024-03-15 | 1 | 1 | Lebreton |
Les lignes célibataires
Les lignes célibataires sont les lignes qui n’ont aucune correspondance dans l’une des tables de la jointure.
- Par exemple, les clients qui n’ont passé aucune commande
- Il existe une méthode pour obtenir les lignes célibataires, appelée la jointure externe (
OUTER JOIN
) - Plus généralement, les SGBD permettent de faire des jointures sur les différentes parties des relations (inclusion, exclusion, etc.)
Les différentes jointures
La jointure interne (INNER JOIN
) est la plus courante, mais il existe d’autres types de jointures :
OUTER JOIN
: permet de conserver les lignes célibatairesLEFT JOIN
: conserve les lignes de la table de gauche, même si elles n’ont pas de correspondance dans la table de droiteRIGHT JOIN
: conserve les lignes de la table de droite, même si elles n’ont pas de correspondance dans la table de gaucheFULL JOIN
: conserve toutes les lignes des deux tables, même si elles n’ont pas de correspondance dans l’autre table
Schématique des différentes jointures
Remarques :
INNER JOIN
est la jointure par défaut, il n’est pas nécessaire de spécifierINNER
OUTER JOIN
est un synonyme deFULL JOIN
LEFT JOIN
est un synonyme deLEFT OUTER JOIN
RIGHT JOIN
est un synonyme deRIGHT OUTER JOIN
Conclusion
- Les jointures permettent de coupler les lignes de plusieurs tables
- La jointure interne
INNER JOIN
est la plus courante - Par défaut, c’est un
INNER JOIN
qui est réalisé- avec JOIN / ON
- ou en utilisant la clause WHERE T1.id = T2.rid
- Les autres jointures peuvent être utiles pour certaines requêtes
- On peut spécifier des conditions supplémentaires dans la clause WHERE
- On peut utiliser tout ce qui a été vu précédemment avec des jointures pour réaliser des requêtes complexes