Section 11.2.3 : SQL — JOIN et relations entre tables
🎯 Objectif pédagogique
Maîtriser les JOIN SQL pour croiser les données entre plusieurs tables. Vous serez capable de combiner les informations de différentes tables pour répondre à des questions complexes — la compétence qui distingue un utilisateur SQL débutant d'un utilisateur intermédiaire.
Pourquoi les JOIN sont essentiels
Avoir des données dans une seule table est rare en pratique. Un e-commerce a des tables users, orders, products, payments. Pour répondre à "quels produits a acheté Marc ?", il faut croiser ces tables. C'est exactement ce que fait JOIN.
Marc : "Les JOIN, c'est comme la RECHERCHEV d'Excel — sauf que ça marche sur des millions de lignes et avec plusieurs critères."
Les types de JOIN
INNER JOIN — Seulement les correspondances
-- Candidatures AVEC les infos de l'utilisateur
SELECT u.name, a.company, a.position, a.status
FROM applications a
INNER JOIN users u ON a.user_id = u.id;
-- Résultat : seulement les users qui ont des candidatures
LEFT JOIN — Tout à gauche + correspondances
-- Tous les users, même ceux sans candidature
SELECT u.name, COUNT(a.id) AS nb_candidatures
FROM users u
LEFT JOIN applications a ON u.id = a.user_id
GROUP BY u.name;
-- Résultat : Marc (4), Alice (1), Bob (0) ← Bob apparaît avec 0
RIGHT JOIN et FULL JOIN
-- RIGHT JOIN : tout à droite + correspondances (rare)
-- FULL JOIN : tout des deux côtés (encore plus rare)
-- En pratique, LEFT JOIN couvre 95% des besoins
Exemples pratiques
-- 1. Candidatures de Marc avec détails
SELECT a.company, a.position, a.status, a.applied_date
FROM applications a
JOIN users u ON a.user_id = u.id
WHERE u.name = 'Marc Dupont'
ORDER BY a.applied_date DESC;
-- 2. Nombre de candidatures par statut par utilisateur
SELECT u.name, a.status, COUNT(*) AS total
FROM applications a
JOIN users u ON a.user_id = u.id
GROUP BY u.name, a.status
ORDER BY u.name, total DESC;
-- 3. JOIN triple : users → applications → interviews
SELECT u.name, a.company, i.interview_date, i.interviewer
FROM users u
JOIN applications a ON u.id = a.user_id
JOIN interviews i ON a.id = i.application_id
WHERE a.status = 'interview'
ORDER BY i.interview_date;
Sous-requêtes
-- Utilisateurs avec plus de 3 candidatures
SELECT name FROM users
WHERE id IN (
SELECT user_id FROM applications
GROUP BY user_id
HAVING COUNT(*) > 3
);
-- Salaire moyen des postes en entretien vs refusés
SELECT status, ROUND(AVG(salary_min)) AS salaire_moyen
FROM applications
WHERE status IN ('interview', 'rejected')
GROUP BY status;
Nommer vos alias
Utilisez toujours des alias courts : FROM users u, FROM applications a. Quand vous avez 3-4 tables jointes, les alias rendent la requête lisible. Convention : première lettre du nom de la table.
🏋️ Exercice pratique (20 minutes)
-- Ajoutez une table users et pratiquez les JOIN
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
);
INSERT INTO users (name, email) VALUES
('Marc Dupont', 'marc@email.com'),
('Alice Martin', 'alice@email.com'),
('Bob Chen', 'bob@email.com');
-- Réassignez user_id (ajoutez la colonne si nécessaire)
ALTER TABLE applications ADD COLUMN user_id INTEGER REFERENCES users(id);
UPDATE applications SET user_id = 1; -- Marc pour toutes
-- Exercices JOIN
-- 1. Affichez le nom de l'utilisateur avec chaque candidature
-- 2. Comptez les candidatures par utilisateur (incluant ceux avec 0)
-- 3. Trouvez l'utilisateur avec le plus de candidatures en entretien
Quelle est la différence entre INNER JOIN et LEFT JOIN ?
Dans la requête 'SELECT u.name FROM applications a JOIN users u ON a.user_id = u.id', que signifie ON ?