Vous voulez vérifier les bases SQL d'un candidat sans y passer une heure ? Voici un test prêt à l'emploi : un jeu de données simple, 5 requêtes progressives à résoudre en 30 minutes, et pour chacune le corrigé, ce qu'elle révèle et l'erreur fréquente. Copiez-le tel quel.
Ce test valide le socle attendu d'un profil junior : filtrer, agréger, joindre et raisonner sur des données. Ce qui compte n'est pas la syntaxe exacte (elle varie selon le moteur) mais la démarche et la justesse du résultat.
Donnez ce schéma au candidat avant de commencer.
Une petite base e-commerce, volontairement simple : trois tables reliées par des identifiants. Aucune donnée réelle n'est nécessaire — le candidat raisonne sur le schéma.
-- Jeu de donnees du test (base e-commerce)
clients(id, nom, pays, date_inscription)
produits(id, nom, categorie, prix)
commandes(id, client_id, produit_id, quantite, montant, date_commande, statut)
-- statut ∈ ('payee','en_attente','annulee')Combien de commandes y a-t-il dans chaque statut (payée, en attente, annulée) ?
L'entrée en matière : un simple regroupement. Elle vérifie que le candidat maîtrise GROUP BY et COUNT.
SELECT statut, COUNT(*) AS nb_commandes
FROM commandes
GROUP BY statut;Quel est le chiffre d'affaires total (commandes payées) par pays du client ?
Première jointure : il faut relier commandes et clients, filtrer sur le statut, puis sommer. Le cœur du métier d'analyste.
SELECT c.pays, SUM(o.montant) AS ca
FROM commandes o
JOIN clients c ON c.id = o.client_id
WHERE o.statut = 'payee'
GROUP BY c.pays
ORDER BY ca DESC;Quels sont les 5 produits les plus vendus en quantité ?
Jointure + agrégation + tri + limite : la requête analytique typique. Elle teste l'enchaînement des opérations.
SELECT p.nom, SUM(o.quantite) AS total_vendu
FROM commandes o
JOIN produits p ON p.id = o.produit_id
GROUP BY p.nom
ORDER BY total_vendu DESC
LIMIT 5;Quels clients n'ont passé aucune commande ?
La question qui sépare : elle demande une LEFT JOIN avec test sur NULL (ou NOT EXISTS). Beaucoup de juniors butent ici.
SELECT c.id, c.nom
FROM clients c
LEFT JOIN commandes o ON o.client_id = c.id
WHERE o.id IS NULL;Quel est le montant moyen d'une commande payée, mois par mois ?
La synthèse : filtrer, extraire le mois d'une date et calculer une moyenne. Elle vérifie l'aisance avec les dates et les agrégats.
SELECT DATE_TRUNC('month', o.date_commande) AS mois,
AVG(o.montant) AS panier_moyen
FROM commandes o
WHERE o.statut = 'payee'
GROUP BY mois
ORDER BY mois;Signal d'alerte : astuce : acceptez toute syntaxe de date correcte selon le moteur (DATE_TRUNC, EXTRACT, strftime…). Ce qui compte est le raisonnement, pas la fonction exacte.
| Niveau | Maîtrise attendue | Signal GO | NO-GO |
|---|---|---|---|
| Junior | Réussit Q1 à Q3 | Filtre, agrège et joint correctement | Bute déjà sur une jointure simple |
| Confirmé | Réussit Q4 (LEFT JOIN / NULL) | Gère l'absence de correspondance | Utilise une INNER JOIN pour Q4 |
| Senior | Réussit Q5 proprement | À l'aise avec dates et agrégats | Confond moyenne et somme |
| Lead | Explique chaque choix simplement | Vulgarise sa démarche à un non-technique | Répond juste sans savoir expliquer |
Data Builder mène l'entretien technique et vous livre un rapport clair et détaillé sous 24h. Premier entretien offert.