Това е правилото от 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. Изброяването не се извършва първо, като филтрираните редове получават поредни номера, които се филтрират.