Mysql
 sql >> Database >  >> RDS >> Mysql

Equivalente di GroupBy e clausola Have in Algebra Relazionale

Notando che vuoi ottenere la somma dello stipendio, in Tutorial D :

SUMMARIZE emp BY { job } ADD ( SUM ( sal ) AS total_sal )

L'aggregazione delle note non è un operatore relazionale, quindi non farà parte di un'algebra relazionale.

Come per HAVING , è un'anomalia storica. Prima dello standard SQL-92, non era possibile scrivere SELECT espressioni nel FROM clausola (aka tabelle derivate) cioè dovevi fare tutto il lavoro in un unico SELECT espressione. A causa del rigido ordine di valutazione di SQL, il valore aggregato non viene visualizzato dopo WHERE è stata valutata la clausola, ovvero non è stato possibile applicare la restrizione sulla base di valori aggregati. HAVING è stato introdotto per affrontare questo problema.

Ma anche con HAVING , SQL è rimasto relazionalmente incompleto per quanto riguarda Codd fino a quando non sono state introdotte tabelle derivate. Tabelle derivate renderizzate HAVING ridondante ma utilizzando HAVING è ancora popolare (se Stackoverflow è qualcosa su cui basarsi):alla gente piace ancora usare un singolo SELECT ove possibile e la suddetta rigidità di SQL per quanto riguarda l'ordine delle valutazioni (la proiezione viene eseguita per ultima in un SELECT expression) rende l'utilizzo della tabella derivata piuttosto dettagliato rispetto a HAVING .