Temps de lecture approximative : 13 minutes
Depuis le début du cours, nos requêtes portent uniquement sur une table à la fois. Les jointures en SQL permettent d’associer plusieurs tables dans une même requête. Cela permet d'exploiter la puissance des bases de données relationnelles pour obtenir des résultats qui combinent les données de plusieurs tables en même temps de manière efficace. Dans ce chapitre, nous aborderons deux types de jointures différents avec les commandes SQL suivantes : INNER JOIN
et LEFT JOIN
.
Les jointures SQL consistent à associer les lignes de deux tables en associant l'égalité des valeurs d'une colonne d'une première table par rapport à la valeur d'une colonne d'une seconde table. On nomme ce concept : la condition. L'intérêt des jointures ? Elles sont tout d'abord un moyen d'optimiser les processus, en améliorant leur vitesse d'exécution. De manière générale, il est préférable de faire une seule requête avec plusieurs jointures plutôt que plusieurs requêtes simples. Elles permettens également d'éviter les répétitions d'informations.
INNER JOIN
Dans le langage SQL la commande INNER JOIN
, est un type de jointure très commune pour lier plusieurs tables entre-elles dans une même requête. Cette commande retourne les enregistrements lorsqu'il y a au moins une ligne dans chaque colonne listé dans la condition. Autrement dit, lorsque la condition est respectée dans les deux tables.
L’utilisation la plus basique de cette commande s’effectue de la manière suivante :
SELECT *
FROM table_1
INNER JOIN table_2 ON table_1.une_colonne = table_2.autre_colonne;
Cette requête SQL va donc sélectionner grâce à la commande INNER JOIN
les enregistrements des tables table_1 et table_2 lorsque les données de la colonne une_colonne de la table table_1 est égal aux données de la colonne autre_colonne de la table table_2.
Afin de mettre en évidence l'utilisation de la commande INNER JOIN
et de comprendre rapidement comment cette dernière fonctionne, voyons sans plus attendre un exemple simple. Pour cet exemple, nous utiliserons les tables clients et commandes qui contientent les colonnes et données suivantes. Ces dernières simulent les tables qui contiennent les clients et les commandes d'une entreprise quelconque.
id | prenom | nom | |
---|---|---|---|
1 | Marine | Leroy | mleroy@example.com |
2 | Jean | René | jrene@example.com |
3 | Ted | Bundy | tbundy@example.com |
4 | Paul | Bismuth | pbismuth@example.com |
5 | Caroline | Rodriguez | crodriguez@example.com |
id_commande | id_client | date_ajout | transporteur |
---|---|---|---|
1 | 1 | 2019-04-01 | Mondial Relay |
2 | 2 | 2019-04-02 | Colissimo |
3 | 2 | 2019-04-05 | Colissimo |
4 | 5 | 2019-04-08 | Colissimo |
5 | 9 | 2019-04-10 | Colissimo |
Reprenons notre première requête SQL avec la commande INNER JOIN
et complétons correctement cette dernière avec les tables exemples. Nous souhaitons sélectionner uniquement les clients qui ont commandés avec leurs commandes respectives. Pour effectuer cette opération, la requête est la suivante :
SELECT id_client, email, id_commande, date_ajout, transporteur
FROM clients
INNER JOIN commandes ON clients.id = commandes.id_client;
id_client | id_commande | date_ajout | transporteur | |
---|---|---|---|---|
1 | mleroy@example.com | 1 | 2019-04-01 | Mondial Relay |
2 | jrene@example.com | 2 | 2019-04-02 | Colissimo |
2 | jrene@example.com | 3 | 2019-04-05 | Colissimo |
5 | crodriguez@example.com | 4 | 2019-04-08 | Colissimo |
Le résultat de la requête met en évidence la jointure et son utilité. On retrouve donc les commandes des clients #1, #2 et #5, car ils ont commandé au moins une fois. A l'inverse, on ne retrouve pas les clients #3 et #4 car ils n'ont pas de commande associés. On peut remarquer également l'absence de la commande #5. En effet, cette dernière est lié au client #9 qui n'est pas présente dans la table clients. Cet enregistrement ne fait donc pas parti de l'intersection.
LEFT JOIN
Dans le langage SQL la commande LEFT JOIN
, est un type de jointure commune pour lier plusieurs tables entre-elles dans une même requête. Cette commande retourne tous les enregistrements de la table première table, celle de gauche (left), avec la correspondance dans la deuxième table si la condition est respectée. En d'autres termes, ce type de jointure permet de retourner tous les enregistrements d'une table avec les données liées d'une autre table si elles existent.
L’utilisation la plus basique de cette commande s’effectue de la manière suivante :
SELECT *
FROM table_1
LEFT JOIN table_2 ON table_1.une_colonne = table_2.autre_colonne;
Cette requête SQL va donc sélectionner grâce à la commande LEFT JOIN
tous les enregistrements de la table table_1 et les enregistrements lorsque les données de la colonne une_colonne de la table table_1 est égal aux données de la colonne autre_colonne de la table table_2.
Afin de mettre en évidence l'utilisation de la commande LEFT JOIN
et de comprendre rapidement comment cette dernière fonctionne, voyons sans plus attendre un exemple simple. Pour cet exemple, nous utiliserons les mêmes tables clients et commandes déjà décrites ci-dessus.
Reprenons notre première requête SQL avec la commande LEFT JOIN
et complétons correctement cette dernière avec les tables exemples. Nous souhaitons sélectionner tous les clients avec leurs commandes respectives. Pour effectuer cette opération, la requête est la suivante :
SELECT id_client, email, id_commande, date_ajout, transporteur
FROM clients
LEFT JOIN commandes ON clients.id = commandes.id_client;
id_client | id_commande | date_ajout | transporteur | |
---|---|---|---|---|
1 | mleroy@example.com | 1 | 2019-04-01 | Mondial Relay |
2 | jrene@example.com | 2 | 2019-04-02 | Colissimo |
2 | jrene@example.com | 3 | 2019-04-05 | Colissimo |
3 | tbundy@example.com | |||
4 | pbismuth@example.com | |||
5 | crodriguez@example.com | 4 | 2019-04-08 | Colissimo |
Le résultat de la requête met en évidence la jointure avec la commande LEFT JOIN
, son utilité et surtout sa différence avec la commande INNER JOIN
. On retrouve donc bien tous les clients avec les commandes respectives. Pour les clients #3 et #4 qui n'ont pas de commandes, les colonnes sélectionnés de la table commandes sont vides.
Nos exemples précédents montrent comment faire une jointure entre deux tables. Il se peut que vous ayez besoin de faire une jointure entre plus de deux tables. La syntaxe est la suivante pour les commandes INNER JOIN
et LEFT JOIN
. Cette syntaxe peut être répété autant de fois que nécessaire.
INNER JOIN
SELECT *
FROM table_1
INNER JOIN table_2 ON table_1.une_colonne = table_2.autre_colonne
INNER JOIN table_3 ON table_1.une_colonne = table_3.autre_colonne;
LEFT JOIN
SELECT *
FROM table_1
LEFT JOIN table_2 ON table_1.une_colonne = table_2.autre_colonne
LEFT JOIN table_3 ON table_1.une_colonne = table_3.autre_colonne;