0Pricing
Coding Interview Prep · Leçon

Agrégats sans GROUP BY

Comprendre comment un agrégat seul réduit une table entière à une ligne

Agrégats sans GROUP BY est une leçon Coding 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 Coding Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Coding Interview Prep comprend 4 leçons au total.

Une fonction d'agrégation, une ligne

Les recruteurs vérifient une notion fondamentale avec cette question : « Que se passe-t-il lorsque vous utilisez une fonction d'agrégation sans GROUP BY ? »

La réponse : toute la table est condensée en une seule ligne. La fonction d'agrégation traite toutes les lignes retenues comme un grand groupe implicite. Comprendre ce modèle de « groupe implicite » explique de nombreuses règles qui en découlent ; construisons-le soigneusement.

Le groupe unique implicite

Lorsque vous écrivez une fonction d'agrégation seule, sans GROUP BY, SQL se comporte comme s'il existait un groupe contenant toutes les lignes. Le résultat contient toujours exactement une ligne, quel que soit le nombre de lignes de la table — même si la table est vide.

Ainsi, SELECT COUNT(*) FROM employees renvoie une ligne contenant un nombre qui résume toute la table.

SELECT COUNT(*) AS total_employees
FROM employees;
-- always returns exactly one row

Plusieurs fonctions d'agrégation ensemble

Vous pouvez énumérer plusieurs fonctions d'agrégation dans un même SELECT. Elles résument toutes le même groupe implicite ; vous obtenez donc toujours exactement une ligne comportant plusieurs colonnes.

C'est la requête classique pour obtenir les « statistiques récapitulatives ». Les quatre nombres décrivent le même ensemble complet de lignes.

SELECT
  COUNT(*)     AS num_rows,
  SUM(salary)  AS total_pay,
  AVG(salary)  AS avg_pay,
  MAX(salary)  AS top_pay
FROM employees;

L'erreur de mélange

Voici la règle la plus souvent évaluée. Vous ne pouvez pas mélanger une fonction d'agrégation seule avec une colonne non agrégée dans le même SELECT sans GROUP BY.

Pourquoi ? La fonction d'agrégation produit une ligne, mais une colonne ordinaire possède plusieurs valeurs — laquelle afficherait-elle ? La situation est ambiguë, donc SQL standard lève une erreur.

-- ERROR: name is not aggregated and there is no GROUP BY
SELECT name, MAX(salary)
FROM employees;

Pourquoi est-ce ambigu ?

Examinez le cas de notre table. MAX(salary) réduit toutes les lignes à une seule valeur. Mais name possède une valeur différente sur chaque ligne. La ligne récapitulative unique ne peut pas contenir cinq noms dans une seule cellule.

La base de données refuse de deviner. C'est le même principe que celui de la règle GROUP BY : toute colonne sélectionnée doit être agrégée ou faire partie du groupe. Sans GROUP BY, seules les fonctions d'agrégation sont autorisées.

L'exception permissive de MySQL

Une particularité de dialecte mérite d'être mentionnée : les anciennes versions de MySQL ou MySQL en mode non strict autorisaient la requête mélangeant les deux types de colonnes et renvoyaient un nom arbitraire — pas nécessairement celui de la personne la mieux rémunérée.

Les versions modernes de MySQL avec ONLY_FULL_GROUP_BY activé (ce qui est désormais le comportement par défaut) la rejettent comme les autres. Le mentionner montre que vous connaissez les différences entre les dialectes, mais considérez toujours cette requête mixte comme incorrecte.

Obtenir la ligne correspondant au maximum

Alors, comment obtenir le nom de l'employé le mieux payé ? Pas en mélangeant les colonnes. Utilisez ORDER BY + LIMIT, ou une sous-requête qui compare les valeurs au résultat de l'agrégation.

La version avec ORDER BY/LIMIT est la plus simple. La version avec sous-requête se généralise facilement et renvoie tous les employés à égalité pour le maximum.

-- Subquery: returns everyone earning the max
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

Fonctions d'agrégation sur une table vide

Voici un cas limite que les recruteurs glissent parfois dans la question : « Que renvoie une fonction d'agrégation seule sur une table vide ? »

  • COUNT(*) renvoie 0 (une ligne, avec la valeur 0).
  • SUM, AVG, MIN et MAX renvoient NULL (une ligne, avec la valeur NULL).

Point essentiel : vous récupérez toujours une ligne, jamais zéro ligne. Cette garantie d'une seule ligne est précisément le principe d'une fonction d'agrégation sans GROUP BY.

SELECT COUNT(*) AS c, SUM(salary) AS s, MAX(salary) AS m
FROM employees
WHERE 1 = 0;
-- one row: c=0, s=NULL, m=NULL

Aucune agrégation dans WHERE

Une autre règle découle de ce modèle : vous ne pouvez pas placer une fonction d'agrégation dans une clause WHERE, car WHERE filtre les lignes individuelles avant l'agrégation.

Pour filtrer selon le résultat d'une agrégation, utilisez HAVING (avec un regroupement) ou encapsulez la fonction d'agrégation dans une sous-requête. WHERE s'exécute simplement trop tôt dans l'ordre d'exécution pour voir le résultat de l'agrégation.

-- ERROR: aggregate not allowed in WHERE
-- SELECT * FROM employees WHERE salary > AVG(salary);

-- Correct: compare to the aggregate via subquery
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

Agrégation seule contre GROUP BY

Formulez vous-même le contraste :

  • Pas de GROUP BY : un groupe implicite = toute la table = exactement une ligne de résultat.
  • Avec GROUP BY colonne : un groupe par valeur distincte de la colonne = une ligne par groupe.

Une fonction d'agrégation seule revient simplement à utiliser GROUP BY avec zéro colonne de regroupement. Même mécanisme, un seul grand compartiment.

-- Whole table: one row
SELECT AVG(salary) FROM employees;

-- Per department: one row each
SELECT department, AVG(salary)
FROM employees
GROUP BY department;

Comment l'expliquer

Une réponse claire : « Une fonction d'agrégation sans GROUP BY traite l'ensemble du résultat comme un groupe implicite et renvoie exactement une ligne récapitulative, même lorsque la table est vide. Vous ne pouvez pas sélectionner une colonne non agrégée à côté, car sa valeur serait ambiguë. Pour obtenir la ligne correspondant à MAX ou MIN, j'utilise ORDER BY avec LIMIT ou une sous-requête qui compare les valeurs au résultat de l'agrégation. »

Vérification rapide

Prévoyez la forme du résultat.

Récapitulatif

Les fonctions d'agrégation sans GROUP BY en bref :

  • Toute la table devient un groupe implicite → exactement une ligne de résultat.
  • Vous ne pouvez pas mélanger une fonction d'agrégation seule avec une colonne non agrégée.
  • Table vide : COUNT(*) = 0, les autres fonctions renvoient NULL, toujours sur une seule ligne.
  • Les fonctions d'agrégation ne peuvent pas apparaître dans WHERE ; utilisez une sous-requête ou HAVING.
  • Pour obtenir la ligne correspondant à MIN/MAX, utilisez ORDER BY + LIMIT ou une sous-requête.

Cela termine les exercices d'entretien sur les fonctions d'agrégation.

Questions Fréquemment Posées

La leçon « Agrégats sans GROUP BY » est-elle gratuite ?

Oui — le texte complet de « Agrégats sans GROUP BY » 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 Coding Interview Prep, passe à CoddyKit PRO. Le cours Coding Interview Prep comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Agrégats sans GROUP BY » ?

Comprendre comment un agrégat seul réduit une table entière à une ligne Tu pratiques Coding 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 Coding Interview Prep ?

Aucune expérience préalable n'est requise. Coding 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 « Agrégats sans GROUP BY » ?

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 Coding Interview Prep ?

Oui. Chaque leçon Coding 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. COUNT(*) ou COUNT(colonne) ou COUNT(DISTINCT)
  2. SUM et AVG avec des NULL
  3. MIN, MAX et agrégation non numérique
  4. Agrégats sans GROUP BY
← Retour à Coding Interview Prep