Necesitamos tu ayuda para difundir nuestras secciones en referencia a las ciencias informáticas.
Solución:
La razón por la que no puedes usar SUM()
en el WHERE
cláusula es el orden de evaluación de las cláusulas.
FROM
le dice de dónde leer las filas. Justo cuando las filas se leen del disco a la memoria, se verifican en busca de la WHERE
condiciones (En realidad en muchos casos filas que fallan el WHERE
la cláusula ni siquiera se leerá del disco. Las “condiciones” se conocen formalmente como predicados y el motor de ejecución de consultas utiliza algunos predicados para decidir qué filas se leen de las tablas base. Estos se llaman acceso predicados.) Como puede ver, el WHERE
La cláusula se aplica a cada fila a medida que se presenta al motor.
Por otro lado, la agregación se realiza solo después de que se hayan leído todas las filas (que verifican todos los predicados).
Piensa sobre esto: SUM()
aplica SOLAMENTE a las filas que satisfacen los WHERE
condiciones Si pones SUM()
en el WHERE
cláusula, está pidiendo lógica circular. ¿Una nueva fila pasa el WHERE
¿cláusula? ¿Cómo puedo saber? Si pasa, entonces debo incluirlo en el SUM
pero si no, no debe incluirse en el SUM
. Entonces, ¿cómo evalúo el SUM
¿condición?
¿Por qué podemos usar la función agregada en la cláusula where?
Las funciones agregadas trabajan en conjuntos de datos. A WHERE
la cláusula no tiene acceso a todo el conjunto, sino solo a la fila en la que está trabajando actualmente.
Por supuesto, puede usar la cláusula HAVING:
select name from employee
group by name having sum(salary) > 1000;
Si debes usar WHERE
puede utilizar una subconsulta:
select name from (
select name, sum(salary) total_salary from employee
group by name
) t where total_salary > 1000;
sum()
es una función de agregación. En general, esperaría que funcionara con group by
. Por lo tanto, a su primera consulta le falta un group by
. en un group by
consulta, having
se utiliza para filtrar después la agregación:
Select name
from employee
group by name
having sum(salary) > 1000 ;