0Pricing
SQL Interview Prep · Leçon

Sous-requêtes scalaires dans SELECT et WHERE

Sous-requêtes à valeur unique et erreur lorsqu’elles renvoient plusieurs lignes

Sous-requêtes scalaires dans SELECT et WHERE est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 1 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.

Ce que l'intervieweur entend par sous-requête scalaire

Une sous-requête scalaire est une requête qui renvoie exactement une ligne et une colonne — une valeur unique. Comme elle se résout en une seule valeur, SQL vous permet de l'utiliser presque partout où une valeur littérale pourrait être utilisée : dans SELECT, WHERE, HAVING, et même dans ORDER BY.

  • Les recruteurs vérifient que vous connaissez la règle « une ligne, une colonne ».
  • Le piège classique : une sous-requête qui renvoie accidentellement plusieurs lignes.

Si vous pouvez énoncer clairement cette définition, vous avez déjà franchi le premier point de contrôle.

Une sous-requête scalaire dans la liste SELECT

Placer une sous-requête scalaire dans la liste SELECT permet d'associer une valeur calculée unique à chaque ligne de sortie. Ici, nous affichons chaque employé à côté du salaire moyen de toute l'entreprise.

La sous-requête (SELECT AVG(salary) FROM employees) s'exécute et réduit toute la table à un seul nombre, puis ce nombre est répété sur chaque ligne.

SELECT
  name,
  salary,
  (SELECT AVG(salary) FROM employees) AS company_avg
FROM employees;

Une sous-requête scalaire dans WHERE

La même valeur unique peut piloter un filtre. Une question très courante en entretien consiste à trouver toutes les personnes qui gagnent plus que la moyenne de l'entreprise.

La sous-requête calcule la moyenne une fois, puis chaque ligne de la requête externe est comparée à cette valeur. Cette sous-requête n'est pas corrélée — la requête interne ne dépend pas de la ligne externe, elle ne s'exécute donc qu'une seule fois.

SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

L'erreur « plus d'une ligne »

C'est l'erreur que les recruteurs veulent vous voir anticiper. Si votre sous-requête est utilisée avec = ou > mais renvoie plusieurs lignes, le moteur renvoie une erreur :

  • Postgres : plus d'une ligne renvoyée par une sous-requête utilisée comme expression
  • MySQL : La sous-requête renvoie plus d'une ligne

La requête ci-dessous échoue, car plusieurs employés peuvent se trouver dans le département 5 — la sous-requête n'est pas scalaire.

SELECT name
FROM employees
WHERE salary = (SELECT salary FROM employees WHERE dept_id = 5);

Forcer une sous-requête à être scalaire

Voici deux moyens fiables de garantir une valeur unique :

  • Utiliser un agrégat comme MAX, MIN ou AVG — les agrégats sans GROUP BY renvoient toujours une ligne.
  • Utiliser LIMIT 1 (Postgres/MySQL) ou FETCH FIRST 1 ROW ONLY après un ORDER BY.

La version corrigée demande le salaire le plus élevé du département 5.

SELECT name
FROM employees
WHERE salary = (
  SELECT MAX(salary) FROM employees WHERE dept_id = 5
);

Les sous-requêtes scalaires renvoient NULL lorsqu'il n'y a aucune ligne

Voici un point subtil souvent abordé en entretien : si une sous-requête scalaire ne correspond à aucune ligne, elle ne provoque pas d'erreur — elle renvoie NULL. Ce NULL se propage ensuite dans votre comparaison.

Comme salary > NULL prend la valeur UNKNOWN (et non true), la requête externe ne renvoie aucune ligne. Les candidats s'attendent souvent à une erreur ; la bonne réponse est : résultat vide, sans message.

SELECT name, salary
FROM employees
WHERE salary > (
  SELECT AVG(salary) FROM employees WHERE dept_id = 9999
);

Exemple détaillé : les salaires supérieurs à la moyenne avec l'écart

Combinons les deux emplacements. Nous affichons chaque personne dont le salaire est supérieur à la moyenne ainsi que l'écart par rapport à cette moyenne. La même sous-requête scalaire apparaît dans SELECT et WHERE.

Un recruteur peut vous demander si la sous-requête s'exécute deux fois. Logiquement, elle apparaît deux fois, mais un bon optimiseur peut évaluer la sous-requête non corrélée une seule fois et réutiliser son résultat.

SELECT
  name,
  salary,
  salary - (SELECT AVG(salary) FROM employees) AS above_avg
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees)
ORDER BY above_avg DESC;

Une sous-requête scalaire dans ORDER BY

Comme une sous-requête scalaire n'est qu'une valeur, son utilisation dans ORDER BY est également autorisée. Ce n'est que rarement l'approche la plus claire, mais les recruteurs aiment vérifier que vous savez qu'elle est permise.

Ici, nous trions les départements selon une valeur extraite d'une autre table — l'effectif d'employés de chaque département — sans effectuer de jointure.

SELECT d.dept_name
FROM departments d
ORDER BY (
  SELECT COUNT(*) FROM employees e WHERE e.dept_id = d.id
) DESC;

Scalaire ou corrélée : connaître la différence

L'exemple avec ORDER BY ci-dessus fait en réalité référence à d.id dans la requête externe — il s'agit donc d'une sous-requête scalaire corrélée, qui s'exécute une fois pour chaque ligne externe.

Les recruteurs apprécient particulièrement cette distinction :

  • Sous-requête scalaire non corrélée : autonome, elle s'exécute une fois.
  • Sous-requête scalaire corrélée : elle fait référence à la ligne externe et s'exécute pour chaque ligne.

Les deux restent scalaires (une seule valeur), mais leurs performances peuvent être très différentes.

Quand ne pas utiliser une sous-requête scalaire

Une sous-requête scalaire corrélée dans la liste SELECT est pratique, mais peut être lente sur de grandes tables — elle s'exécute pour chaque ligne. Les recruteurs attendent de vous que vous connaissiez les solutions de remplacement :

  • Une LEFT JOIN vers une table dérivée préagrégée.
  • Une fonction de fenêtre telle que AVG(salary) OVER ().

La forme utilisant une fenêtre ci-dessous produit la même colonne de moyenne de l'entreprise sans effectuer une analyse séparée de la sous-requête.

SELECT
  name,
  salary,
  AVG(salary) OVER () AS company_avg
FROM employees;

Phrase à retenir pour un entretien

Si l'on vous demande de définir une sous-requête scalaire, répondez ceci : « Une sous-requête scalaire renvoie une ligne et une colonne ; elle se comporte donc comme une valeur unique et peut être utilisée partout où une valeur littérale est autorisée. Si elle renvoie plusieurs lignes, le moteur génère une erreur ; si elle ne renvoie aucune ligne, elle produit NULL. »

Cette seule phrase couvre la définition, le cas d'erreur et le cas limite de NULL — les trois éléments que tout recruteur attend.

Vérification rapide

Vérifiez votre compréhension du comportement des sous-requêtes scalaires.

Récapitulatif

Vous maîtrisez maintenant les sous-requêtes scalaires :

  • Définition : une ligne, une colonne — utilisable comme une valeur littérale dans SELECT, WHERE, HAVING et ORDER BY.
  • Plusieurs lignes avec =/> provoquent une erreur ; forcez le caractère scalaire avec un agrégat ou LIMIT 1.
  • Aucune ligne produit NULL, ce qui élimine silencieusement les lignes d'un filtre.
  • Les sous-requêtes scalaires corrélées s'exécutent pour chaque ligne ; préférez les jointures ou les fonctions de fenêtre lorsque les performances sont importantes.

Ensuite : les sous-requêtes dans FROM, dont le résultat est une table virtuelle complète.

Questions Fréquemment Posées

La leçon « Sous-requêtes scalaires dans SELECT et WHERE » est-elle gratuite ?

Oui — le texte complet de « Sous-requêtes scalaires dans SELECT et WHERE » 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 « Sous-requêtes scalaires dans SELECT et WHERE » ?

Sous-requêtes à valeur unique et erreur lorsqu’elles renvoient plusieurs lignes 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 1 sur 4.

Combien de temps prend la leçon « Sous-requêtes scalaires dans SELECT et WHERE » ?

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

  1. Sous-requêtes scalaires dans SELECT et WHERE
  2. Sous-requêtes dans la clause FROM (tables dérivées)
  3. Sous-requêtes IN, ANY et ALL
  4. Performances de EXISTS et IN
← Retour à SQL Interview Prep