0Pricing
SQL Interview Prep · Leçon

La règle GROUP BY pour les colonnes SELECT

Pourquoi chaque colonne non agrégée doit apparaître dans GROUP BY et ce qu’implique le mode only-full-group-by

La règle GROUP BY pour les colonnes SELECT 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.

Pourquoi les entretiens commencent par GROUP BY

GROUP BY est le point où les entretiens distinguent les débutants des profils intermédiaires. La règle unique qu'ils vérifient le plus souvent est la suivante : chaque colonne de votre liste SELECT doit soit se trouver dans une fonction d'agrégation, soit être indiquée dans GROUP BY.

Si vous enfreignez cette règle, le moteur ne peut pas déterminer quelle valeur afficher pour un groupe contenant plusieurs lignes. Les recruteurs introduisent précisément cette erreur pour vérifier que vous comprenez ce qu'est réellement un groupe.

Ce qu'est réellement un groupe

GROUP BY regroupe de nombreuses lignes en une ligne par clé distincte. Après le regroupement, le moteur ne dispose plus des lignes individuelles. Il ne possède plus qu'une ligne de synthèse par groupe.

  • Les colonnes selon lesquelles vous avez regroupé ont une valeur clairement définie par groupe.
  • Les agrégats tels que COUNT, SUM et AVG réduisent les nombreuses valeurs à une seule.
  • Toute autre colonne brute est ambiguë : laquelle des nombreuses valeurs faut-il afficher ?
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

L'erreur classique

Voici l'erreur que les recruteurs adorent. Vous regroupez selon department, mais sélectionnez aussi name, une colonne non agrégée qui ne figure pas dans GROUP BY.

Chaque service compte de nombreux employés, donc chaque groupe contient de nombreux noms. Le moteur ne peut pas en choisir un ; le SQL standard rejette la requête.

-- ERROR: name is not in GROUP BY and not aggregated
SELECT department, name, COUNT(*)
FROM employees
GROUP BY department;

Deux façons de corriger le problème

Deux corrections valides sont possibles, et le recruteur veut vérifier que vous savez qu'elles produisent toutes deux des résultats différents :

  • Ajouter la colonne à GROUP BY si vous souhaitez réellement un regroupement plus détaillé (une ligne par service et par nom).
  • L'envelopper dans un agrégat comme MAX(name) ou COUNT(name) si vous voulez une valeur par groupe existant.
-- Finer grouping
SELECT department, name, COUNT(*) AS rows_for_person
FROM employees
GROUP BY department, name;

ONLY_FULL_GROUP_BY dans MySQL

Un piège classique : les anciennes versions de MySQL autorisaient la sélection de colonnes absentes du regroupement et renvoyaient discrètement une valeur arbitraire du groupe. Cela produisait des rapports erronés qui semblaient corrects.

Les versions modernes de MySQL activent ONLY_FULL_GROUP_BY par défaut, ce qui impose la règle standard. Postgres, SQL Server et Oracle l'ont toujours imposée. Si l'on vous demande pourquoi une requête « fonctionnait sur l'ancien serveur mais échoue maintenant », voici la réponse.

-- Legal under ONLY_FULL_GROUP_BY because every
-- selected column is grouped or aggregated
SELECT department, MAX(hire_date) AS latest_hire
FROM employees
GROUP BY department;

Exception de dépendance fonctionnelle

Il existe une nuance que les recruteurs utilisent pour évaluer votre maîtrise du sujet. Si vous regroupez selon la clé primaire d'une table, toutes les autres colonnes de cette table sont fonctionnellement dépendantes de cette clé et possèdent donc exactement une valeur par groupe.

Postgres et les versions modernes de MySQL autorisent la sélection de ces colonnes dépendantes sans les ajouter à la liste de regroupement. La clé regroupée les détermine de manière unique, il n'y a donc aucune ambiguïté.

-- Legal: id is the PK, so name is determined by it
SELECT e.id, e.name, COUNT(o.id) AS orders
FROM employees e
LEFT JOIN orders o ON o.employee_id = e.id
GROUP BY e.id;

Exemple détaillé : ventes par région

Supposons que vous deviez établir le total des ventes par région. La clé de regroupement est region et la mesure est SUM(amount). Tout le reste doit être agrégé ou supprimé.

Remarquez la simplicité du résultat : une ligne par région, chacune contenant une seule valeur cumulée. C'est la structure de tout rapport d'agrégation.

SELECT region,
       SUM(amount)   AS total_sales,
       COUNT(*)      AS num_orders,
       AVG(amount)   AS avg_order
FROM sales
GROUP BY region;

Mélanger détail et synthèse

Un énoncé piégé : « Afficher le montant de chaque commande à côté du total de sa région. » Vous ne pouvez pas faire cela avec un simple GROUP BY, car le regroupement détruit les lignes individuelles.

La bonne réponse est une fonction de fenêtrage (SUM(amount) OVER (PARTITION BY region)) ou une jointure avec une sous-requête regroupée. Comprendre que GROUP BY n'est pas le bon outil ici est précisément l'objectif de la question.

-- Detail rows kept, region total added per row
SELECT order_id, region, amount,
       SUM(amount) OVER (PARTITION BY region) AS region_total
FROM sales;

GROUP BY et alias de SELECT

Pouvez-vous utiliser un alias défini dans SELECT pour GROUP BY ? Cela dépend du dialecte, et c'est précisément cette incohérence que les recruteurs cherchent à sonder.

  • MySQL et Postgres : autorisent le regroupement selon un alias de SELECT.
  • SQL Server et Oracle : ne l'autorisent pas ; vous devez répéter l'expression complète.

La réponse portable consiste à répéter l'expression dans GROUP BY, ce qui fonctionne partout.

-- Portable: repeat the expression rather than the alias
SELECT EXTRACT(YEAR FROM order_date) AS yr, COUNT(*)
FROM sales
GROUP BY EXTRACT(YEAR FROM order_date);

DISTINCT ou GROUP BY pour l'unicité

Si vous voulez uniquement des combinaisons distinctes et aucun agrégat, GROUP BY sans agrégat se comporte comme DISTINCT. Les recruteurs peuvent vous demander laquelle des deux formulations est la plus claire.

Utilisez DISTINCT pour exprimer votre intention (« je veux des lignes uniques »). Réservez GROUP BY aux cas où vous calculez également des agrégats. Le résultat est identique, mais le signal de lisibilité est différent.

-- These return the same rows
SELECT DISTINCT department, role FROM employees;
SELECT department, role FROM employees GROUP BY department, role;

Comment le formuler lors de l'entretien

Lorsque vous rencontrez une question sur GROUP BY, énoncez la règle à voix haute : « Chaque colonne sélectionnée est soit une clé de regroupement, soit enveloppée dans un agrégat, car le regroupement laisse une ligne par clé. »

Indiquez ensuite votre clé de regroupement et vos mesures, puis vérifiez qu'aucune colonne ne reste non regroupée. Cette réponse structurée témoigne d'une maîtrise de niveau intermédiaire avant même que vous n'écriviez la requête.

Vérification rapide

Vérifiez votre compréhension de la règle fondamentale de GROUP BY.

Récapitulatif

La règle : chaque colonne de SELECT est une clé de regroupement ou un agrégat. Pourquoi : GROUP BY laisse une ligne par clé, donc les colonnes brutes non regroupées sont ambiguës.

  • Corrigez les violations en regroupant la colonne ou en l'agrégeant.
  • L'ancien comportement de MySQL renvoyait des valeurs arbitraires ; ONLY_FULL_GROUP_BY impose le respect de la norme.
  • La dépendance fonctionnelle liée à la clé primaire est l'unique exception légale.
  • Pour conserver les lignes détaillées à côté des totaux de groupe, utilisez des fonctions de fenêtrage plutôt que GROUP BY.

Questions Fréquemment Posées

La leçon « La règle GROUP BY pour les colonnes SELECT » est-elle gratuite ?

Oui — le texte complet de « La règle GROUP BY pour les colonnes SELECT » 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 « La règle GROUP BY pour les colonnes SELECT » ?

Pourquoi chaque colonne non agrégée doit apparaître dans GROUP BY et ce qu’implique le mode only-full-group-by 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 « La règle GROUP BY pour les colonnes SELECT » ?

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. La règle GROUP BY pour les colonnes SELECT
  2. HAVING ou WHERE
  3. Regrouper selon plusieurs colonnes et expressions
  4. Compter et filtrer les groupes
← Retour à SQL Interview Prep