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Ă©


Comment utiliser ce programme

Ce programme est découpé en 4 niveaux, chacun avec :

  1. Les concepts à maütriser (dans l’ordre)

  2. Les exercices pratiques pour valider la compréhension

  3. Un prompt IA pour s’entraüner sans avoir de dataset

  4. 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Ă©


NIVEAU 3 — Les relations (intermĂ©diaire)

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


NIVEAU 4 — L’analyse avancĂ©e (intermĂ©diaire)

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

✅ Tu es au niveau intermĂ©diaire quand :

  • ☐ 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

✅ Checklist finale — Suis-je vraiment intermĂ©diaire ?

  • ☐ 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 plateforme recommandĂ©e pour passer au niveau supĂ©rieur

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 ♻