È la regola dello standard SQL (che è piuttosto complicata perché entra in molti dettagli a cui gli utenti di SQL probabilmente non pensano).
Ci sono due principi dietro la regola. La prima è che lo standard non impone un ordinamento delle operazioni, tranne quando logicamente necessario (un having
la clausola, ad esempio, deve essere elaborata logicamente dopo un group by
). Questa è la base della nozione in SQL è un descrittivo lingua, dove sono descritti i risultati. Qualsiasi particolare motore di database può determinare i propri percorsi di esecuzione.
Il secondo principio è evitare l'ambiguità. È qui che entrano in gioco le regole di scoping, che definiscono cosa sa quando un compilatore SQL.
Considera la seguente affermazione:
select a as b, b as a, a + 1 as d
-----------------------^
from t
La domanda è:quale a
fa a+1
fare riferimento alla colonna a
nella tabella o nella colonna b
(che è alias come a
) nel select
. Secondo lo standard questo è inequivocabile. Gli alias di colonna non sono noti in select
clausola in cui sono definiti.
Questo si estende a where
anche la clausola, che viene valutata nello stesso ambito. Considera lo stesso esempio:
select a as b, b as a, a + 1 as d
from t
where a > 100
Quale a
fa il where
condizione fare riferimento? Lo standard è inequivocabile. Il where
La clausola non comprende gli alias di colonna in select
. Questo perché select
viene (logicamente) valutato dopo where
. Quindi, quando dici:
select row_number() over (order by a) as seqnum
from t
where a > 100
Il valore restituito inizia con il primo a
dopo 100. L'enumerazione non avviene prima, con le righe filtrate che ottengono numeri di sequenza che vengono filtrati.