À la dernière leçon, on a parlé des différents types de JOIN en SQL. Aujourd'hui, on va s'arrêter plus en détail sur INNER JOIN.
INNER JOIN — c'est un type de jointure de données dans les bases relationnelles qui te permet de prendre des lignes de deux tables et de ne retourner que celles qui "matchent" selon la condition que tu définis. En gros, INNER JOIN ne retourne que les parties qui se croisent entre deux tables, tout le reste est ignoré.
Imagine que t'as deux boîtes. Dans l'une, il y a des cartes avec des étudiants, et dans l'autre — des cartes avec les cours sur lesquels les étudiants sont inscrits. Tu veux savoir quels étudiants sont inscrits à quels cours. S'il n'y a pas de correspondance (genre, un étudiant n'est inscrit nulle part), ces données ne nous intéressent pas pour l'instant. Ce genre de scénario est parfait pour INNER JOIN.
Syntaxe de INNER JOIN
La syntaxe est assez directe — tu indiques les deux tables que tu veux joindre, et tu poses la condition de jointure avec le mot-clé ON.
SELECT colonnes
FROM table1 INNER JOIN table2
ON table1.champ = table2.champ;
table1ettable2— ce sont les tables que tu veux joindre.champ— ce sont les colonnes sur lesquelles on fait la correspondance.- La condition après
ONindique les règles pour faire matcher les lignes des deux tables.
Exemples d'utilisation de INNER JOIN
Pour les exemples suivants, on va bosser avec deux tables :
Table students — données sur les étudiants
| student_id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Anna | 22 |
| 3 | Peter | 19 |
| 4 | Dia | 21 |
Table enrollments — données sur les inscriptions aux cours
| enrollment_id | student_id | course_id |
|---|---|---|
| 101 | 1 | 501 |
| 102 | 2 | 502 |
| 103 | 2 | 503 |
| 104 | 3 | 504 |
Remarque : l'étudiante Dia (avec student_id = 4) n'est inscrite à aucun cours.
Exemple 1 : Récupérer les inscriptions des étudiants et leurs cours
On veut savoir quels étudiants sont inscrits à quels cours. C'est un exemple typique d'utilisation de INNER JOIN. On ne s'intéresse qu'aux cas où il y a une correspondance entre les tables students et enrollments sur la base de student_id.
SELECT students.name, enrollments.course_id
FROM students INNER JOIN enrollments
ON students.student_id = enrollments.student_id;
Résultat :
| name | course_id |
|---|---|
| Otto | 501 |
| Anna | 502 |
| Anna | 503 |
| Peter | 504 |
Qu'est-ce qu'on voit ? INNER JOIN n'a retourné que les étudiants qui sont inscrits à des cours. L'étudiante Dia, qui n'est inscrite nulle part, n'apparaît pas dans le résultat.
Exemple 2 : Récupérer les commandes et les clients
Maintenant, voyons un autre exemple. Disons qu'on a les tables orders (commandes) et customers (clients). On veut obtenir la liste de toutes les commandes avec les noms des clients.
Table orders
| order_id | customer_id | amount |
|---|---|---|
| 1 | 101 | 500 |
| 2 | 102 | 300 |
| 3 | 103 | 700 |
Table customers
| customer_id | name |
|---|---|
| 101 | Otto |
| 102 | Anna |
| 104 | Peter |
Tâche : on doit joindre orders et customers sur customer_id pour ne retourner que les commandes qui ont un client correspondant.
SELECT orders.order_id, customers.name, orders.amount
FROM orders INNER JOIN customers
ON orders.customer_id = customers.customer_id;
Résultat :
| order_id | name | amount |
|---|---|---|
| 1 | Otto | 500 |
| 2 | Anna | 300 |
Fais gaffe, la commande avec order_id = 3 n'apparaît pas dans le résultat, parce que le client avec customer_id = 103 n'existe pas dans la table customers.
Comment INNER JOIN aide à joindre des tables (et ce qui peut mal tourner)
INNER JOIN — c'est l'outil principal que tu vas utiliser dans quasi tous les projets qui bossent avec une base relationnelle. C'est comme une clé à molette dans une boîte à outils : tu peux essayer de t'en passer, mais tu vas galérer pour arriver à tes fins. Par exemple :
- Quand tu fais des rapports où tu dois combiner des données de plusieurs tables.
- Pour faire de l'analytics, quand tu dois joindre des faits avec des dimensions (genre ventes et clients).
- Pour intégrer des données de systèmes externes.
L'erreur la plus fréquente chez les débutants, c'est d'oublier le ON ou de mal écrire la condition de jointure. Si tu ne mets pas la bonne condition, au lieu du résultat attendu tu vas te retrouver avec le produit cartésien des deux tables — ça peut faire des milliers ou des millions de lignes qui n'ont aucun sens.
Exemple d'erreur :
Dans cet exemple, il n'y a pas de condition de jointure, donc la requête va créer toutes les combinaisons possibles de lignes entre les deux tables (et c'est sûrement pas ce que tu veux) :
SELECT students.name, enrollments.course_id
FROM students, enrollments; -- ERREUR : pas de condition de jointure !
Le résultat va ressembler à un vrai chaos : chaque ligne de students va être combinée avec chaque ligne de enrollments.
GO TO FULL VERSION