Test technique SQL : formats, préparation et stratégies
Tout savoir sur le test technique SQL en entretien : formats, durée, sujets testés, plateformes et stratégies pour maximiser votre score.
Thomas Leroy
📌 Ce qu'il faut retenir
Préparation (2 sem.) : 3-5 exercices/jour sur les fondamentaux (JOINs, GROUP BY, sous-requêtes) — chronométrez-vous dès la première semaine
Simulation (1 sem.) : séances complètes de 5 exercices en 60 minutes, focus window functions et CTE, identification de vos points faibles
Recap (2 jours) : relecture des pièges classiques (NULL, WHERE vs HAVING, NOT IN), 2-3 exercices faciles pour rester en forme, repos la veille
Le test technique SQL est devenu un passage obligé pour les postes data. Qu'il soit en ligne, en live ou en take-home, ce test évalue votre capacité à résoudre des problèmes concrets avec SQL. Découvrez exactement ce qui vous attend et comment maximiser vos chances de réussite.
Les formats de test SQL
Test en ligne chronométré (le plus courant)
Vous recevez un lien par email vers une plateforme comme HackerRank, Codility, StrataScratch ou DataLemur. Le test contient 3 à 5 questions à résoudre en 45 à 90 minutes.
Caractéristiques :
Exécution asynchrone (vous choisissez le créneau)
Environnement SQL intégré avec base de données pré-chargée
Validation automatique (votre résultat doit matcher exactement)
Chronomètre visible
Souvent un mix de niveaux : 2 faciles, 2 moyennes, 1 difficile
Dialecte SQL : généralement PostgreSQL ou MySQL. Vérifiez avant de commencer — les syntaxes diffèrent pour les dates, les window functions et les CTE.
Live coding avec un interviewer
Le recruteur ou le hiring manager vous donne un problème en direct. Vous partagez votre écran et résolvez en temps réel pendant 30 à 60 minutes.
Caractéristiques :
Le raisonnement verbal est évalué autant que le code
Le recruteur peut donner des indices ou modifier l'énoncé
Vous pouvez poser des questions (et vous devez le faire)
L'environnement varie : IDE en ligne, Google Doc, ou même papier
Take-home assignment
Un exercice plus complet à réaliser chez soi en 24-48h. On vous fournit un jeu de données (CSV ou dump SQL) et plusieurs questions business à résoudre.
Caractéristiques :
Plus de temps, mais plus d'exigences
On attend du code propre, commenté et structuré
Certaines entreprises demandent aussi des visualisations ou un memo
HackerRank — Dialectes multiples (PostgreSQL, MySQL, Oracle). Très utilisé par les grandes entreprises et ESN pour les tests automatisés. La validation est stricte : colonnes dans le bon ordre, tri exact, alias corrects. Entraînez-vous à lire les contraintes de sortie attendues.
StrataScratch — Questions tirées de vrais entretiens FAANG et scale-ups. Excellent niveau intermédiaire à avancé. Mode "practice" vous permet de voir les solutions après tentative.
Codility — Surtout utilisé par les entreprises tech européennes. Dialecte PostgreSQL. Difficulté moyen à difficile. Testez votre requête avec les cas d'exemple avant de soumettre définitivement.
Pour la préparation, combinez StrataScratch (questions réalistes) avec nos guides pour réussir l'entretien SQL.
Les plateformes de test les plus utilisées
HackerRank
Utilisé par : grandes entreprises, banques, ESN
Dialectes : PostgreSQL, MySQL, Oracle, SQL Server
Difficulté : facile à difficile
Conseil : lisez bien les contraintes de chaque question, le résultat doit être exact à la colonne et au tri près
Codility
Utilisé par : entreprises tech européennes
Dialectes : PostgreSQL principalement
Difficulté : moyen à difficile
Conseil : testez votre requête avec les cas d'exemple avant de soumettre
StrataScratch
Utilisé par : entreprises data-driven (tech US, FAANG)
Dialectes : PostgreSQL, MySQL
Difficulté : questions tirées de vrais entretiens
Conseil : excellent pour s'entraîner même si le test réel est ailleurs
DataLemur
Utilisé par : comme outil de préparation et certains tests d'embauche
Dialectes : PostgreSQL
Difficulté : progressif (facile à expert)
Conseil : commencez par les questions « Easy » pour gagner en confiance
Spécificités par type de poste et secteur
Data Analyst (fintech, e-commerce)
Les tests privilégient les analyses métier et les métriques business. Les questions portent souvent sur :
Calculs de rétention : utilisateurs actifs, churn rate, lifetime value (LTV)
Analyses de cohortes : évolution des comportements dans le temps
Métriques de conversion : funnel d'acquisition, taux de transformation
Exemple type : "Calculez le taux de rétention mensuel des utilisateurs inscrits en janvier 2024"
WITH inscriptions_janvier AS (
SELECT user_id, DATE_TRUNC('month', created_at) as cohorte
FROM users
WHERE created_at >='2024-01-01'AND created_at <'2024-02-01'
),
activite_mois_suivants AS (
SELECT
i.user_id,
i.cohorte,
DATE_TRUNC('month', a.activity_date) as mois_activite,
DATE_PART('month', AGE(a.activity_date, i.cohorte)) as mois_depuis_inscription
FROM inscriptions_janvier i
LEFTJOIN user_activity a ON i.user_id = a.user_id
)
SELECT
mois_depuis_inscription,
COUNT(DISTINCT user_id) as utilisateurs_actifs,
ROUND(100.0*COUNT(DISTINCT user_id) / (SELECTCOUNT(*) FROM inscriptions_janvier), 2) as taux_retention
FROM activite_mois_suivants
WHERE mois_depuis_inscription BETWEEN0AND12GROUPBY mois_depuis_inscription
ORDERBY mois_depuis_inscription;
Pour approfondir ce type d'analyse, consultez notre [exercice SQL sur le taux de rétention utilisateurs](/exercice-sql-taux-retention-utilisateurs).
### Data Engineer (tech, SaaS)
Les tests évaluent la capacité à traiter des volumes importants et optimiser les performances :
- **Optimisation de requêtes** : index, partitioning, explain plans
- **Patterns ETL** : Slowly Changing Dimensions (SCD), upserts, déduplication
- **Architecture de données** : modélisation en étoile, normalisation
**Exemple type** : "Optimisez cette requête qui traite 10M de lignes quotidiennement"
Avant optimisation :
```sql
SELECT customer_id, SUM(amount)
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE o.order_date >= '2024-01-01'
AND c.country = 'FR'
GROUP BY customer_id;
Après optimisation :
```sql
WITH french_customers AS (
SELECT id FROM customers WHERE country = 'FR'
),
recent_orders AS (
SELECT customer_id, amount
FROM orders
WHERE order_date >= '2024-01-01'
)
SELECT
ro.customer_id,
SUM(ro.amount) as total_amount
FROM recent_orders ro
INNER JOIN french_customers fc ON ro.customer_id = fc.id
GROUP BY ro.customer_id;
-- ❌ IncorrectSELECT customer_id, COUNT(*) as nb_commandes
FROM orders
WHERECOUNT(*) >5GROUPBY customer_id;
-- ✅ CorrectSELECT customer_id, COUNT(*) as nb_commandes
FROM orders
GROUPBY customer_id
HAVINGCOUNT(*) >5;
2. JOINs non qualifiés créant des produits cartésiens
-- ❌ Dangereux - risque de produit cartésienSELECT o.id, c.name, p.name
FROM orders o, customers c, products p
WHERE o.customer_id = c.id;
-- ✅ CorrectSELECT o.id, c.name, p.name
FROM orders o
INNERJOIN customers c ON o.customer_id = c.id
INNERJOIN order_items oi ON o.id = oi.order_id
INNERJOIN products p ON oi.product_id = p.id;
3. Ignorer les valeurs NULL
-- ❌ Problématique - NULL est ignoréSELECTCOUNT(*) FROM orders WHERE status IN ('pending', 'completed');
-- ✅ Correct si vous voulez inclure les NULLSELECTCOUNT(*) FROM orders
WHERE status IN ('pending', 'completed') OR status ISNULL;
Erreurs niveau intermédiaire
1. Mauvaise utilisation des window functions
-- ❌ Incorrect - mélange aggregation et window functionSELECT
customer_id,
SUM(amount) as total,
ROW_NUMBER() OVER (ORDERBYSUM(amount) DESC) as rang
FROM orders
GROUPBY customer_id;
-- ✅ Correct - avec CTEWITH customer_totals AS (
SELECT customer_id, SUM(amount) as total
FROM orders
GROUPBY customer_id
)
SELECT
customer_id,
total,
ROW_NUMBER() OVER (ORDERBY total DESC) as rang
FROM customer_totals;
2. Gestion incorrecte des valeurs NULL dans les JOINs
-- ❌ Problématique - exclut les NULL involontairementSELECT c.name, COUNT(o.id) as nb_commandes
FROM customers c
LEFTJOIN orders o ON c.id = o.customer_id
WHERE o.status !='cancelled'GROUPBY c.name;
-- ✅ CorrectSELECT c.name, COUNT(o.id) as nb_commandes
FROM customers c
LEFTJOIN orders o ON c.id = o.customer_id AND o.status !='cancelled'GROUPBY c.name;
3. Aliasing insuffisant dans les JOINs multiples
-- ❌ Ambigu avec plusieurs tablesSELECT id, created_at, amount
FROM orders
JOIN customers ON orders.customer_id = customers.id
JOIN invoices ON customers.id = invoices.customer_id;
-- ✅ Clair et maintenableSELECT
o.id as order_id,
o.created_at as order_date,
o.amount as order_amount,
c.name as customer_name,
i.id as invoice_id
FROM orders o
INNERJOIN customers c ON o.customer_id = c.id
INNERJOIN invoices i ON c.id = i.customer_id;
Erreurs niveau avancé
1. CTE récursives mal structurées
-- ❌ Risque de boucle infinieWITHRECURSIVE hierarchy AS (
SELECT id, parent_id, name, 1as level
FROM categories WHERE parent_id ISNULLUNIONALLSELECT c.id, c.parent_id, c.name, h.level +1FROM categories c
JOIN hierarchy h ON c.parent_id = h.id
)
SELECT*FROM hierarchy;
-- ✅ Correct avec limite de profondeurWITHRECURSIVE hierarchy AS (
SELECT id, parent_id, name, 1as level
FROM categories WHERE parent_id ISNULLUNIONALLSELECT c.id, c.parent_id, c.name, h.level +1FROM categories c
JOIN hierarchy h ON c.parent_id = h.id
WHERE h.level <10
)
SELECT*FROM hierarchy;
2. NOT IN avec NULL (logique ternaire SQL)
-- ❌ Retourne toujours zéro ligne si NULL existe dans la sous-requêteSELECT*FROM orders
WHERE customer_id NOTIN (SELECT customer_id FROM accounts WHERE status ='inactive');
-- ✅ Utiliser NOT EXISTS (plus sûr)SELECT*FROM orders o
WHERENOTEXISTS (
SELECT1FROM accounts a
WHERE a.customer_id = o.customer_id
AND a.status ='inactive'
);
3. Oublier l'EXPLAIN dans l'optimisation
-- Avant d'optimiser, analysez le plan d'exécution
EXPLAIN ANALYZE
SELECT customer_id, SUM(amount) as total
FROM orders
WHERE order_date >='2024-01-01'GROUPBY customer_id;
Tableau comparatif : dialectes SQL les plus testés
Dialecte
Entreprises
Particularité
Fonctionnalité clé
PostgreSQL
Scale-ups, tech
Très flexible
CTE natif, JSON
MySQL
E-commerce, startups
Syntaxe moins stricte
GROUP_CONCAT
Oracle
Grandes banques
Très strict
Window functions avancées
SQL Server
Entreprises Microsoft
T-SQL spécifique
OVER (PARTITION BY)
Stratégie pendant le test
Les 5 premières minutes
Lisez TOUTES les questions rapidement pour évaluer la difficulté
Identifiez les questions faciles — commencez par elles pour sécuriser des points
Repérez le dialecte SQL utilisé (PostgreSQL, MySQL ?)
Vérifiez le schéma des tables disponibles (lisez les structures entièrement)
Gestion du temps
Pour un test de 5 questions en 60 minutes :
Difficulté
Temps alloué
Stratégie
Facile (×2)
8 min chacune
Résolvez d'abord
Moyen (×2)
12 min chacune
Ensuite
Difficile (×1)
15-20 min
En dernier
Gardez 5 minutes à la fin pour relire et tester.
Pendant la résolution de chaque question
Lisez l'énoncé complètement (2 fois si nécessaire)
Identifiez les tables nécessaires et les colonnes clés
Écrivez la requête progressivement — d'abord le FROM/JOIN, puis le WHERE, le GROUP BY, etc.
Testez avec les données d'exemple si la plateforme le permet
Vérifiez les cas limites : NULL, doublons, zéros
Exemples concrets par profil candidat
Clara, développeuse full-stack postule pour un Data Analyst chez une fintech. Solides bases en programmation mais SQL perfectible. Elle doit absolument maîtriser les JOINs complexes et les window functions pour calculer des métriques de rétention client. Stratégie recommandée : 3 semaines de préparation intensive sur StrataScratch, section "Finance/Banking", 1h minimum par jour.
Marcus, consultant business avec 5 ans d'expérience Excel/Power BI, vise un Data Developer dans une grande banque. Il connaît les concepts métier mais doit se mettre à niveau sur les CTE et l'optimisation. Stratégie : DataLemur (progression douce, 15j) puis HackerRank (interface type entreprise traditionnelle, 10j).
Léa, ingénieure data senior change de boîte (scale-up → GAFAM). Excellentes compétences techniques mais doit s'adapter au format "live coding" et aux questions algorithmiques. Stratégie : simulations complètes en conditions réelles avec chrono, focus sur la verbalisation du raisonnement, 2 simulations par semaine pendant 4 semaines.
Les erreurs de stratégie à éviter
Erreur 1 : le tri manquant
Beaucoup de tests vérifient l'ordre des résultats. Si la question dit « triez par montant décroissant », ajoutez ORDER BY montant DESC.
Erreur 2 : les types de données
Si on demande un pourcentage, vérifiez que vous retournez un décimal et non un entier :
Certaines plateformes (HackerRank notamment) vérifient le nom exact des colonnes du résultat. Si la question dit « nommez la colonne total_revenue », utilisez exactement cet alias.
Erreur 4 : les doublons inattendus
Un JOIN peut multiplier les lignes si la relation n'est pas 1:1. Vérifiez avec COUNT(*) si le nombre de lignes est cohérent.
Erreur 5 : la gestion du contexte
En live coding, le recruteur évalue aussi votre communication. Verbalisez votre approche : « Je vais d'abord identifier les tables… puis j'écrirai les JOINs… »
Particularités des tests par secteur d'activité
Secteur bancaire/finance
Les tests privilégient la précision et la conformité réglementaire :
Gestion rigoureuse des NULL et des arrondis (jusqu'à 2 décimales parfois)
Transactions et cohérence des données
Calculs financiers complexes : intérêts composés, VaR, stress testing
Audit trails : qui a modifié quoi et quand
Données sensibles : anonymisation, respect de la RGPD
Type de question
Exemple
Piège fréquent
Calcul de soldes
Solde compte après transactions
Oublier les dates de valeur
Détection de fraude
Transactions suspectes par pattern
Ne pas considérer les fuseaux horaires
Reporting réglementaire
Ratios prudentiels, provisions
Erreurs d'arrondi sur les décimales
Conciliation bancaire
Différences entre systèmes
Ignorer les montants annulés
E-commerce/retail
Focus sur les métriques d'acquisition et de conversion :
Analyses de panier : produits associés, prix moyen, saisonnalité
Marco, développeur italien visant un poste Data Engineer à Berlin. Bonne maîtrise technique mais doit s'adapter aux spécificités allemandes :
Tests plus longs (jusqu'à 2h) avec emphasis sur la rigueur
Documentation obligatoire du code SQL (commentaires détaillés)
Questions sur la RGPD et anonymisation des données
Stratégie Marco : préparation sur Codility (plateforme européenne type), focus sur la propreté du code et les aspects légaux, simulation en 2h.
Candidats extra-européens
Priya, data scientist indienne postulant en France via visa compétences et talents. Excellente formation technique mais doit prouver son niveau :
Tests souvent plus difficiles pour justifier le visa
Emphasis sur les soft skills pendant le live coding (communication claire)
Questions métier en français (secteur bancaire français, par ex.)
Stratégie Priya : double préparation technique + linguistique, simulations en français avec un mentor, focus sur l'explication verbale.
Validation et suivi post-test
Débrief immédiat (dans les 2h)
Notez pendant que c'est frais :
Questions sur lesquelles vous étiez à l'aise → points forts à capitaliser
Questions où vous avez hésité → axes d'amélioration prioritaires
Erreurs de stratégie : mauvaise gestion du temps, stress sur une question, mauvaise lecture d'énoncé
Particularités de la plateforme : interface, dialecte SQL, types de validation
Analyse des résultats
Si vous recevez un score ou des commentaires :
Score > 80% : excellent, vous pouvez viser des postes plus seniors ou des entreprises plus exigeantes (GAFAM, scale-ups).
Score 60-80% : bon niveau, travaillez les points faibles identifiés pour gagner 10-15 points et repasser dans 2-3 semaines.
Score < 60% : bases à consolider, prévoir 4-6 semaines de préparation supplémentaires avant le prochain test. Revoyez les fondamentaux sur DataLemur.
Tableau de suivi personnel
Compétence
Niveau avant
Performance test
Actions correctives
JOINs complexes
7/10
Question 3 ratée
10 exos StrataScratch JOINs
Window functions
6/10
Réussie en 18min
Optimiser vitesse (+5 exos)
Gestion du temps
-
5min de retard
Simulations chronométrées
Gestion NULL
5/10
Erreur ligne 3
Mini-guide NULL + 3 exos
⚠️ Attention
Évitez de refaire un test technique trop rapidement après un échec. La plupart des entreprises imposent un délai de 6-12 mois avant de pouvoir repasser. Mieux vaut prendre 2-3 semaines supplémentaires pour bien se préparer que de griller une opportunité par impatience. Une entreprise verra d'ailleurs plus positivement un candidat qui dit "Je repasse dans 3 semaines" qu'un candidat qui repost après 48h avec le même score.
Que faire si vous ne savez pas résoudre une question
Ne restez pas bloqué — passez à la question suivante après 5 minutes d'essai
Écrivez ce que vous pouvez — une requête partiellement correcte obtient souvent des points
Documentez votre logique — même en commentaires : "Ici je joindrais customers"
Revenez-y à la fin si vous avez du temps
-- Exemple : vous êtes bloqué sur une window function-- Écrivez quand même le squeletteWITH base_data AS (
SELECT customer_id, order_date, amount
FROM orders
WHERE order_date >='2024-01-01'
)
SELECT
customer_id,
order_date,
amount,
-- À FAIRE : window function ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date)SUM(amount) OVER (PARTITIONBY customer_id) as total_par_client
FROM base_data;
Système et optimisation : EXPLAIN ANALYZE en profondeur
Temps recommandé : 2-3 semaines, 10h/semaine incluant les simulations en live
Questions fréquentes
Combien de temps faut-il pour se préparer ?
Débutant complet : 4-8 semaines de 5h/semaine | Débutant avec bases : 2-3 semaines | Intermédiaire : 10-15 jours | Avancé : 5-7 jours.
PostgreSQL et MySQL : c'est pareil ?
Non. Les différences principales : dates (DATE_TRUNC vs DATE_FORMAT), strings (|| vs CONCAT), window functions (syntaxe identique généralement). Conseil : maîtrisez PostgreSQL (plus courant en interviews), puis adaptez à MySQL sur les détails spécifiques.
Window functions : par où commencer ?
Commencez par ROW_NUMBER(), puis RANK(), puis SUM() OVER (...). Pratiquez d'abord sans PARTITION, puis avec. Notre guide complet les couvre dans cet ordre : fonctions fenêtre SQL.
Comment gérer le stress pendant le test en live ?
Verbalisez votre réflexion (rassure le recruteur), posez des questions si l'énoncé est flou, notez le schéma avant de coder. Rappel : 30-40% du temps à comprendre, 60-70% à coder.
Faut-il apprendre les transactions SQL ?
Senior/Data Engineer : oui, c'est possible (ACID, isolation levels). Pour Junior/Analyst : très rare mais bon à connaitre en contexte de take-home. Maîtrisez d'abord JOINs et window functions.
Quelle plateforme pour se préparer si je passe chez X ?
Impossible de savoir en avance. Stratégie universelle : maîtrisez les fondamentaux sur 2 plateformes (ex : DataLemur + StrataScratch), vous serez prêt peu importe celle utilisée réellement.
Combien de points faut-il pour réussir ?
Généralement 70-80% = seuil de passage | 80%+ = très bon signal | 90%+ = excellent. Mais certaines entreprises aiment les exigences baissent à 60% si vous justifiez bien. Demandez toujours votre score.
Prêt à vous entraîner ?
50 exercices SQL interactifs avec éditeur en ligne, chronomètre et feedback IA.