Les jointures

Soit la base de données comportant les relations suivantes :

Pour expérimenter les requêtes proposées dans la suite, voici le fichier SQLite à télécharger : Ventes_de_Produits.db

 

Supposons que nous voulions faire une requête de manière à obtenir la liste des ventes, mais avec les produits exprimés par leur nom au lieu de leur référence :

 

Pour réaliser cela, il faut réaliser une jointure entre les relations Produit et Ventes…

Les jointures permettent d’associer plusieurs relations dans une même requête, ce qui permet d’obtenir des résultats qui combinent leurs données.

En général, les jointures s’opèrent au niveaux des associations clé primaire / clé étrangères de deux relations.

 

En SQL, il existe différents types de jointures :

INNER JOIN

Jointure interne, pour retourner les enregistrements quand la condition est vrai dans les 2 tables. C’est l’une des jointures les plus communes.

On peut envisager cette jointure de différentes manières :

Avec la clause WHERE …

SELECT *
FROM A, B
WHERE A.key = B.key

 

 

Avec la clause JOIN … ON …

C’est la méthode à privilégier, car plus explicite.

SELECT *
FROM A
INNER JOIN B ON A.key = B.key

 

Dans le cas de l’exemple des ventes de produits :

SELECT * 
FROM Produits 
INNER JOIN Ventes ON Produits.reference = Ventes.ref_produit

Remarque : certaines références de produit ne figurent pas dans le résultat. Il s’agit des produits qui n’ont pas été vendus.

 

 

LEFT JOIN (ou LEFT OUTER JOIN)

Jointure externe pour retourner tous les enregistrements de la table de gauche (LEFT = gauche) même si la condition n’est pas vérifié dans l’autre table.

 

SELECT * 
FROM A 
LEFT JOIN B ON A.key = B.key

 

Dans le cas de l’exemple des ventes de produits :

SELECT * 
FROM Produits 
RIGHT JOIN Ventes ON Produits.reference = Ventes.ref_produit

Remarque : tous les produits (relation de « gauche ») figurent parmi les résultats, alors qu’ils n’ont jamais été vendus. Par conséquent, certains n-uplets (lignes) sont incomplets.
Les champs vides contiennent la valeur NULL.

 

 

RIGHT JOIN (ou RIGHT OUTER JOIN)

Jointure externe pour retourner tous les enregistrements de la table de droite (RIGHT = droite) même si la condition n’est pas vérifié dans l’autre table.

SELECT * 
FROM A 
RIGHT JOIN B ON A.key = B.key

 

Dans le cas de l’exemple des ventes de produits :

SELECT * 
FROM Produits 
RIGHT JOIN Ventes ON Produits.reference = Ventes.ref_produit

Remarque : le résultat est dans ce cas identique à celui donné par une jointure interne, car toutes les ventes concernent des produits existants.

 

 

FULL JOIN (ou FULL OUTER JOIN)

Jointure externe pour retourner les résultats quand la condition est vrai dans au moins une des 2 tables.

SELECT * 
FROM A 
FULL JOIN B ON A.key = B.key

 

Dans le cas de l’exemple des ventes de produits :

SELECT * 
FROM Produits 
FULL JOIN Ventes ON Produits.reference = Ventes.ref_produit

Remarque : le résultat est dans ce cas identique à celui donné par une jointure interne de droite.
Les champs vides contiennent la valeur NULL.

 

Jointures sans intersection

Il est également possible de réaliser des jointures en excluant l’intersection entre les relations. Pour cela, on doit compléter la requête en rajoutant un filtre (clause WHERE).

Dans le cas d’une jointure extérieure gauche, sans intersection :

 

SELECT * 
FROM A 
LEFT JOIN B ON A.key = B.key
WHERE B.key IS NULL

La clause WHERE B.key IS NULL exclus du résultat les enregistrements pour lesquels A.key = B.key, c’est à dire l’intersection !

 

Dans le cas de l’exemple des ventes de produits :

SELECT * 
FROM Produits 
RIGHT JOIN Ventes ON Produits.reference = Ventes.ref_produit
WHERE Ventes.ref_produit IS NULL

Remarque : tous les produits (relation de « gauche ») figurent parmi les résultats, alors qu’ils n’ont jamais été vendus. Par conséquent, certains n-uplets (lignes) sont incomplets.
Les champs vides contiennent la valeur NULL.

 

Autres cas envisageables :

 

 

Activité : jointures sans intersection
Écrire des requêtes permettant d'obtenir des jointures sans intersection comme décrites par les schémas ci-dessous :

Correction
SELECT * 
FROM A 
RIGHT JOIN B ON A.key = B.key
WHERE A.key IS NULL

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *