Důvod, proč nemůžete použít SUM()
v WHERE
klauzule je pořadí hodnocení klauzulí.
FROM
vám řekne, odkud číst řádky. Při čtení řádků z disku do paměti se kontroluje, zda se v nich nachází WHERE
podmínky. (Ve skutečnosti v mnoha případech řádky, které nevyhovují WHERE
klauzule nebude ani načtena z disku. „Podmínky“ jsou formálně známé jako predikáty a některé predikáty se používají – motorem pro provádění dotazů – k rozhodování o tom, které řádky budou čteny ze základních tabulek. Ty se nazývají přístup predikáty.) Jak vidíte, WHERE
klauzule se aplikuje na každý řádek tak, jak je prezentován motoru.
Na druhou stranu se agregace provádí až po přečtení všech řádků (které ověřují všechny predikáty).
Zamyslete se nad tímto:SUM()
platí POUZE pro řádky, které splňují WHERE
podmínky. Pokud vložíte SUM()
v WHERE
klauzule, žádáte o kruhovou logiku. Přejde nový řádek přes WHERE
doložka? Jak bych mohl vědět? Pokud to projde, musím to zahrnout do SUM
, ale pokud ne, neměl by být zahrnut do SUM
. Jak tedy vůbec vyhodnotím SUM
stavu?