Het is de regel uit de SQL-standaard (die nogal ingewikkeld is omdat hij ingaat op veel details waar gebruikers van SQL waarschijnlijk niet aan denken).
Er zijn twee principes achter de regel. De eerste is dat de standaard geen volgorde van bewerkingen oplegt, behalve wanneer dit logisch noodzakelijk is (een having
clausule moet bijvoorbeeld logisch worden verwerkt na een group by
). Dit is de basis van het idee bij SQL is een beschrijvend taal, waar de resultaten worden beschreven. Elke specifieke database-engine kan zijn eigen uitvoeringspaden bepalen.
Het tweede principe is om dubbelzinnigheid te vermijden. Dit is waar scopingregels binnenkomen, die bepalen wat een SQL-compiler wanneer weet.
Overweeg de volgende uitspraak:
select a as b, b as a, a + 1 as d
-----------------------^
from t
De vraag is:welke a
doet a+1
verwijzen naar de kolom a
in de tabel of de kolom b
(die een alias is als a
) in de select
. Volgens de norm is dit eenduidig. Kolomaliassen zijn niet bekend in de select
clausule waar ze zijn gedefinieerd.
Dit strekt zich uit tot de where
clausule ook, die wordt geëvalueerd in dezelfde reikwijdte. Beschouw hetzelfde voorbeeld:
select a as b, b as a, a + 1 as d
from t
where a > 100
Welke a
doet de where
toestand verwijzen naar? De norm is eenduidig. De where
clausule begrijpt geen kolomaliassen in de select
. Dit komt omdat de select
wordt (logisch) geëvalueerd na de where
. Dus, als je zegt:
select row_number() over (order by a) as seqnum
from t
where a > 100
De geretourneerde waarde begint met de eerste a
na 100. De opsomming gebeurt niet eerst, waarbij gefilterde rijen volgnummers krijgen die eruit worden gefilterd.