La raison pour laquelle vous ne pouvez pas utiliser SUM()
dans le WHERE
clause est l'ordre d'évaluation des clauses.
FROM
vous indique d'où lire les lignes. Dès que les lignes sont lues du disque à la mémoire, elles sont vérifiées pour le WHERE
conditions. (En fait, dans de nombreux cas, les lignes qui échouent le WHERE
clause ne sera même pas lue à partir du disque. Les "conditions" sont officiellement connues sous le nom de prédicats et certains prédicats sont utilisés - par le moteur d'exécution des requêtes - pour décider quelles lignes sont lues à partir des tables de base. Ceux-ci sont appelés accès prédicats.) Comme vous pouvez le voir, le WHERE
La clause est appliquée à chaque ligne telle qu'elle est présentée au moteur.
D'autre part, l'agrégation n'est effectuée qu'après que toutes les lignes (qui vérifient tous les prédicats) ont été lues.
Pensez-y :SUM()
s'applique UNIQUEMENT aux lignes qui satisfont le WHERE
conditions. Si vous mettez SUM()
dans le WHERE
clause, vous demandez une logique circulaire. Est-ce qu'une nouvelle ligne passe le WHERE
clause? Comment pourrais-je savoir? Si cela passe, je dois l'inclure dans le SUM
, mais sinon, il ne doit pas être inclus dans le SUM
. Alors, comment puis-je même évaluer le SUM
état ?