Série complète d’exercices d’entretien blanc
Des exercices de bout en bout chronométrés combinant jointures, fenêtres et CTE dans les conditions d’un entretien
Série complète d’exercices d’entretien blanc est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Interview Prep comprend 4 leçons au total.
Déroulement d’un entretien SQL
Cette épreuve de synthèse vous fait résoudre des problèmes complets qui combinent des jointures, des fonctions de fenêtrage et des CTE dans les conditions d’un entretien. Commençons par la compétence méthodologique fondamentale : la manière de vous comporter pendant l’entretien.
- Reformulez le problème et confirmez le schéma.
- Clarifiez les cas limites (NULL, égalités, doublons) avant d’écrire le code.
- Décrivez à voix haute votre approche, puis écrivez la requête.
- Testez votre solution mentalement sur un tout petit exemple.
Les recruteurs évaluent votre démarche autant que votre requête finale.
Le schéma commun
Tous les problèmes ci-dessous utilisent ce petit schéma de commerce électronique. Lisez-le une fois afin que chaque requête soit compréhensible.
customers(id, name, country)orders(id, customer_id, order_date, status, amount)order_items(order_id, product_id, quantity)products(id, name, category, price)
Gardez-le à l’esprit ; le reste de la leçon fait référence à ces tables.
-- orders.status is one of: 'paid','pending','cancelled'
-- amount is the order total in the customer's currencyProblème 1 : clients dépensant le plus
« Retournez les 3 clients ayant dépensé le plus au total, avec leur nom et leur total. »
Approche : filtrez les commandes payées, agrégez par client, triez, puis limitez le résultat. Précisez que vous excluez les commandes annulées et en attente, un cas limite que les recruteurs introduisent intentionnellement.
SELECT c.name,
SUM(o.amount) AS total_spend
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'paid'
GROUP BY c.id, c.name
ORDER BY total_spend DESC
LIMIT 3;Problème 2 : clients n’ayant jamais passé de commande
« Listez les clients qui n’ont jamais passé de commande. » Il s’agit du modèle de jointure anti. Deux solutions propres : LEFT JOIN avec IS NULL, ou NOT EXISTS.
Préférez NOT EXISTS, car cette solution gère correctement NULL (contrairement à NOT IN). Mentionnez cette distinction ; c’est précisément ce que cherche la personne qui vous interroge.
-- NULL-safe anti-join
SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.id
);Problème 3 : deuxième montant de commande le plus élevé
« Trouvez le deuxième montant de commande distinct le plus élevé. » La solution la plus claire et qui gère les égalités utilise DENSE_RANK, afin que les montants identiques partagent le même classement.
Cas limite à signaler : s’il n’existe pas de deuxième valeur distincte, aucune ligne n’est renvoyée ; cela peut être acceptable ou nécessiter un encadrement par COALESCE selon les exigences.
SELECT amount
FROM (
SELECT amount,
DENSE_RANK() OVER (ORDER BY amount DESC) AS rnk
FROM orders
) ranked
WHERE rnk = 2;Problème 4 : dernière commande de chaque client
« Retournez la commande la plus récente de chaque client. » Il s’agit du modèle consistant à conserver la ligne la plus récente pour chaque clé, résolu avec ROW_NUMBER partitionné par client et trié par date décroissante.
Ajoutez un critère de départage (identifiant de commande) afin que le résultat soit déterministe lorsque deux commandes ont la même date ; c’est un détail que les bons candidats incluent.
SELECT customer_id, id AS order_id, order_date, amount
FROM (
SELECT o.*,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date DESC, id DESC
) AS rn
FROM orders o
) t
WHERE rn = 1;Problème 5 : croissance d’un mois à l’autre
« Calculez le chiffre d’affaires mensuel payé et sa variation en pourcentage par rapport au mois précédent. » Cette solution combine une agrégation dans un CTE avec LAG.
La première étape agrège les données par mois ; la deuxième compare chaque mois au précédent à l’aide de LAG. Protégez la division afin que le premier mois, qui n’a pas de mois précédent, ne provoque pas d’erreur.
WITH monthly AS (
SELECT DATE_TRUNC('month', order_date) AS mth,
SUM(amount) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY DATE_TRUNC('month', order_date)
)
SELECT mth,
revenue,
LAG(revenue) OVER (ORDER BY mth) AS prev_revenue,
ROUND(
100.0 * (revenue - LAG(revenue) OVER (ORDER BY mth))
/ NULLIF(LAG(revenue) OVER (ORDER BY mth), 0), 2
) AS pct_change
FROM monthly
ORDER BY mth;Problème 6 : meilleur produit par catégorie
« Pour chaque catégorie, retournez le produit le plus vendu selon la quantité totale. » Il s’agit du modèle des N meilleurs par groupe : agrégez, classez dans chaque partition, puis filtrez sur le classement 1.
Si les égalités comptent, remplacez ROW_NUMBER par RANK afin que tous les premiers ex æquo apparaissent. Nommer ce choix montre que vous comprenez la différence.
WITH sales AS (
SELECT p.category,
p.name AS product,
SUM(oi.quantity) AS qty
FROM order_items oi
JOIN products p ON p.id = oi.product_id
GROUP BY p.category, p.name
)
SELECT category, product, qty
FROM (
SELECT s.*,
ROW_NUMBER() OVER (
PARTITION BY category ORDER BY qty DESC
) AS rn
FROM sales s
) r
WHERE rn = 1;Problème 7 : total cumulé du chiffre d’affaires
« Affichez le total cumulé du chiffre d’affaires payé par jour. » Une fonction de fenêtrage SUM avec un cadre ordonné produit le total cumulé sans jointure avec elle-même.
Mentionnez le cadrage avec ROWS pour obtenir un cumul véritablement ligne par ligne ; le cadre RANGE par défaut peut se comporter de manière inattendue lorsque les dates sont à égalité.
SELECT order_date,
SUM(daily) OVER (
ORDER BY order_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_total
FROM (
SELECT order_date, SUM(amount) AS daily
FROM orders
WHERE status = 'paid'
GROUP BY order_date
) d
ORDER BY order_date;Problème 8 : jours actifs consécutifs
« Trouvez les utilisateurs ayant au moins 3 jours consécutifs comportant une commande payée. » Il s’agit d’une variante du problème des lacunes et îlots utilisant l’astuce de la différence entre numéros de ligne.
Soustraire de la date un numéro de ligne propre à chaque utilisateur produit une constante au sein d’une série consécutive ; vous pouvez donc regrouper selon cette constante et compter. C’est un signe d’un niveau confirmé.
WITH days AS (
SELECT DISTINCT customer_id, order_date
FROM orders WHERE status = 'paid'
),
grp AS (
SELECT customer_id, order_date,
order_date - (ROW_NUMBER() OVER (
PARTITION BY customer_id ORDER BY order_date
) * INTERVAL '1 day') AS island
FROM days
)
SELECT customer_id, COUNT(*) AS streak_len
FROM grp
GROUP BY customer_id, island
HAVING COUNT(*) >= 3;Performances et pièges courants
Une fois la requête correcte, les recruteurs demandent « comment l’accéléreriez-vous ? » et guettent les pièges classiques. Gardez une liste de vérification prête :
- Indexez les colonnes utilisées pour les jointures et les filtres (par exemple
orders(customer_id, status)) ; évitez les fonctions sur les colonnes indexées dans WHERE. - Préférez EXISTS à IN pour les grandes jointures anti ;
NOT INavec un NULL ne renvoie silencieusement aucune ligne. - Filtrer dans WHERE une colonne issue d’une jointure externe la transforme discrètement en jointure interne.
- Ajoutez toujours un critère de départage afin que les résultats des N meilleurs soient déterministes.
- Vérifiez dans le plan EXPLAIN la présence de parcours séquentiels sur les grandes tables.
Vérification rapide
Vous devez obtenir pour chaque client sa seule commande la plus récente, et deux commandes peuvent partager la même date.
Récapitulatif : série complète d’entretiens blancs
Vous avez traité de bout en bout les problèmes d’entretien les plus fréquents :
- Agrégation + LIMIT pour les N plus grosses dépenses.
- Jointures anti avec NOT EXISTS (compatible avec NULL).
- DENSE_RANK pour la Nᵉ valeur la plus élevée, ROW_NUMBER pour la dernière ligne par clé et le meilleur élément par groupe.
- LAG pour les comparaisons mensuelles, SUM OVER pour les totaux cumulés.
- L’astuce des numéros de ligne du problème des lacunes et îlots pour les séries consécutives.
- Concluez chaque réponse en abordant les index, EXPLAIN et les pièges courants.
Questions Fréquemment Posées
La leçon « Série complète d’exercices d’entretien blanc » est-elle gratuite ?
Oui — le texte complet de « Série complète d’exercices d’entretien blanc » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Interview Prep, passe à CoddyKit PRO. Le cours SQL Interview Prep comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Série complète d’exercices d’entretien blanc » ?
Des exercices de bout en bout chronométrés combinant jointures, fenêtres et CTE dans les conditions d’un entretien Tu pratiques SQL Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer SQL Interview Prep ?
Aucune expérience préalable n'est requise. SQL Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Série complète d’exercices d’entretien blanc » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon SQL Interview Prep ?
Oui. Chaque leçon SQL Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Normalisation jusqu’à la 3NF
- Modélisation ER et cardinalité des relations
- Schéma en étoile et conception d’un entrepôt de données
- Série complète d’exercices d’entretien blanc