Guide structuré · Apprendre dans le bon ordre · Lecture : ~20 min Teste ton niveau actuel avec le test SQL
Pourquoi ce guide existe La plupart des gens copient des requĂȘtes SQL gĂ©nĂ©rĂ©es par une IA. Ils ne comprennent pas ce quâils font. Et ça se voit dĂšs que le problĂšme change dâune ligne.
LâIA ne remplace pas les bases. Elle les accĂ©lĂšre. Mais encore faut-il savoir lire ce quâelle produit â et repĂ©rer quand elle se trompe.
Ce guide est fait pour toi si :
Tu sais Ă©crire une requĂȘte basique mais tu ne sais pas vraiment pourquoi elle fonctionne
Tu copies des requĂȘtes sans pouvoir les adapter
Tu veux un programme structuré, dans le bon ordre, avec des outils concrets
Ce que tu reçois :
Un programme complet du niveau débutant à intermédiaire
Les concepts clés à maßtriser dans le bon ordre
Des prompts pour tâentraĂźner avec lâIA Ă chaque Ă©tape
La plateforme recommandée pour passer au niveau supérieur
đ§Ș OĂč en es-tu vraiment ? Avant de commencer ce programme, mesure ton niveau actuel. Le test prend 5 minutes et te dit exactement oĂč dĂ©marrer. đ Faire le test de niveau RĂ©sultat en direct · Niveau calibrĂ© · Programme personnalisĂ©
Ce programme est découpé en 4 niveaux , chacun avec :
Les concepts Ă maĂźtriser (dans lâordre)
Les exercices pratiques pour valider la compréhension
Un prompt IA pour sâentraĂźner sans avoir de dataset
Le signal de passage au niveau suivant
Durée estimée par niveau :
Niveau
Concepts
Durée estimée
Prérequis
Niveau 1 â Fondations
SELECT, WHERE, ORDER BY
1 Ă 2 jours
Aucun
Niveau 2 â AgrĂ©gations
GROUP BY, fonctions dâagrĂ©gation
2 Ă 3 jours
Niveau 1
Niveau 3 â Relations
JOIN, sous-requĂȘtes
3 Ă 5 jours
Niveau 2
Niveau 4 â Analyse
FenĂȘtres, CTE, NULL
5 Ă 7 jours
Niveau 3
NIVEAU 1 â Les fondations (dĂ©butant) Objectif : comprendre comment SQL lit et filtre les donnĂ©es
Concept 1.1 â Lâordre dâexĂ©cution SQL Pourquoi câest fondamental
La plupart des bugs de dĂ©butants viennent dâune incomprĂ©hension de lâordre dans lequel SQL exĂ©cute les clauses. Ce nâest pas lâordre dans lequel tu Ă©cris.
Ordre d'Ă©criture : SELECT â FROM â WHERE â GROUP BY â HAVING â ORDER BY
Ordre d'exĂ©cution : FROM â WHERE â GROUP BY â HAVING â SELECT â ORDER BY
programme-sql-debutant-intermediaire · 01 Ce que ça change concrÚtement :
-- â Erreur classique de dĂ©butant
SELECT montant * . AS montant_remise
FROM orders
WHERE montant_remise > ; -- erreur : montant_remise n'existe pas encore
-- SELECT est exĂ©cutĂ© APRĂS WHERE â l'alias n'est pas encore dĂ©fini
Â
-- â
Correction
SELECT montant * . AS montant_remise
FROM orders
WHERE montant * . > ; -- répéter le calcul dans WHERE
-- ou utiliser une sous-requĂȘte
programme-sql-debutant-intermediaire · 02 · Ce que ça change concrĂštement : Concept 1.2 â SELECT : choisir ses colonnes -- SĂ©lectionner des colonnes spĂ©cifiques
SELECT nom, email, created_at FROM users;
Â
-- Renommer avec un alias
SELECT nom AS client, email AS contact FROM users;
Â
-- Calculer à la volée
SELECT
nom,
prix,
quantite,
prix * quantite AS total_ligne
FROM order_lines;
Â
-- Sélectionner tout (uniquement pour explorer, jamais en production)
SELECT * FROM users LIMIT ;
programme-sql-debutant-intermediaire · 03 Concept 1.3 â WHERE : filtrer les lignes -- Filtres simples
SELECT * FROM users WHERE pays = 'France' ;
SELECT * FROM orders WHERE montant > ;
SELECT * FROM users WHERE created_at >= '2024-01-01' ;
Â
-- Opérateurs logiques
SELECT * FROM orders
WHERE montant >
AND statut = 'livré' ;
Â
SELECT * FROM users
WHERE pays = 'France'
OR pays = 'Belgique' ;
Â
-- IN : liste de valeurs
SELECT * FROM users WHERE pays IN ('France' , 'Belgique' , 'Suisse' );
Â
-- BETWEEN : intervalle
SELECT * FROM orders WHERE montant BETWEEN AND ;
Â
-- LIKE : recherche de pattern
SELECT * FROM users WHERE nom LIKE 'Du%' ; -- commence par Du
SELECT * FROM users WHERE email LIKE '%@gmail.com' ; -- finit par @gmail.com
Â
-- IS NULL : valeur absente
SELECT * FROM users WHERE telephone IS NULL ;
SELECT * FROM users WHERE telephone IS NOT NULL ;
programme-sql-debutant-intermediaire · 04 Concept 1.4 â ORDER BY et LIMIT -- Trier par ordre croissant (dĂ©faut)
SELECT * FROM orders ORDER BY created_at;
Â
-- Trier par ordre décroissant
SELECT * FROM orders ORDER BY montant DESC ;
Â
-- Trier sur plusieurs colonnes
SELECT * FROM orders ORDER BY pays ASC , montant DESC ;
Â
-- Limiter le nombre de résultats
SELECT * FROM orders ORDER BY montant DESC LIMIT ;
Â
-- Pagination
SELECT * FROM orders ORDER BY created_at DESC LIMIT OFFSET ;
-- Retourne les lignes 41 Ă 60
programme-sql-debutant-intermediaire · 05 đ€ Prompt IA pour pratiquer le Niveau 1 Tu es un professeur SQL. GĂ©nĂšre 5 exercices progressifs sur les bases SQL
(SELECT, WHERE, ORDER BY, LIMIT) pour un débutant complet.
Â
Pour chaque exercice :
1. Décris un contexte métier simple (e-commerce, app mobile, etc.)
2. Donne le schéma de la table (CREATE TABLE avec 4-5 colonnes)
3. Pose une question en français
4. Donne la solution commentée
5. Propose une variation légÚrement plus difficile
Â
Commence par le plus simple et augmente la difficulté progressivement.
programme-sql-debutant-intermediaire · 06 â
Signal de passage au Niveau 2 Tu peux passer au niveau 2 quand tu sais :
â Ăcrire un SELECT avec des colonnes spĂ©cifiques et des alias
â Filtrer avec WHERE, AND, OR, IN, BETWEEN, LIKE, IS NULL
â Trier les rĂ©sultats avec ORDER BY
â Limiter les rĂ©sultats avec LIMIT et OFFSET
â Expliquer pourquoi WHERE alias = valeur ne fonctionne pas
đ§Ș Valide les fondations sur Modai Lab Les exercices du Niveau 1 sont directement disponibles sur Modai Lab. Pratique sur de vraies donnĂ©es, avec correction automatique. đ Pratiquer le Niveau 1 Exercices progressifs · Datasets rĂ©els · Feedback immĂ©diat
NIVEAU 2 â Les agrĂ©gations (dĂ©butant+) Objectif : transformer des lignes de donnĂ©es en mĂ©triques utiles
Concept 2.1 â GROUP BY : regrouper pour calculer -- Compter les commandes par pays
SELECT pays, COUNT (*) AS nb_commandes
FROM orders
GROUP BY pays;
Â
-- Sommer le CA par mois
SELECT
DATE_TRUNC('month' , created_at) AS mois,
SUM (montant) AS ca_mensuel
FROM orders
GROUP BY DATE_TRUNC('month' , created_at)
ORDER BY mois;
Â
-- Grouper sur plusieurs colonnes
SELECT pays, statut, COUNT (*) AS nb
FROM orders
GROUP BY pays, statut
ORDER BY pays, nb DESC ;
programme-sql-debutant-intermediaire · 07 La rÚgle fondamentale de GROUP BY :
Toute colonne dans le SELECT qui nâest pas une fonction dâagrĂ©gation doit ĂȘtre dans le GROUP BY.
-- â Erreur
SELECT pays, nom, COUNT (*) -- nom n'est pas agrégé ni dans GROUP BY
FROM orders
GROUP BY pays;
Â
-- â
Correct
SELECT pays, COUNT (*) FROM orders GROUP BY pays;
SELECT pays, nom, COUNT (*) FROM orders GROUP BY pays, nom;
programme-sql-debutant-intermediaire · 08 Concept 2.2 â Les fonctions dâagrĂ©gation SELECT
COUNT (*) AS total_lignes, -- compte toutes les lignes
COUNT (montant) AS lignes_avec_montant, -- ignore les NULL
COUNT (DISTINCT pays) AS pays_distincts, -- valeurs uniques
SUM (montant) AS ca_total,
AVG (montant) AS panier_moyen,
MIN (montant) AS plus_petit_achat,
MAX (montant) AS plus_grand_achat,
ROUND(AVG (montant), ) AS panier_moyen_arrondi
FROM orders;
programme-sql-debutant-intermediaire · 09 Concept 2.3 â HAVING : filtrer aprĂšs agrĂ©gation -- WHERE filtre avant agrĂ©gation, HAVING filtre aprĂšs
Â
-- Pays avec plus de 100 commandes
SELECT pays, COUNT (*) AS nb
FROM orders
GROUP BY pays
HAVING COUNT (*) >
ORDER BY nb DESC ;
Â
-- Clients avec un CA total supĂ©rieur Ă 500âŹ
SELECT user_id, SUM (montant) AS ca_total
FROM orders
GROUP BY user_id
HAVING SUM (montant) > ;
Â
-- Combiner WHERE et HAVING
SELECT pays, COUNT (*) AS nb_commandes_livrees
FROM orders
WHERE statut = 'livré' -- filtre les lignes d'abord
GROUP BY pays
HAVING COUNT (*) > -- filtre les groupes ensuite
ORDER BY nb_commandes_livrees DESC ;
programme-sql-debutant-intermediaire · 10 Concept 2.4 â AgrĂ©ger avec des conditions (CASE WHEN) -- Compter les commandes par statut dans une seule ligne par pays
SELECT
pays,
COUNT (*) AS total,
COUNT (CASE WHEN statut = 'livré' THEN END ) AS livrees,
COUNT (CASE WHEN statut = 'annulé' THEN END ) AS annulees,
ROUND(
. * COUNT (CASE WHEN statut = 'livré' THEN END ) / COUNT (*),
) AS taux_livraison_pct
FROM orders
GROUP BY pays;
programme-sql-debutant-intermediaire · 11 đ€ Prompt IA pour pratiquer le Niveau 2 Tu es un professeur SQL. GĂ©nĂšre 5 exercices sur GROUP BY, les fonctions
d'agrégation et HAVING pour un débutant qui vient de comprendre SELECT/WHERE.
Â
Contexte : une base e-commerce avec les tables suivantes :
- users (id, nom, email, pays, created_at)
- orders (id, user_id, montant, statut, created_at)
- order_lines (id, order_id, product_id, quantite, prix_unitaire)
- products (id, nom, categorie, prix)
Â
Pour chaque exercice :
1. Une question métier réaliste ("quel est le CA par catégorie ?")
2. La requĂȘte correcte avec commentaires
3. Un piÚge courant à éviter (ex: oublier une colonne dans GROUP BY)
4. Une question de relance légÚrement plus difficile
Â
Inclure au moins un exercice avec HAVING et un avec CASE WHEN dans SELECT.
programme-sql-debutant-intermediaire · 12 â
Signal de passage au Niveau 3 â Je comprends pourquoi toute colonne non agrĂ©gĂ©e doit ĂȘtre dans GROUP BY
â Je sais utiliser COUNT(*), COUNT(col), SUM(), AVG(), MIN(), MAX()
â Je sais faire la diffĂ©rence entre WHERE et HAVING
â Je peux compter des Ă©vĂ©nements conditionnels avec CASE WHEN dans SELECT
â Je peux expliquer pourquoi AVG() ignore les NULL
đ§Ș Teste les agrĂ©gations GROUP BY et HAVING sont systĂ©matiquement testĂ©s en entretien data. VĂ©rifie que tes rĂ©flexes sont bons avant de passer au niveau suivant. đ Tester les agrĂ©gations Score immĂ©diat · Explication des erreurs · Niveau calibrĂ©
Objectif : interroger plusieurs tables à la fois et comprendre les modÚles de données
Concept 3.1 â Les JOIN : relier les tables -- INNER JOIN : seulement les correspondances des deux cĂŽtĂ©s
SELECT u.nom, o.montant, o.created_at
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
Â
-- LEFT JOIN : tous les users, mĂȘme sans commande
SELECT u.nom, COUNT (o.id) AS nb_commandes
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.nom;
Â
-- Jointure sur plusieurs tables
SELECT
u.nom AS client,
o.id AS order_id,
p.nom AS produit,
ol.quantite,
ol.prix_unitaire
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN order_lines ol ON o.id = ol.order_id
JOIN products p ON ol.product_id = p.id
WHERE o.created_at >= '2024-01-01' ;
programme-sql-debutant-intermediaire · 13 Les 4 types de JOIN en une image :
JOIN
Ce quâil retourne
INNER JOIN
Lignes avec correspondance des deux cÎtés
LEFT JOIN
Toutes les lignes de gauche + correspondances de droite
RIGHT JOIN
Correspondances de gauche + toutes les lignes de droite
FULL OUTER JOIN
Toutes les lignes des deux tables
Concept 3.2 â Le piĂšge du LEFT JOIN silencieux -- â WHERE sur la table de droite transforme LEFT JOIN en INNER JOIN
SELECT u.nom, o.montant
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.statut = 'livrĂ©' ; -- Ă©limine les NULL â INNER JOIN dĂ©guisĂ©
Â
-- â
Filtre dans le ON pour préserver le LEFT JOIN
SELECT u.nom, o.montant
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id
AND o.statut = 'livré' ;
programme-sql-debutant-intermediaire · 14 Concept 3.3 â Les sous-requĂȘtes -- Sous-requĂȘte dans WHERE
SELECT nom, montant
FROM orders
WHERE montant > (SELECT AVG (montant) FROM orders);
Â
-- Sous-requĂȘte dans FROM (table dĂ©rivĂ©e)
SELECT u.nom, stats.nb_commandes
FROM users u
JOIN (
SELECT user_id, COUNT (*) AS nb_commandes
FROM orders
GROUP BY user_id
) stats ON u.id = stats.user_id;
Â
-- EXISTS : tester la présence
SELECT nom
FROM users u
WHERE EXISTS (
SELECT FROM orders o WHERE o.user_id = u.id
);
Â
-- NOT EXISTS : tester l'absence
SELECT nom
FROM users u
WHERE NOT EXISTS (
SELECT FROM orders o WHERE o.user_id = u.id
);
programme-sql-debutant-intermediaire · 15 Concept 3.4 â Lire un modĂšle de donnĂ©es Avant dâĂ©crire une requĂȘte sur plusieurs tables, pose-toi ces questions :
1. Quelle est la granularité de chaque table ?
â Une ligne par user ? Par commande ? Par Ă©vĂ©nement ?
Â
2. Quelles sont les clés de jointure ?
â orders.user_id â users.id
â order_lines.order_id â orders.id
Â
3. Quelle est la cardinalité ?
â 1 user peut avoir N commandes (1:N)
â 1 commande peut avoir N lignes (1:N)
â Si je join sans agrĂ©ger, j'aurai N Ă M lignes
programme-sql-debutant-intermediaire · 16 đ€ Prompt IA pour pratiquer le Niveau 3 Tu es un expert SQL data analytics. CrĂ©e 5 exercices progressifs sur les
jointures SQL pour quelqu'un qui maĂźtrise SELECT/WHERE/GROUP BY.
Â
Base de données :
- users (id, nom, email, pays, segment, created_at)
- orders (id, user_id, montant, statut, created_at)
- order_lines (id, order_id, product_id, quantite, prix_unitaire)
- products (id, nom, categorie, prix_achat, prix_vente)
- campaigns (id, nom, canal, budget)
- user_events (id, user_id, campaign_id, event_type, created_at)
Â
Exercice 1 : INNER JOIN simple (2 tables)
Exercice 2 : LEFT JOIN avec compréhension du résultat NULL
Exercice 3 : JOIN sur 3 tables
Exercice 4 : PiĂšge du LEFT JOIN silencieux (WHERE sur table de droite)
Exercice 5 : Sous-requĂȘte dans FROM pour Ă©viter le fan-out
Â
Pour chaque exercice : contexte mĂ©tier, question, requĂȘte fausse courante,
requĂȘte correcte commentĂ©e, explication du piĂšge.
programme-sql-debutant-intermediaire · 17 â
Signal de passage au Niveau 4 â Je sais faire un INNER, LEFT, et FULL OUTER JOIN
â Je comprends pourquoi un LEFT JOIN + WHERE peut se transformer en INNER JOIN
â Je peux joindre 3 tables sans crĂ©er de doublons involontaires
â Je comprends ce quâest un fan-out et comment le dĂ©tecter
â Je sais utiliser EXISTS et NOT EXISTS Ă la place dâun JOIN + IS NULL
đ§Ș Valide les jointures sur Modai Lab Les JOIN sont le thĂšme le plus frĂ©quent en entretien data. Modai Lab propose des exercices spĂ©cifiques avec dĂ©tection des LEFT JOINs silencieux. đ Valider mes jointures Datasets rĂ©alistes · PiĂšges dĂ©tectĂ©s · Feedback ligne par ligne
Objectif : Ă©crire des requĂȘtes analytiques que les seniors utilisent en production
Concept 4.1 â Les CTE : structurer et lire sa logique -- Sans CTE : une requĂȘte imbriquĂ©e difficile Ă lire
SELECT u.nom, stats.ca, stats.nb
FROM users u
JOIN (
SELECT user_id, SUM (montant) AS ca, COUNT (*) AS nb
FROM orders
WHERE created_at > '2024-01-01'
GROUP BY user_id
) stats ON u.id = stats.user_id
WHERE stats.ca > ;
Â
-- Avec CTE : lisible, maintenable, testable étape par étape
WITH
commandes_2024 AS (
SELECT user_id, SUM (montant) AS ca, COUNT (*) AS nb
FROM orders
WHERE created_at > '2024-01-01'
GROUP BY user_id
),
clients_premium AS (
SELECT user_id FROM commandes_2024 WHERE ca >
)
SELECT u.nom, c.ca, c.nb
FROM users u
JOIN commandes_2024 c ON u.id = c.user_id
WHERE u.id IN (SELECT user_id FROM clients_premium)
ORDER BY c.ca DESC ;
programme-sql-debutant-intermediaire · 18 Concept 4.2 â Les fonctions de fenĂȘtre (window functions) -- ROW_NUMBER : numĂ©roter les lignes dans un groupe
SELECT
user_id,
order_id,
montant,
created_at,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC ) AS rang
FROM orders;
-- rang = 1 â la commande la plus rĂ©cente de chaque user
Â
-- Récupérer la derniÚre commande par user
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC ) AS rn
FROM orders
) t
WHERE rn = ;
Â
-- LAG : comparer avec la valeur précédente
SELECT
mois,
ca,
LAG(ca) OVER (ORDER BY mois) AS ca_precedent,
ca - LAG(ca) OVER (ORDER BY mois) AS variation
FROM revenus_mensuels;
Â
-- SUM cumulatif
SELECT
date_vente,
montant,
SUM (montant) OVER (ORDER BY date_vente) AS cumul
FROM ventes;
programme-sql-debutant-intermediaire · 19 Concept 4.3 â MaĂźtriser NULL (vraiment) -- NULL â zĂ©ro, NULL = valeur inconnue
-- Toute comparaison avec NULL retourne UNKNOWN
Â
-- â Ne fonctionne jamais
SELECT * FROM users WHERE telephone = NULL ;
Â
-- â
Toujours utiliser IS NULL / IS NOT NULL
SELECT * FROM users WHERE telephone IS NULL ;
Â
-- COALESCE : valeur par défaut si NULL
SELECT nom, COALESCE (telephone, 'Non renseigné' ) AS tel FROM users;
Â
-- Attention aux agrégations
SELECT
COUNT (*) AS toutes_lignes, -- compte les NULL
COUNT (montant) AS lignes_renseignees, -- ignore les NULL
SUM (montant) AS ca, -- ignore les NULL
AVG (montant) AS moyenne -- ignore les NULL (dénominateur réduit)
FROM orders;
programme-sql-debutant-intermediaire · 20 Concept 4.4 â Penser en ensemble, pas en boucle La diffĂ©rence de mentalitĂ© entre quelquâun qui âcodeâ du SQL et quelquâun qui âpenseâ en SQL.
-- Mentalité boucle (approche non-SQL)
-- "Pour chaque utilisateur, je cherche sa derniĂšre commande"
-- â sous-requĂȘte corrĂ©lĂ©e = 1 requĂȘte par ligne
Â
-- Mentalité ensemble (approche SQL)
-- "Je prends toutes les commandes, je les classe par user et par date,
-- et je garde la premiĂšre de chaque groupe"
-- â une seule opĂ©ration sur l'ensemble complet
Â
WITH derniere_commande AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC ) AS rn
FROM orders
)
SELECT * FROM derniere_commande WHERE rn = ;
-- Une seule passe sur toutes les données. Performant. Lisible.
programme-sql-debutant-intermediaire · 21 đ€ Prompt IA pour pratiquer le Niveau 4 Tu es un data analyst senior. CrĂ©e 5 exercices de niveau intermĂ©diaire
sur les CTE et les window functions SQL.
Â
Base de données e-commerce :
- users (id, nom, email, pays, segment, created_at)
- orders (id, user_id, montant, statut, created_at)
Â
Exercice 1 : CTE pour remplacer une sous-requĂȘte imbriquĂ©e
Exercice 2 : ROW_NUMBER pour le top 1 par groupe
Exercice 3 : LAG pour calculer une variation mois/mois
Exercice 4 : SUM cumulatif avec OVER (ORDER BY)
Exercice 5 : Combinaison CTE + window function (rapport complet)
Â
Pour chaque exercice :
- La question métier (ex: "calcule la variation de CA mensuel")
- La version sans window function (sous-requĂȘte corrĂ©lĂ©e)
- La version avec window function (plus performante)
- L'explication de la clause OVER et PARTITION BY
programme-sql-debutant-intermediaire · 22 â Je comprends et jâutilise les CTE (WITH ... AS (...))
â Je sais utiliser ROW_NUMBER, LAG, LEAD et SUM avec OVER
â Je comprends PARTITION BY et ORDER BY dans une window function
â Je gĂšre NULL correctement dans mes agrĂ©gations et comparaisons
â Je pense en âensembleâ plutĂŽt quâen âboucleâ
â Je peux expliquer mes requĂȘtes Ă un collĂšgue non-technique
đ§Ș Teste ton niveau intermĂ©diaire Le test couvre les 4 niveaux de ce programme. AprĂšs lâavoir complĂ©tĂ©, tu sais exactement sur quoi travailler en prioritĂ©. đ Passer le test complet Test complet · Score par niveau · Plan de progression personnalisĂ©
PARTIE 5 â Les prompts universels pour apprendre avec lâIA Utilise ces prompts Ă tout moment de ton apprentissage.
Prompt âExplique-moiâ J'apprends SQL et je ne comprends pas [concept].
Explique-moi avec :
1. Une analogie du quotidien (pas de jargon)
2. Un exemple simple avec une table de 5 lignes
3. L'erreur classique que font les débutants avec ce concept
4. Un exercice pour vérifier que j'ai compris
Â
Concept Ă expliquer : [GROUP BY / LEFT JOIN / NULL / window functions / etc.]
programme-sql-debutant-intermediaire · 23 Prompt âGĂ©nĂšre un exerciceâ GĂ©nĂšre un exercice SQL de niveau [dĂ©butant / intermĂ©diaire] sur [concept].
Â
Contexte : une app SaaS avec :
- users (id, nom, email, plan, created_at, churned_at)
- events (id, user_id, type, created_at)
- invoices (id, user_id, montant, statut, created_at)
Â
Format :
1. Question métier en français
2. Schéma des tables concernées
3. Résultat attendu (3-5 lignes exemple)
4. Solution commentée
5. Question bonus légÚrement plus difficile
programme-sql-debutant-intermediaire · 24 Prompt âAudite ma requĂȘteâ Voici une requĂȘte SQL que j'ai Ă©crite. Dis-moi :
1. Est-ce qu'elle est correcte pour répondre à la question ?
2. Y a-t-il des erreurs silencieuses (NULL ignorés, fan-out, LEFT JOIN transformé) ?
3. Comment l'améliorer en lisibilité et en performance ?
4. Quelle version un senior écrirait à ma place ?
Â
Contexte : [décrire ce que tu veux calculer]
Â
[coller ta requĂȘte]
programme-sql-debutant-intermediaire · 25 Prompt âSimule un entretienâ Simule un entretien data analyst sur SQL.
Niveau : [débutant / intermédiaire / senior]
Â
Pose-moi 5 questions progressives, une Ă la fois.
Attends ma réponse avant de passer à la suivante.
à chaque réponse, dis-moi :
- Ce qui est correct
- Ce qui manque ou pourrait ĂȘtre mieux
- La réponse idéale qu'un recruteur attendrait
Â
Commence par la premiĂšre question.
programme-sql-debutant-intermediaire · 26 đ§Ș De lâIA Ă la pratique rĂ©elle Les prompts IA tâaident Ă comprendre. Modai Lab te met face Ă de vraies donnĂ©es, avec un feedback qui va au-delĂ de ce quâune IA peut dĂ©tecter. đ Passer Ă la pratique Environnement SQL rĂ©el · Datasets mĂ©tiers · Progression mesurĂ©e
RĂ©capitulatif â Le programme en une page NIVEAU 1 â Fondations (1-2 jours)
âââ SELECT, alias, calculs
âââ WHERE : =, !=, >, <, IN, BETWEEN, LIKE, IS NULL
âââ ORDER BY, LIMIT, OFFSET
âââ Comprendre l'ordre d'exĂ©cution SQL
Â
NIVEAU 2 â AgrĂ©gations (2-3 jours)
âââ GROUP BY + rĂšgle des colonnes non agrĂ©gĂ©es
âââ COUNT(*) vs COUNT(col), SUM, AVG, MIN, MAX
âââ HAVING vs WHERE
âââ AgrĂ©gations conditionnelles avec CASE WHEN
Â
NIVEAU 3 â Relations (3-5 jours)
âââ INNER JOIN, LEFT JOIN, FULL OUTER JOIN
âââ PiĂšge du LEFT JOIN silencieux
âââ Jointures sur 3+ tables, gestion du fan-out
âââ Sous-requĂȘtes : WHERE, FROM, EXISTS, NOT EXISTS
Â
NIVEAU 4 â Analyse avancĂ©e (5-7 jours)
âââ CTE (WITH ... AS) pour structurer la logique
âââ ROW_NUMBER, RANK, LAG, LEAD, SUM cumulatif
âââ NULL : IS NULL, COALESCE, impact sur agrĂ©gations
âââ Penser en ensemble, pas en boucle
programme-sql-debutant-intermediaire · 27 â Je peux expliquer pourquoi WHERE alias = valeur ne fonctionne pas
â Je sais quand utiliser GROUP BY vs DISTINCT
â Je comprends la diffĂ©rence entre INNER JOIN et LEFT JOIN et je la justifie
â Je dĂ©tecte un fan-out avant mĂȘme de lancer la requĂȘte
â Je comprends pourquoi COUNT(col) â COUNT(*) avec des NULL
â Je peux Ă©crire une requĂȘte avec CTE et window function
â Je peux lire une requĂȘte que je nâai pas Ă©crite et expliquer ce quâelle fait
La thĂ©orie, câest ici. La pratique qui ancre vraiment, câest sur des vraies donnĂ©es.
Modai Lab est la plateforme que je recommande pour ce programme :
Des exercices calibrés sur chacun des 4 niveaux
Un feedback immédiat qui explique chaque erreur
Des datasets réalistes issus de cas métiers réels
Un test de niveau pour savoir exactement oĂč tu en es
đ Commencer le test SQL â puis continue avec les exercices du niveau correspondant.
EntraĂźne-toi sur les exercices interactifs · Partagez librement â»ïž