SQLdata analystdébutantDuckDBwindow functions

SQL pour data analyst débutant : guide pratique 2025

GP
Gaël Penessot

Pour être data analyst, SQL est la compétence #1. Un débutant doit maîtriser dans l'ordre : SELECT + filtres, agrégations, JOIN, sous-requêtes et CTE, puis window functions. Ce chemin prend 2 à 4 mois de pratique régulière sur des données réelles.

SQL n'est pas difficile à apprendre — mais la plupart des débutants apprennent dans le mauvais ordre et passent trop de temps sur les bases théoriques sans toucher de vraies données.

Pourquoi SQL est indispensable pour un data analyst

SQL apparaît dans 95% des offres data analyst. C'est le seul langage commun entre tous les systèmes de données — PostgreSQL, BigQuery, Snowflake, DuckDB, MySQL, SQLite. Un data analyst sans SQL solide est bloqué dès le premier entretien technique.

Ce que SQL vous permet de faire que rien d'autre ne fait aussi bien :

  • Extraire exactement les données dont vous avez besoin depuis une base de millions de lignes
  • Agréger, grouper, calculer des KPIs directement en base
  • Joindre des tables hétérogènes en une seule requête
  • Calculer des métriques glissantes, des rangs, des comparaisons période sur période avec les window functions

Les 5 niveaux SQL pour un data analyst débutant

Niveau 1 — SELECT basique (semaine 1–2)

La fondation. Vous devez savoir écrire ceci sans réfléchir :

SELECT nom, prenom, ville
FROM clients
WHERE ville = 'Paris'
  AND date_inscription >= '2024-01-01'
ORDER BY date_inscription DESC
LIMIT 100;

Ce que vous apprenez : SELECT, FROM, WHERE, AND/OR, ORDER BY, LIMIT, comparateurs (=, <>, >, >=, BETWEEN, IN, LIKE).

Niveau 2 — Agrégations (semaine 3–4)

80% des analyses data analyst reposent sur des agrégations :

SELECT
    categorie,
    COUNT(*) as nb_commandes,
    SUM(montant) as ca_total,
    AVG(montant) as panier_moyen,
    MAX(montant) as commande_max
FROM commandes
WHERE EXTRACT(YEAR FROM date_commande) = 2024
GROUP BY categorie
HAVING COUNT(*) > 10
ORDER BY ca_total DESC;

Ce que vous apprenez : GROUP BY, COUNT, SUM, AVG, MIN, MAX, HAVING, fonctions de date.

Niveau 3 — JOIN (semaine 5–7)

Les données réelles sont toujours dans plusieurs tables. Les JOIN sont inévitables :

SELECT
    c.nom,
    c.email,
    COUNT(o.id) as nb_commandes,
    SUM(o.montant) as ca_client
FROM clients c
LEFT JOIN commandes o ON c.id = o.client_id
WHERE c.date_inscription >= '2023-01-01'
GROUP BY c.id, c.nom, c.email
ORDER BY ca_client DESC NULLS LAST;

Types de JOIN à maîtriser : INNER JOIN, LEFT JOIN, RIGHT JOIN (rare), FULL OUTER JOIN (rare). En pratique, 90% des JOIN sont INNER ou LEFT.

L'erreur classique du débutant : ne pas savoir quand utiliser INNER vs LEFT JOIN. INNER supprime les lignes sans correspondance ; LEFT les conserve avec des NULLs.

Niveau 4 — Sous-requêtes et CTE (semaine 8–10)

Les CTE (Common Table Expressions) rendent les requêtes complexes lisibles :

WITH clients_actifs AS (
    SELECT client_id, COUNT(*) as nb_commandes
    FROM commandes
    WHERE date_commande >= CURRENT_DATE - INTERVAL '90 days'
    GROUP BY client_id
    HAVING COUNT(*) >= 2
),
clients_info AS (
    SELECT id, nom, email, ville
    FROM clients
)
SELECT ci.nom, ci.email, ci.ville, ca.nb_commandes
FROM clients_info ci
INNER JOIN clients_actifs ca ON ci.id = ca.client_id
ORDER BY ca.nb_commandes DESC;

Sans CTE, cette requête serait une sous-requête imbriquée illisible. Les CTE sont l'équivalent SQL des variables en programmation.

Niveau 5 — Window functions (semaine 11–14)

Les window functions sont le seuil entre junior et confirmé. Elles apparaissent dans 78% des JD data analyst senior.

SELECT
    date_commande,
    montant,
    -- Rang par montant décroissant
    RANK() OVER (ORDER BY montant DESC) as rang,
    -- Total cumulé par date
    SUM(montant) OVER (ORDER BY date_commande) as cumul_ca,
    -- Variation vs commande précédente
    LAG(montant) OVER (ORDER BY date_commande) as montant_precedent,
    montant - LAG(montant) OVER (ORDER BY date_commande) as variation,
    -- Moyenne glissante sur 7 jours
    AVG(montant) OVER (
        ORDER BY date_commande
        ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
    ) as moy_7j
FROM commandes;

Window functions essentielles : ROW_NUMBER(), RANK(), DENSE_RANK(), LAG(), LEAD(), SUM OVER, AVG OVER, FIRST_VALUE(), LAST_VALUE().

DuckDB : le meilleur outil pour apprendre SQL en 2025

DuckDB est une base de données SQL qui s'installe en une ligne, tourne localement sans serveur, et lit directement les CSV et Parquet. C'est l'environnement idéal pour apprendre :

# Installation
pip install duckdb

# Lancer un shell SQL interactif
python -c "import duckdb; duckdb.sql('SELECT 42').show()"
import duckdb

# Analyser un CSV local avec SQL pur
duckdb.sql("""
    SELECT city, COUNT(*) as nb, AVG(price) as avg_price
    FROM 'listings.csv'
    GROUP BY city
    ORDER BY nb DESC
""").show()

Avantages pour débuter : pas de serveur à configurer, compatible avec les datasets CSV gratuits (Kaggle, data.gouv.fr), et la syntaxe SQL est standard.

Les erreurs SQL les plus courantes chez les débutants

1. Confondre WHERE et HAVING

  • WHERE filtre avant l'agrégation (sur les lignes brutes)
  • HAVING filtre après l'agrégation (sur les résultats groupés)

2. Oublier le GROUP BY Dès qu'il y a une fonction d'agrégation (COUNT, SUM) et une colonne non agrégée dans le SELECT, toutes les colonnes non agrégées doivent être dans le GROUP BY.

3. Mal comprendre les NULLs NULL <> 0 et NULL <> ''. Une comparaison avec NULL retourne toujours NULL (ni vrai ni faux). Utilisez IS NULL et IS NOT NULL.

4. INNER JOIN vs LEFT JOIN Si vous avez des clients sans commandes et que vous voulez quand même les voir dans les résultats → LEFT JOIN. Si vous ne voulez que les clients ayant des commandes → INNER JOIN.

5. Requêtes sans LIMIT en développement Sur une table de 10M lignes, un SELECT * sans LIMIT peut bloquer votre session pendant plusieurs minutes. Toujours ajouter LIMIT 100 pendant l'exploration.

Ordre d'apprentissage recommandé

  1. Semaines 1–4 : SELECT, filtres, agrégations, GROUP BY sur un dataset simple (CSV de 10K lignes)
  2. Semaines 5–7 : JOIN sur 2–3 tables, comprendre les clés étrangères
  3. Semaines 8–10 : CTE, sous-requêtes, requêtes à plusieurs niveaux d'agrégation
  4. Semaines 11–14 : Window functions — ROW_NUMBER, LAG, LEAD, SUM OVER
  5. Semaines 15+ : optimisation, index, EXPLAIN, requêtes sur gros volumes (DuckDB + Parquet)

Testez votre niveau actuel avec le quiz SQL data analyst — 20 questions progressives du SELECT basique aux window functions.

Ressources pour progresser

Pour un parcours structuré avec des exercices sur des données réelles : SQL Mastery — 10 modules sur DuckDB, 87 exercices sur les bases Northwind (e-commerce), Chinook (streaming musical) et NYC Taxi (2,4 millions de lignes). Conçu pour amener un débutant au niveau opérationnel pour un premier poste data analyst.

Datasets gratuits pour pratiquer : data.gouv.fr, Kaggle, les données publiques INSEE. La règle : pratiquer sur des vraies données dès la première semaine, pas sur des exemples simplifiés.

Pour le parcours complet : comment devenir data analyst en 2025.


FAQ : SQL pour data analyst débutant

Combien de temps pour apprendre SQL pour être data analyst ?

2 à 4 mois pour atteindre un niveau opérationnel (SELECT → JOIN → CTE → window functions de base), à raison de 1h de pratique quotidienne sur des données réelles. Les window functions avancées viennent avec la pratique en poste.

Faut-il apprendre SQL ou Python en premier ?

SQL en premier. SQL est plus simple à apprendre, plus directement utile (95% des offres), et structure votre compréhension des données avant Python. SQL + Python ensemble dès le début ralentit les deux apprentissages.

Quel SQL apprendre : MySQL, PostgreSQL, BigQuery, DuckDB ?

Le SQL analytique est largement portable entre les moteurs. Apprenez les fondamentaux sur DuckDB (gratuit, local, rapide) — vous pourrez migrer sur PostgreSQL ou BigQuery en quelques jours. La syntaxe des window functions est identique partout.

Les window functions sont-elles vraiment obligatoires ?

Pour un poste junior : non obligatoires mais très appréciées. Pour un poste confirmé ou senior : quasi-systématiquement testées en entretien. 78% des JD data analyst senior les mentionnent explicitement.

Y a-t-il des tests SQL en entretien data analyst ?

Oui, dans la grande majorité des entreprises. Les tests vont d'un SELECT + GROUP BY simple (junior) à des requêtes avec window functions, CTE et optimisation (senior). Un exercice sur HackerRank, LeetCode SQL ou StrataScratch est souvent envoyé avant le premier entretien.

Livre Business Intelligence avec Python

Approfondir avec mon livre

"Business Intelligence avec Python" - Le guide complet pour maîtriser l'analyse de données

Voir sur Amazon →

Formation recommandée

SQL Mastery

Maîtrisez SQL analytique moderne avec DuckDB : window functions, CTEs, intégration Python/Polars. 87 exercices sur des bases de données réelles.

Voir la formation →

Ne manque rien de l'actualité data

Rejoins +1000 professionnels qui reçoivent chaque semaine mes analyses, conseils et découvertes data.

S'abonner gratuitement
Prochaine révision : Trimestre prochain