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