PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Logical Processing Order o SQL Standard nella clausola WHERE

È 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.