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 valeurNULL
.
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 valeurNULL
.
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 valeurNULL
.
Autres cas envisageables :