Saltar al contenido

¿Por qué no se permiten funciones agregadas en la cláusula where?

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *