Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Relier deux tables

Après cette leçon: Je peux relier deux tables pour répondre à une question.

Leçon de 45 minAucune commande

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

MotCe que ça veut direExemple
Clé primairela colonne qui identifie chaque ligne une seule foisclients.id
Clé étrangèreune colonne qui contient la clé primaire d'une autre tablecommandes.client_id
Jointurerelier les lignes de deux tables dans un même résultat
JOINle mot SQL qui fait une jointure
ONla 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

Code: sql
-- 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

Code: sql
-- 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

Commandeclient_idClient trouvéMontant
1011Claire Martin84
1022Karim Benali23
1033Sophie Leroy150
1041Claire Martin39
1054Julien Morel95
1062Karim Benali210

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

Code: sql
-- 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;

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.