PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Ordem de processamento lógico ou padrão SQL na cláusula WHERE


É a regra do padrão SQL (que é bastante complicada porque entra em muitos detalhes que os usuários do SQL provavelmente não pensam).

Existem dois princípios por trás da regra. A primeira é que o padrão não impõe uma ordenação de operações, exceto quando logicamente necessário (um having cláusula, por exemplo, deve ser processada logicamente após um group by ). Esta é a base da noção em SQL é um descritivo linguagem, onde os resultados são descritos. Qualquer mecanismo de banco de dados específico pode determinar seus próprios caminhos de execução.

O segundo princípio é evitar a ambiguidade. É aqui que entram as regras de escopo, que definem o que um compilador SQL sabe quando.

Considere a seguinte afirmação:
select a as b, b as a, a + 1 as d
-----------------------^
from t

A questão é:qual a faz a+1 consulte, a coluna a na tabela ou na coluna b (que é alias como a ) em select . De acordo com o padrão, isso é inequívoco. Os aliases de coluna não são conhecidos no select cláusula onde eles são definidos.

Isso se estende ao where cláusula também, que é avaliada no mesmo escopo. Considere o mesmo exemplo:
select a as b, b as a, a + 1 as d
from t
where a > 100

Qual a faz o where condição se refere? O padrão é inequívoco. O where cláusula não entende aliases de coluna no select . Isso ocorre porque o select é (logicamente) avaliado após o where . Então, quando você diz:
select row_number() over (order by a) as seqnum
from t
where a > 100

O valor retornado começa com o primeiro a depois 100. A enumeração não ocorre primeiro, com as linhas filtradas obtendo números de sequência que são filtrados.