Polarys

Interroger une base

Jointures entre tables

Jointures entre tables

Pourquoi plusieurs tables plutôt qu'une seule

Stocker les commandes d'un client directement dans la table clients (nom, ville, commande1, commande2...) devient vite ingérable : un client peut avoir 0, 5 ou 500 commandes. Les bases relationnelles séparent l'information en tables liées par des clés étrangères.

Table clients          Table commandes
| id | nom     |       | id | client_id | montant |
|----|---------|       |----|-----------|---------|
| 1  | Dupont  |       | 101| 1         | 45.00   |
| 2  | Martin  |       | 102| 1         | 12.50   |
                        | 103| 2         | 78.00   |

client_id dans la table commandes référence id dans la table clients : c'est la clé étrangère qui relie les deux tables.

INNER JOIN : combiner deux tables

SELECT clients.nom, commandes.montant
FROM clients
INNER JOIN commandes ON clients.id = commandes.client_id;

Cette requête retourne une ligne par commande, avec le nom du client associé. Un client sans aucune commande n'apparaît pas avec un INNER JOIN.

LEFT JOIN : garder toutes les lignes de la table de gauche

SELECT clients.nom, commandes.montant
FROM clients
LEFT JOIN commandes ON clients.id = commandes.client_id;

Avec un LEFT JOIN, tous les clients apparaissent, même ceux sans commande (avec montant à NULL pour eux).

flowchart LR
    A[INNER JOIN] --> B["Seulement les lignes\nprésentes dans les deux tables"]
    C[LEFT JOIN] --> D["Toutes les lignes de gauche,\nmême sans correspondance à droite"]

Cas concret

Un rapport doit lister tous les clients, y compris ceux qui n'ont jamais passé commande (pour une campagne de relance marketing ciblée). Utiliser un INNER JOIN exclurait silencieusement ces clients inactifs du résultat, faussant le rapport sans erreur visible. Un LEFT JOIN est la seule option qui capture réellement l'intégralité de la base clients.

Erreurs fréquentes

  • Utiliser INNER JOIN par défaut sans réfléchir, alors que le besoin réel (inclure les lignes sans correspondance) nécessite un LEFT JOIN : erreur silencieuse, sans message d'erreur, juste des données manquantes non détectées.
  • Oublier la condition ON, produisant un produit cartésien (chaque ligne de la table 1 combinée à chaque ligne de la table 2), un résultat massif et incohérent.
  • Confondre la direction du LEFT JOIN : "gauche" désigne la table mentionnée avant LEFT JOIN dans la requête, pas une notion géographique universelle.

À retenir

  • INNER JOIN ne retourne que les lignes ayant une correspondance dans les deux tables.
  • LEFT JOIN garde toutes les lignes de la table de gauche, même sans correspondance à droite (valeurs NULL).
  • Oublier la condition ON produit un produit cartésien, un résultat massif et généralement inexploitable.

Mini-exercice

Un rapport doit inclure tous les produits d'un catalogue, y compris ceux jamais vendus, avec leur total de ventes (0 si aucune vente). Quel type de jointure utiliser entre la table produits et la table ventes ?

Réponse : un LEFT JOIN depuis la table produits vers la table ventes, garantissant que tous les produits apparaissent même sans aucune vente associée, contrairement à un INNER JOIN qui les exclurait silencieusement.

Quiz de validation

Quiz - 2 questions

1. Qu'exclut un INNER JOIN par rapport à un LEFT JOIN ?

2. Que se passe-t-il si la condition ON est oubliée dans une jointure ?

Suis ta progression

Crée un compte gratuit pour suivre ta progression et accéder à toutes les leçons.