Un numéro ne suffit pas
Le transporteur appelle Cycles Loire. Il veut le nom du client de la commande 104.
Vous ouvrez la table des commandes. Vous n'y trouvez pas de nom, seulement un numéro de client : 1. Le nom est dans une autre table. Pour répondre, il faut relier les deux tables dans une seule requête.
À la fin de cette leçon
Remarque
Je peux relier deux tables pour répondre à une question.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Clé primaire | la colonne qui identifie chaque ligne une seule fois | clients.id |
| Clé étrangère | une colonne qui contient la clé primaire d'une autre table | commandes.client_id |
| Jointure | relier les lignes de deux tables dans un même résultat | |
| JOIN | le mot SQL qui fait une jointure | |
| ON | la condition qui dit quelles lignes vont ensemble |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une clé relie deux tables
Dans la table clients, la colonne id est la clé primaire. Deux clients n'ont jamais le même id.
Dans la table commandes, la colonne client_id reprend cet id. C'est une clé étrangère. Elle dit à qui appartient la commande. Le nom du client est écrit une seule fois, dans clients.
Essayez : regarder les deux tables
-- Les deux tables, l'une après l'autre.
SELECT * FROM clients;
SELECT * FROM commandes;
-- La commande 104 a client_id = 1.
-- Cherchez le client 1 dans la première table.
JOIN ... ON assemble les lignes
JOIN clients ajoute la table des clients à la requête. ON commandes.client_id = clients.id dit quelles lignes vont ensemble.
Pour chaque commande, la base cherche le client dont l'id est égal à client_id. Elle colle les deux lignes en une seule. On écrit table.colonne pour lever le doute, car les deux tables ont une colonne id.
Essayez : chaque commande avec son client
-- Chaque commande avec le nom de son client.
SELECT commandes.id, clients.nom, commandes.montant
FROM commandes
JOIN clients ON commandes.client_id = clients.id;
-- Ajoutez clients.ville après clients.nom, puis relancez.
Exemple détaillé : la jointure ligne par ligne
| Commande | client_id | Client trouvé | Montant |
|---|---|---|---|
| 101 | 1 | Claire Martin | 84 |
| 102 | 2 | Karim Benali | 23 |
| 103 | 3 | Sophie Leroy | 150 |
| 104 | 1 | Claire Martin | 39 |
| 105 | 4 | Julien Morel | 95 |
| 106 | 2 | Karim Benali | 210 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
Beaucoup pensent qu'une jointure montre tous les clients. C'est faux avec un JOIN simple. Il garde seulement les lignes qui trouvent un partenaire. Léa Garnier n'a aucune commande, donc elle n'apparaît pas. Pour garder aussi les clients sans commande, on utilise LEFT JOIN.
Une jointure se combine avec le reste
Après la jointure, tout ce que vous savez reste valable. Vous pouvez filtrer avec WHERE, trier avec ORDER BY et faire des paquets avec GROUP BY.
La requête ci-dessous donne le total dépensé par chaque client. C'est le genre de question qu'un service commercial pose chaque semaine.
Essayez : le total par client
-- Une jointure, puis un total par client.
SELECT clients.nom, COUNT(*) AS nombre, SUM(commandes.montant) AS total
FROM commandes
JOIN clients ON commandes.client_id = clients.id
GROUP BY clients.nom
ORDER BY total DESC;