0Pricing
SQL Interview Prep · Leçon

Sous-requêtes dans la clause FROM (tables dérivées)

Encapsuler une requête dans une table virtuelle et comprendre pourquoi les alias sont obligatoires

Sous-requêtes dans la clause FROM (tables dérivées) est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 2 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.

Qu'est-ce qu'une table dérivée

Une sous-requête dans la clause FROM est appelée table dérivée (ou vue intégrée). Au lieu de renvoyer une seule valeur, elle renvoie un ensemble complet de résultats que la requête externe traite comme s'il s'agissait d'une table réelle.

  • Elle peut contenir plusieurs lignes et plusieurs colonnes.
  • Vous pouvez l'interroger, la joindre et la filtrer comme n'importe quelle table.

Les recruteurs utilisent les tables dérivées pour vérifier que vous savez décomposer un problème en plusieurs étapes.

Les alias sont obligatoires

Le piège numéro un : une table dérivée doit avoir un alias. Sans alias, la plupart des moteurs rejettent la requête.

  • MySQL : Chaque table dérivée doit avoir son propre alias.
  • Postgres : la sous-requête dans FROM doit avoir un alias.

Donnez-lui un nom (ici dept_avg) et vous pourrez référencer ses colonnes à l'aide de ce nom.

SELECT dept_avg.dept_id, dept_avg.avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS dept_avg;

Pourquoi préagréger dans une table dérivée

Un problème fréquent en entretien consiste à afficher chaque employé à côté du salaire moyen de son département. Vous ne pouvez pas mélanger directement la ligne de détail et un agrégat sans rencontrer des problèmes de regroupement.

L'approche claire consiste à calculer la moyenne par département dans une table dérivée, puis à la rattacher aux lignes de détail. La table dérivée est d'abord réduite à une ligne par département.

SELECT e.name, e.salary, d.avg_salary
FROM employees e
JOIN (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d ON e.dept_id = d.dept_id;

Filtrer sur un résultat d'agrégation

Les tables dérivées vous permettent de filtrer sur un agrégat calculé sans recourir à des constructions compliquées avec HAVING dans la requête externe. Supposons que nous voulions uniquement les départements dont le salaire moyen dépasse 60000.

Nous effectuons l'agrégation à l'intérieur, puis appliquons un simple WHERE sur la colonne dérivée à l'extérieur. Pour la requête externe, avg_salary est une colonne ordinaire.

SELECT dept_id, avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d
WHERE avg_salary > 60000;

Deux niveaux d'agrégation

Les tables dérivées sont particulièrement utiles lorsque vous devez calculer un agrégat d'un agrégat — une question classique en entretien : quelle est la moyenne des salaires moyens par département ?

Vous ne pouvez pas imbriquer directement AVG(AVG(...)). La requête interne produit une moyenne par département ; la requête externe calcule la moyenne de ces valeurs.

SELECT AVG(avg_salary) AS avg_of_dept_avgs
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d;

Nommer les colonnes calculées

Toute expression dans une table dérivée doit avoir un alias si vous souhaitez la référencer à l'extérieur. L'expression interne salary * 12 aurait sinon un nom attribué par la base de données, sur lequel vous ne pouvez pas compter.

Donnez toujours un alias aux colonnes calculées — les recruteurs remarquent lorsque vous référencez une expression sans alias et supposez un nom de colonne qui peut ne pas exister.

SELECT name, annual_salary
FROM (
  SELECT name, salary * 12 AS annual_salary
  FROM employees
) AS yearly
WHERE annual_salary > 100000;

Joindre deux tables dérivées

Vous pouvez joindre plusieurs tables dérivées. Ici, nous comparons l'effectif de chaque département à sa masse salariale totale en joignant deux sous-requêtes préagrégées.

Chaque table dérivée répond à une sous-question ; la jointure les assemble pour produire le rapport final. Cette façon de raisonner par étapes est exactement ce que recherchent les entretiens de niveau intermédiaire.

SELECT c.dept_id, c.headcount, p.payroll
FROM (
  SELECT dept_id, COUNT(*) AS headcount
  FROM employees GROUP BY dept_id
) AS c
JOIN (
  SELECT dept_id, SUM(salary) AS payroll
  FROM employees GROUP BY dept_id
) AS p ON c.dept_id = p.dept_id;

Portée : la requête externe ne peut pas voir l'intérieur

Voici une règle importante : la requête externe ne peut référencer que les colonnes que la table dérivée expose dans sa liste SELECT. Les colonnes utilisées uniquement à l'intérieur de la sous-requête sont invisibles à l'extérieur.

Si la requête interne sélectionne dept_id et avg_salary, alors salary ou name ne sont pas disponibles à l'extérieur — elles ont été utilisées par l'agrégation. Les recruteurs vérifient que vous comprenez cette limite de portée.

SELECT dept_id, avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees GROUP BY dept_id
) AS d;

Table dérivée ou CTE

Une table dérivée et une expression de table commune (CTE) produisent souvent le même plan. Les recruteurs peuvent vous demander pourquoi vous choisiriez l'une plutôt que l'autre :

  • Table dérivée : intégrée à la requête, elle convient à une utilisation ponctuelle.
  • CTE (WITH) : nommée en tête de requête, lisible et réutilisable si elle est référencée plusieurs fois.

Pour une logique profondément imbriquée, une chaîne de traitement CTE se lit de haut en bas ; une table dérivée se lit de l'intérieur vers l'extérieur.

WITH dept_avg AS (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees GROUP BY dept_id
)
SELECT * FROM dept_avg WHERE avg_salary > 60000;

La sous-requête corrélée dans FROM

Normalement, une sous-requête dans FROM ne peut pas faire référence aux lignes de la requête externe. LATERAL (Postgres) ou CROSS APPLY (SQL Server) lève cette restriction et permet à la table dérivée de s'exécuter pour chaque ligne externe.

Cela permet d'effectuer des recherches des N premiers résultats pour chaque ligne. Connaître ce mot-clé témoigne d'une maîtrise avancée, même lors d'un entretien de niveau intermédiaire.

SELECT d.dept_name, top_emp.name, top_emp.salary
FROM departments d
CROSS JOIN LATERAL (
  SELECT name, salary FROM employees e
  WHERE e.dept_id = d.id
  ORDER BY salary DESC LIMIT 1
) AS top_emp;

Phrase clé d'entretien

Si l'on vous interroge sur les sous-requêtes de la clause FROM, dites : "Une table dérivée est une sous-requête dans FROM qui renvoie un ensemble de résultats que la requête externe utilise comme une table. Elle doit avoir un alias, la requête externe ne peut voir que les colonnes qu'elle sélectionne, et elle est idéale pour préagréger avant une jointure ou pour agréger un agrégat."

Ajoutez que LATERAL lui permet de faire référence aux lignes externes, et vous aurez couvert tous les aspects.

Vérification rapide

Choisissez l'affirmation qui est toujours requise pour une sous-requête de la clause FROM.

Récapitulatif

Les tables dérivées, c'est acquis :

  • Une sous-requête FROM renvoie une table virtuelle — de nombreuses lignes et de nombreuses colonnes.
  • Elle doit obligatoirement avoir un alias ; la requête externe ne voit que les colonnes sélectionnées.
  • Utilisez-la pour préagréger avant une jointure, filtrer sur des agrégats ou agréger un agrégat.
  • Une CTE est l'alternative nommée et lisible ; LATERAL/CROSS APPLY permettent de faire référence aux lignes externes.

Ensuite : les sous-requêtes d'appartenance à un ensemble avec IN, ANY et ALL.

Questions Fréquemment Posées

La leçon « Sous-requêtes dans la clause FROM (tables dérivées) » est-elle gratuite ?

Oui — le texte complet de « Sous-requêtes dans la clause FROM (tables dérivées) » 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 dans la clause FROM (tables dérivées) » ?

Encapsuler une requête dans une table virtuelle et comprendre pourquoi les alias sont obligatoires 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 2 sur 4.

Combien de temps prend la leçon « Sous-requêtes dans la clause FROM (tables dérivées) » ?

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