Това е правилото от SQL стандарта (който е доста сложен, защото навлиза в много подробности, за които потребителите на SQL вероятно не се замислят).
Зад правилото стоят два принципа. Първият е, че стандартът не налага подреждане на операциите, освен когато е логически необходимо (having клауза, например, трябва да се обработва логически след group by ). Това е основата на идеята, че SQL е описателен език, където са описани резултатите. Всеки конкретен двигател на базата данни може да определи свои собствени пътища за изпълнение.
Вторият принцип е избягване на двусмислието. Тук се намесват правилата за обхват, които определят какво знае кога SQL компилаторът.
Разгледайте следното твърдение:
select a as b, b as a, a + 1 as d
-----------------------^
from t
Въпросът е:кой a прави a+1 препраща към колоната a в таблицата или колоната b (който е псевдоним като a ) в select . Според стандарта това е недвусмислено. Псевдонимите на колони не са известни в select клауза, където са дефинирани.
Това се простира до where клауза, която се оценява в същия обхват. Помислете за същия пример:
select a as b, b as a, a + 1 as d
from t
where a > 100
Кой a прави where състояние се отнася? Стандартът е недвусмислен. where клаузата не разбира псевдоними на колони в select . Това е така, защото select (логически) се оценява след where . Така че, когато кажете:
select row_number() over (order by a) as seqnum
from t
where a > 100
Върнатата стойност започва с първия a след 100. Изброяването не се извършва първо, като филтрираните редове получават поредни номера, които се филтрират.