Jointures — relier deux tables
Le problème : les données sont séparées
On a une table clients et une table commandes.
Pour afficher le nom du client avec ses commandes, il faut relier les deux tables.
C'est exactement ce que font les jointures (JOIN).
Une jointure combine les colonnes de deux tables en une seule requête. Le résultat est une table virtuelle qui contient des données des deux sources.
INNER JOIN : l'intersection
INNER JOIN renvoie uniquement les lignes qui ont une correspondance dans les deux tables.
Si un client n'a aucune commande, il n'apparaît pas. Si une commande n'a pas de client valide, elle n'apparaît pas.
-- Afficher chaque commande avec le nom du client
SELECT
clients.nom,
commandes.id AS commande_id,
commandes.montant
FROM commandes
INNER JOIN clients ON commandes.client_id = clients.id;
La clause ON indique la condition de jointure :
"la colonne client_id dans commandes doit correspondre à id dans clients".
C'est exactement le lien que définissait la FOREIGN KEY de la leçon précédente.
Les alias de tables : simplifier l'écriture
Écrire commandes.client_id à chaque fois est long.
On utilise des alias courts pour les tables.
-- c = clients, cmd = commandes
SELECT
c.nom,
c.ville,
cmd.montant,
cmd.date_commande
FROM commandes AS cmd
INNER JOIN clients AS c ON cmd.client_id = c.id;
LEFT JOIN : tout conserver à gauche
LEFT JOIN renvoie toutes les lignes de la table de gauche (celle dans FROM),
même si elles n'ont pas de correspondance dans la table de droite.
Les colonnes de droite seront NULL pour ces lignes.
-- Tous les clients, avec leurs commandes si elles existent
SELECT
c.nom,
cmd.montant
FROM clients AS c
LEFT JOIN commandes AS cmd ON c.id = cmd.client_id;
Les clients qui n'ont jamais commandé apparaissent quand même — avec NULL dans la colonne montant.
Pratique pour trouver "les clients sans commande" :
-- Clients qui n'ont JAMAIS commandé
SELECT c.nom
FROM clients AS c
LEFT JOIN commandes AS cmd ON c.id = cmd.client_id
WHERE cmd.id IS NULL;
Comparaison visuelle des JOIN
INNER JOIN
Seulement les lignes qui ont une correspondance dans les deux tables.
Clients sans commande → exclus.
Commandes sans client → exclues.
LEFT JOIN
Toutes les lignes de la table de gauche.
Correspondances de droite si elles existent, sinon NULL.
Clients sans commande → inclus avec NULL.
JOIN avec WHERE et ORDER BY
Les jointures se combinent avec toutes les clauses vues avant.
-- Commandes de plus de 50€ avec le nom du client, triées par montant
SELECT
c.nom,
cmd.montant,
cmd.date_commande
FROM commandes AS cmd
INNER JOIN clients AS c ON cmd.client_id = c.id
WHERE cmd.montant > 50
ORDER BY cmd.montant DESC;
- Un
JOINrelie deux tables via une conditionON table1.col = table2.col INNER JOIN— seulement les lignes qui ont une correspondance dans les deux tablesLEFT JOIN— toutes les lignes de gauche, correspondances de droite ou NULL- Les alias de tables (
AS c,AS cmd) simplifient l'écriture - On peut combiner JOIN avec WHERE, ORDER BY, GROUP BY
WHERE col IS NULLaprès LEFT JOIN = trouver les lignes sans correspondance