CodeGym /Cours /SQL SELF /Bases INNER JOIN

Bases INNER JOIN

SQL SELF
Niveau 11 , Leçon 1
Disponible

À 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;
  • table1 et table2 — ce sont les tables que tu veux joindre.
  • champ — ce sont les colonnes sur lesquelles on fait la correspondance.
  • La condition après ON indique 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.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION