Section 11.2.2 : SQL — SELECT, WHERE et filtres
🎯 Objectif pédagogique
Écrire des requêtes SQL pour lire et filtrer des données. Vous serez capable d'interroger une base de données pour extraire exactement les informations dont vous avez besoin — la compétence fondamentale de tout travail avec des données.
SQL — Le langage universel des données
Marc connaît les formules Excel : RECHERCHEV, FILTRE, SOMME.SI. SQL est la version pro et universelle de ces formules. C'est le langage que parlent TOUTES les bases de données relationnelles.
SQL (Structured Query Language) existe depuis 1974 — c'est l'un des langages les plus stables et durables de l'informatique.
SELECT — Récupérer des données
-- Tout sélectionner
SELECT * FROM users;
-- Colonnes spécifiques
SELECT name, email FROM users;
-- Alias
SELECT name AS nom, email AS courriel FROM users;
-- Valeurs uniques
SELECT DISTINCT status FROM applications;
WHERE — Filtrer les résultats
-- Égalité
SELECT * FROM applications WHERE status = 'interview';
-- Comparaisons
SELECT * FROM applications WHERE applied_date >= '2026-03-01';
-- LIKE (recherche partielle)
SELECT * FROM applications WHERE company LIKE '%Google%';
SELECT * FROM users WHERE email LIKE '%@gmail.com';
-- IN (liste de valeurs)
SELECT * FROM applications WHERE status IN ('interview', 'offer');
-- BETWEEN (intervalle)
SELECT * FROM applications WHERE applied_date BETWEEN '2026-01-01' AND '2026-03-31';
-- NULL
SELECT * FROM applications WHERE notes IS NULL;
SELECT * FROM applications WHERE notes IS NOT NULL;
-- Combinaisons (AND, OR, NOT)
SELECT * FROM applications
WHERE status = 'interview'
AND applied_date >= '2026-03-01'
AND company NOT LIKE '%GAFAM%';
ORDER BY — Trier les résultats
-- Tri croissant (défaut)
SELECT * FROM applications ORDER BY applied_date;
-- Tri décroissant
SELECT * FROM applications ORDER BY applied_date DESC;
-- Tri multiple
SELECT * FROM applications ORDER BY status ASC, applied_date DESC;
LIMIT — Limiter le nombre de résultats
-- Les 10 dernières candidatures
SELECT * FROM applications ORDER BY applied_date DESC LIMIT 10;
-- Pagination : page 2 (éléments 11-20)
SELECT * FROM applications ORDER BY id LIMIT 10 OFFSET 10;
Fonctions d'agrégation
-- Compter
SELECT COUNT(*) FROM applications; -- Total
SELECT COUNT(*) FROM applications WHERE status = 'offer'; -- Offres
-- Statistiques
SELECT MIN(applied_date) AS premiere, MAX(applied_date) AS derniere
FROM applications;
-- GROUP BY (comme un tableau croisé dynamique)
SELECT status, COUNT(*) AS total
FROM applications
GROUP BY status
ORDER BY total DESC;
-- Résultat :
-- applied | 15
-- interview | 5
-- rejected | 3
-- offer | 2
-- HAVING (filtre sur les agrégats)
SELECT company, COUNT(*) AS nb_postes
FROM applications
GROUP BY company
HAVING COUNT(*) >= 2;
SQL ≈ Excel sous stéroïdes
Marc fait le parallèle : SELECT = colonnes visibles dans le tableur. WHERE = filtre Excel. ORDER BY = tri. GROUP BY = tableau croisé dynamique. La différence : SQL traite des millions de lignes en millisecondes, là où Excel rame à 100 000 lignes.
🏋️ Exercice pratique (20 minutes)
Utilisez SQLite Online pour pratiquer :
-- Créer la table
CREATE TABLE applications (
id INTEGER PRIMARY KEY,
company TEXT NOT NULL,
position TEXT NOT NULL,
status TEXT DEFAULT 'applied',
applied_date DATE,
salary_min INTEGER,
notes TEXT
);
-- Insérer des données
INSERT INTO applications (company, position, status, applied_date, salary_min) VALUES
('Google', 'Frontend Developer', 'interview', '2026-03-01', 75000),
('Meta', 'React Engineer', 'applied', '2026-03-05', 80000),
('Stripe', 'Full-Stack', 'offer', '2026-02-15', 70000),
('Datadog', 'Python Dev', 'rejected', '2026-02-01', 65000),
('OVH', 'DevOps Junior', 'applied', '2026-03-10', 45000),
('Vercel', 'Frontend', 'interview', '2026-03-12', 85000),
('Mistral AI', 'ML Engineer', 'applied', '2026-03-15', 90000),
('BNP Paribas', 'Data Analyst', 'interview', '2026-02-20', 55000),
('Doctolib', 'Backend Python', 'applied', '2026-03-08', 60000),
('Alan', 'Full-Stack JS', 'offer', '2026-01-20', 72000);
-- Exercices
-- 1. Toutes les candidatures en entretien
SELECT * FROM applications WHERE status = 'interview';
-- 2. Candidatures avec salaire > 70k, triées par salaire décroissant
SELECT company, position, salary_min FROM applications
WHERE salary_min > 70000 ORDER BY salary_min DESC;
-- 3. Nombre de candidatures par statut
SELECT status, COUNT(*) FROM applications GROUP BY status;
-- 4. Les 3 dernières candidatures
SELECT * FROM applications ORDER BY applied_date DESC LIMIT 3;
Quelle requête retourne les candidatures chez Google OU Meta ?
Que fait GROUP BY status dans une requête SQL ?