0Pricing
SQL Interview Prep · Lección

La regla de GROUP BY para las columnas de SELECT

Descubra por qué toda columna no agregada debe aparecer en GROUP BY y conozca el modo only_full_group_by

La regla de GROUP BY para las columnas de SELECT es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.

Por qué los entrevistadores empiezan con GROUP BY

GROUP BY es donde las entrevistas distinguen a los perfiles junior de los de nivel intermedio. La regla que más suelen evaluar es la siguiente: cada columna de la lista SELECT debe estar dentro de una función de agregado o aparecer en GROUP BY.

Si incumple esta regla, el motor no puede decidir qué valor mostrar para un grupo que contiene muchas filas. Los entrevistadores plantean exactamente este error para comprobar si entiende qué es realmente un grupo.

Qué es realmente un grupo

GROUP BY convierte muchas filas en una fila por cada clave distinta. Después de agrupar, el motor ya no tiene las filas individuales. Solo tiene una fila de resumen por grupo.

  • Las columnas por las que agrupó tienen un valor claro en cada grupo.
  • Los agregados como COUNT, SUM y AVG reducen los muchos valores a uno.
  • Cualquier otra columna sin agregar es ambigua: ¿cuál de los muchos valores debería aparecer?
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

El error clásico

Este es el error que encanta a los entrevistadores. Agrupa por department, pero también selecciona name, una columna no agregada que no aparece en GROUP BY.

Cada departamento tiene muchos empleados, por lo que hay muchos nombres por grupo. El motor no puede elegir uno, así que el SQL estándar rechaza la consulta.

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

Dos formas de corregirlo

Hay dos soluciones válidas, y el entrevistador quiere comprobar que sabe que ambas producen resultados distintos:

  • Añadir la columna a GROUP BY si realmente desea una agrupación más detallada (una fila por departamento y nombre).
  • Envolverla en un agregado como MAX(name) o COUNT(name) si desea un valor por cada grupo existente.
-- Finer grouping
SELECT department, name, COUNT(*) AS rows_for_person
FROM employees
GROUP BY department, name;

ONLY_FULL_GROUP_BY en MySQL

Una trampa frecuente: las versiones antiguas de MySQL permitían seleccionar columnas que no estaban en el agrupamiento y devolvían silenciosamente un valor arbitrario del grupo. Esto producía informes incorrectos que parecían estar bien.

Las versiones modernas de MySQL activan ONLY_FULL_GROUP_BY de forma predeterminada, lo que hace cumplir la regla estándar. Postgres, SQL Server y Oracle siempre la han hecho cumplir. Si le preguntan por qué una consulta «funcionaba en el servidor antiguo, pero ahora falla», esta es la respuesta.

-- 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;

Excepción de dependencia funcional

Hay un matiz que los entrevistadores utilizan para comprobar la profundidad de sus conocimientos. Si agrupa por la clave primaria de una tabla, todas las demás columnas de esa tabla tienen una dependencia funcional de la clave, por lo que tienen exactamente un valor por grupo.

Postgres y las versiones modernas de MySQL permiten seleccionar esas columnas dependientes sin incluirlas en la lista de agrupación. La clave agrupada las determina de forma única, así que no hay ambigüedad.

-- 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;

Ejemplo resuelto: ventas por región

Suponga que debe informar del total de ventas por región. La clave de agrupación es region; la métrica es SUM(amount). Todo lo demás debe agregarse o descartarse.

Observe lo claro que resulta: una fila por región, cada una con un único valor totalizado. Esta es la estructura de todo informe de agregados.

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

Mezclar detalle y resumen

Un enunciado engañoso: «Mostrar el importe de cada pedido junto al total de su región». No puede hacerlo con un GROUP BY simple, porque la agrupación destruye las filas individuales.

La respuesta correcta es una función de ventana (SUM(amount) OVER (PARTITION BY region)) o hacer un join de vuelta con una subconsulta agrupada. El objetivo de la pregunta es reconocer que GROUP BY es la herramienta equivocada en este caso.

-- 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 y los alias de SELECT

¿Se puede usar GROUP BY con un alias definido en SELECT? Depende del dialecto, y esa inconsistencia es precisamente lo que los entrevistadores intentan evaluar.

  • MySQL y Postgres: permiten agrupar por un alias de SELECT.
  • SQL Server y Oracle: no lo permiten; debe repetir la expresión completa.

La respuesta compatible con todos los sistemas es repetir la expresión en GROUP BY, ya que funciona en cualquier dialecto.

-- 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 frente a GROUP BY para obtener valores únicos

Si solo desea combinaciones distintas y ningún agregado, GROUP BY sin agregados se comporta como DISTINCT. Los entrevistadores pueden preguntarle cuál resulta más claro.

Use DISTINCT para expresar la intención («quiero filas únicas»). Reserve GROUP BY para los casos en que también calcule agregados. El resultado es el mismo, pero la señal de legibilidad es diferente.

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

Cómo expresarlo en la entrevista

Cuando se encuentre con una pregunta sobre GROUP BY, exponga la regla en voz alta: «Cada columna seleccionada es una clave de agrupación o está envuelta en un agregado, porque la agrupación deja una fila por clave».

A continuación, indique la clave de agrupación y las métricas, y confirme que no queda nada sin agrupar. Esta respuesta estructurada transmite competencia de nivel intermedio incluso antes de escribir la consulta.

Comprobación rápida

Ponga a prueba su comprensión de la regla fundamental de GROUP BY.

Resumen

La regla: cada columna de SELECT es una clave de agrupación o una función de agregación. Por qué: GROUP BY deja una fila por clave, por lo que las columnas sin agrupar son ambiguas.

  • Corrija las infracciones agrupando la columna o aplicándole una función de agregación.
  • El comportamiento antiguo de MySQL devolvía valores arbitrarios; ONLY_FULL_GROUP_BY hace cumplir el estándar.
  • La dependencia funcional de una clave primaria es la única excepción legal.
  • Para conservar las filas detalladas junto a los totales de cada grupo, use funciones de ventana, no GROUP BY.

Preguntas frecuentes

¿La lección «La regla de GROUP BY para las columnas de SELECT» es gratis?

Sí — el texto completo de «La regla de GROUP BY para las columnas de SELECT» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «La regla de GROUP BY para las columnas de SELECT»?

Descubra por qué toda columna no agregada debe aparecer en GROUP BY y conozca el modo only_full_group_by Practicas SQL Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar SQL Interview Prep?

No se requiere experiencia previa. SQL Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «La regla de GROUP BY para las columnas de SELECT»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de SQL Interview Prep?

Sí. Cada lección de SQL Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. La regla de GROUP BY para las columnas de SELECT
  2. HAVING frente a WHERE
  3. Agrupar por varias columnas y expresiones
  4. Contar y filtrar grupos
← Volver a SQL Interview Prep