Las funciones de agregación no pueden aparecer en el where

Es habitual encontrarse consultas como la siguiente: hallar los artículos con el precio más bajo de entre los contenidos en una tabla. Para resolverla podríamos tener la tentación de ejecutar un select SQL, que incluye funciones de agregación en el where, y, por tanto, es incorrecta:

MAL
select *
from Articulo
where price = min(price);

Las funciones de agregación (sum, avg, count...) no se pueden usar en el where. No se pueden usar ahí porque es demasiado pronto para ello. Para entenderlo hay que recordar el orden de ejecución de las partes de una consulta SQL:

  1. Se ejecuta el from (y sus posibles join), para partir de las tablas con los datos necesarios.
  2. Se ejecuta el where, para quedarnos con las tuplas que nos interesan.
  3. Se ejecuta el group by, para hacer los grupos de tuplas de acuerdo a las expresiones de agrupación especificadas.
  4. Una vez hechos los grupos, ya se pueden calcular las funciones de agregación sobre esos grupos.
  5. Se ejecuta el having para seleccionar los grupos que cumplan una condición, que puede incluir funciones de agrupación.
  6. Se ejecuta el select para mostrar los datos indicados, entre los que pueden incluirse funciones de agrupación
  7. ... 

Ya no es necesario seguir enumerando fases de la consulta porque queda claro lo que decíamos: las funciones de agregación se calculan después de crear los grupos (group by), en el paso 4. El where se ejecuta en el paso 2, antes del cálculo de las funciones de agregación, por lo que es imposible que en el where se puedan incluir funciones de agregación.

Solo por completar la lección, recordaremos cómo resolver la consulta que enunciábamos. Para ello es necesario una subconsulta que, por separado calcule el precio mínimo de los artículos. Con ese valor calculado podemos usarlo en condición del where para seleccionar las tuplas que tengan ese valor de price:

BIEN
select *
from Articulo
where price = ( select min(price) from Articulo );

No hay comentarios:

Publicar un comentario