Aller au contenu

UGA - MIASHS - S7 - BDD - Pierre Blarre

Les jointures

Icône Présentation
1 / 1

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 :

Clients (numero, nom, prenom, rue, codePostal, ville, telephone, categorie, compte)
Commandes (numero, numeroClient*, dateCommande, statut)
Produits (numero, nom, prix, stock)
Details (numeroCommande*, numeroProduit*, quantite)

Et la requête SQL suivante :

SELECT
Co.numero AS nCom, Co.dateCommande, Co.numeroClient AS nCliCom,
C.numero AS nCli, C.nom
FROM Commandes Co, Clients C
WHERE Co.numeroClient = C.numero ;
Résultat :
Commandes
nComdateCommandenCliComnClinom
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 et Commandes
  • des lignes qui vérifient que le numéro du client dans la table Commandes est égal au numéro du client dans la table Clients

Explication

Conceptuellement, le résultat de cette jointure pourrait être construit comme suit :

  1. On réalise un produit cartésien des tables Commandes Co et Clients C
  2. On ne conserve que les lignes qui vérifient la condition de jointure : Co.numeroClient = C.numero
  3. 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 :

SELECT * 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 :

SELECT *
FROM Commandes Co, Clients C
WHERE 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.

SELECT *
FROM Commandes Co
JOIN Clients C
ON 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.

SELECT
Co.numero AS 'Commande',
C.nom AS 'Client',
P.nom AS 'Produit',
D.quantite AS 'Quantité'
FROM Commandes Co, Clients C, Details D, Produits P
WHERE Co.numeroClient = C.numero
AND Co.numero = D.numeroCommande
AND D.numeroProduit = P.numero;

Jointures multiples

La même requête, mais cette fois-ci avec la syntaxe JOIN :

SELECT
Co.numero AS 'Commande',
C.nom AS 'Client',
P.nom AS 'Produit',
D.quantite
FROM Commandes Co
JOIN Clients C ON Co.numeroClient = C.numero
JOIN Details D ON Co.numero = D.numeroCommande
JOIN Produits P ON D.numeroProduit = P.numero;
Résultat :
Détails
CommandeClientProduitquantite
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 :

SELECT
Co.numero AS nCom, Co.dateCommande, Co.numeroClient AS nCliCom,
C.numero AS nCli, C.nom
FROM Commandes Co, Clients C
WHERE Co.numeroClient = C.numero
AND C.categorie = 'C1'
AND Co.dateCommande < '2024-09-27';

Avec la syntaxe JOIN :

SELECT
Co.numero AS nCom, Co.dateCommande, Co.numeroClient AS nCliCom,
C.numero AS nCli, C.nom
FROM Commandes Co
JOIN Clients C ON Co.numeroClient = C.numero
WHERE C.categorie = 'A1'
AND Co.dateCommande < '2024-09-27';
Résultat :
Détails
nComdateCommandenCliComnClinom
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élibataires
  • LEFT JOIN : conserve les lignes de la table de gauche, même si elles n’ont pas de correspondance dans la table de droite
  • RIGHT JOIN : conserve les lignes de la table de droite, même si elles n’ont pas de correspondance dans la table de gauche
  • FULL 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

Les différentes jointures disponibles

Remarques :

  • INNER JOIN est la jointure par défaut, il n’est pas nécessaire de spécifier INNER
  • OUTER JOIN est un synonyme de FULL JOIN
  • LEFT JOIN est un synonyme de LEFT OUTER JOIN
  • RIGHT JOIN est un synonyme de RIGHT 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