Причината, поради която не можете да използвате SUM()
в WHERE
клауза е реда на оценка на клаузите.
FROM
ви казва откъде да четете редове. Точно когато редовете се четат от диск в памет, те се проверяват за WHERE
условия. (Всъщност в много случаи редове, които не отговарят на WHERE
клаузата дори няма да бъде прочетена от диск. „Условията“ са официално известни като предикати и някои предикати се използват - от машината за изпълнение на заявка - за да се реши кои редове се четат от базовите таблици. Те се наричат достъп предикати.) Както можете да видите, WHERE
Клаузата се прилага към всеки ред, както е представена на двигателя.
От друга страна, агрегирането се извършва само след като всички редове (които проверяват всички предикати) са прочетени.
Помислете за това:SUM()
се прилага САМО за редовете, които отговарят на WHERE
условия. Ако поставите SUM()
в WHERE
клауза, вие искате кръгова логика. Нов ред предава ли WHERE
клауза? Как може да знам? Ако ще мине, тогава трябва да го включа в SUM
, но ако не, не трябва да се включва в SUM
. И така, как да оценя SUM
състояние?