Estaba haciendo una tarea en la que tuve que convertir las consultas SQL en consultas de Algebra Relacional. Me quedé atrapado en la conversión del group by
cláusula.
¿Podría alguien decirme cómo se puede escribir la cláusula group by en álgebra relacional?
p.ej:
SELECT job, sal FROM emp GROUP BY job ;
¡Gracias!
En primer lugar, su consulta es incorrecta; no puede seleccionar algo que no haya agrupado a less que use la agregación. Supongo que quieres get la sum de la sal.
trabajo F sum (sal), trabajo (emp).
Observando que desea get la sum del salario, en el Tutorial D :
SUMMARIZE emp BY { job } ADD ( SUM ( sal ) AS total_sal )
La agregación de notas no es un operador relacional, por lo tanto, no formará parte de un álgebra relacional.
En cuanto a HAVING
, ¿es una anomalía histórica? Antes del estándar SQL-92, no era posible escribir expresiones SELECT
en la cláusula FROM
(también conocidas como tablas derivadas), es decir, había que hacer todo el trabajo en una expresión SELECT
. Debido al order de evaluación rígido de SQL, el valor agregado no aparece después de que se haya evaluado la cláusula WHERE
es decir, era imposible aplicar la restricción en function de los valores agregados. HAVING
fue presentado para abordar este problema.
Pero incluso con HAVING
, SQL permaneció relacionalmente incompleto en lo que respecta a Codd hasta que se introdujeron las tablas derivadas. Las tablas derivadas HAVING
networkingundantes, pero usar HAVING
sigue siendo popular (si Stackoverflow es aceptable): parece que a las personas les gusta usar SELECT
siempre que sea posible y la rigidez antes mencionada de SQL en cuanto al order de las evaluaciones (la proyección se realiza al final en una expresión SELECT
) hace que el uso de tablas derivadas sea bastante detallado cuando se compara con HAVING
.