Agregaciones sin GROUP BY
Descubra cómo una agregación independiente convierte una tabla completa en una sola fila
Agregaciones sin GROUP BY es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 4 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.
Una función de agregación, una fila
Los entrevistadores evalúan una idea fundamental con esta pregunta: «¿Qué ocurre cuando se utiliza una función de agregación sin GROUP BY?»
La respuesta es que toda la tabla se reduce a una sola fila. La función de agregación trata todas las filas que cumplen los criterios como un único grupo implícito. Comprender este modelo de «grupo implícito» explica muchas reglas posteriores, así que vamos a desarrollarlo con cuidado.
El único grupo implícito
Cuando escribe una función de agregación aislada sin GROUP BY, SQL se comporta como si existiera un grupo que contuviera todas las filas. El resultado siempre tiene exactamente una fila, independientemente de cuántas filas tenga la tabla, incluso si la tabla está vacía.
Por tanto, SELECT COUNT(*) FROM employees devuelve una fila con un número que resume toda la tabla.
SELECT COUNT(*) AS total_employees
FROM employees;
-- always returns exactly one rowVarias funciones de agregación juntas
Puede incluir varias funciones de agregación en un mismo SELECT. Todas resumen el mismo grupo implícito, por lo que sigue obteniendo exactamente una fila con varias columnas.
Esta es la consulta estándar para «dame las estadísticas resumidas». Los cuatro números describen el mismo conjunto completo de filas.
SELECT
COUNT(*) AS num_rows,
SUM(salary) AS total_pay,
AVG(salary) AS avg_pay,
MAX(salary) AS top_pay
FROM employees;El error al mezclar columnas
Esta es la regla que más se evalúa. No puede combinar una función de agregación aislada con una columna no agregada en el mismo SELECT sin GROUP BY.
¿Por qué? La función de agregación produce una fila, pero una columna normal tiene muchos valores: ¿cuál debería mostrar? Es ambiguo, por lo que SQL estándar genera un error.
-- ERROR: name is not aggregated and there is no GROUP BY
SELECT name, MAX(salary)
FROM employees;Por qué es ambiguo
Considérelo con nuestra tabla. MAX(salary) reduce todas las filas a un único valor. Sin embargo, name tiene un valor diferente en cada fila. La única fila de resumen no puede contener cinco nombres en una sola celda.
La base de datos se niega a adivinar. Este es el mismo principio en el que se basa la regla de GROUP BY: toda columna seleccionada debe estar agregada o formar parte del grupo. Sin GROUP BY, solo se permiten funciones de agregación.
La excepción permisiva de MySQL
Conviene mencionar un matiz de los dialectos: las versiones antiguas de MySQL o aquellas que no estaban en modo estricto permitían la consulta con columnas mezcladas y devolvían un nombre arbitrario, que no tenía por qué ser el de la persona con el salario más alto.
Las versiones modernas de MySQL con ONLY_FULL_GROUP_BY habilitado (la configuración predeterminada actual) la rechazan, como los demás sistemas. Mencionar esto demuestra que conoce las diferencias entre dialectos, pero considere siempre incorrecta la consulta con columnas mezcladas.
Obtener la fila correspondiente al máximo
Entonces, ¿cómo obtiene el nombre de la persona con el salario más alto? No mezclando columnas. Utilice ORDER BY + LIMIT, o una subconsulta que compare con la función de agregación.
La versión con ORDER BY/LIMIT es la más sencilla. La versión con subconsulta se generaliza muy bien y devuelve a todas las personas empatadas con el valor máximo.
-- Subquery: returns everyone earning the max
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);Funciones de agregación sobre una tabla vacía
Este es un caso límite que los entrevistadores suelen plantear: «¿Qué devuelve una función de agregación aislada sobre una tabla vacía?»
COUNT(*)devuelve 0 (una fila con el valor 0).SUM,AVG,MINyMAXdevuelven NULL (una fila con valor NULL).
Lo importante es que sigue obteniendo una fila, nunca cero filas. Esta garantía de una sola fila es precisamente el objetivo de una función de agregación sin 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=NULLNo se permiten funciones de agregación en WHERE
Otra regla que se deduce de este modelo es que no puede incluir una función de agregación en una cláusula WHERE, porque WHERE filtra las filas individuales antes de que se realice la agregación.
Para filtrar por el resultado de una función de agregación, utilice HAVING (con agrupación) o incluya la función de agregación en una subconsulta. WHERE se ejecuta demasiado pronto en el orden de ejecución como para ver el resultado de la agregación.
-- 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);Función de agregación aislada frente a GROUP BY
Formule la diferencia de esta manera:
- Sin GROUP BY: un grupo implícito = toda la tabla = exactamente una fila de resultado.
- Con GROUP BY col: un grupo por cada valor distinto de col = una fila por grupo.
Una función de agregación aislada equivale a GROUP BY con cero columnas de agrupación. Es el mismo mecanismo, con un único grupo grande.
-- Whole table: one row
SELECT AVG(salary) FROM employees;
-- Per department: one row each
SELECT department, AVG(salary)
FROM employees
GROUP BY department;Cómo explicarlo
Una respuesta clara sería: «Una función de agregación sin GROUP BY trata todo el conjunto de resultados como un único grupo implícito y devuelve exactamente una fila de resumen, incluso con una tabla vacía. No se puede seleccionar junto a ella una columna no agregada porque ese valor sería ambiguo. Para obtener la fila correspondiente a un MAX o MIN, utilizaría ORDER BY con LIMIT o una subconsulta que compare con la función de agregación».
Comprobación rápida
Prediga la forma del resultado.
Resumen
En resumen, las funciones de agregación sin GROUP BY:
- Toda la tabla se convierte en un grupo implícito → exactamente una fila de resultado.
- No puede combinar una función de agregación aislada con una columna no agregada.
- Tabla vacía:
COUNT(*)= 0; las demás devuelven NULL, pero sigue habiendo una fila. - Las funciones de agregación no pueden aparecer en
WHERE; utilice una subconsulta oHAVING. - Para obtener la fila correspondiente a MIN/MAX, utilice ORDER BY + LIMIT o una subconsulta.
Con esto concluyen los ejercicios de entrevista sobre funciones de agregación.
Preguntas frecuentes
¿La lección «Agregaciones sin GROUP BY» es gratis?
Sí — el texto completo de «Agregaciones sin GROUP BY» 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 «Agregaciones sin GROUP BY»?
Descubra cómo una agregación independiente convierte una tabla completa en una sola fila 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 4 de 4.
¿Cuánto tiempo toma la lección «Agregaciones sin GROUP BY»?
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
- COUNT(*) frente a COUNT(column) frente a COUNT(DISTINCT)
- SUM y AVG con valores NULL
- MIN, MAX y agregación no numérica
- Agregaciones sin GROUP BY