SELECT
no padrão ISO/IEC SQL prescreve a seguinte ordem sintática para as subcláusulas:
SELECT
projection-expressions
FROM
sources
WHERE
predicate-expression
GROUP BY
key-expression
HAVING
predicate-expression
ORDER BY
ordering-expressions
Enquanto a ordem lógica de execução é esta:
FROM
sources
WHERE
predicate-expression
GROUP BY
value-expression
HAVING
value-expression
SELECT
projection-expressions
ORDER BY
ordering-expressions
Para usuários iniciantes de SQL, torna-se surpreendente que uma projeção definida na SELECT
cláusula não esteja disponível nas cláusulas WHERE
ou GROUP BY
mesmo que seja declarada primeiro - dado que os programas de computador geralmente seguem a ordem de execução de cima para baixo.
Também é surpreendente que os autores de SQL sejam obrigados a repetir suas expressões em cláusulas SELECT
, WHERE
e de GROUP BY
forma redundante ou usar uma subconsulta que não se presta a uma consulta sucinta. Pelo menos quando o usuário está familiarizado com a ordem real de execução da cláusula, ele sabe por que precisa se repetir, mas isso não impede que seja frustrante.
Este problema e outros problemas relacionados estão documentados neste artigo que encontrei: https://blog.jooq.org/a-beginners-guide-to-the-true-order-of-sql-operations/ e não é surpresa que um controle de qualidade no StackOverflow tem quase 30.000 visualizações: https://stackoverflow.com/questions/3241352/using-an-alias-column-in-the-where-clause-in-postgresql
Isso me fez pensar se alguma implementação de SQL permite essa ordenação mais "lógica" de cláusulas. Observo que o Linq no .NET realmente segue essa ordem, embora eu não o descreva como sendo uma implementação SQL verdadeira, mas, de fato, no Linq o equivalente seria:
source // FROM equivalent
.Where( predicate-expression )
.GroupBy( key-expression )
.Where( predicate-expression ) // HAVING equivalent
.Select( projection-expression )
.OrderBy( ordering-expression )
(Também gosto de como o Linq permite adicionar uma Select()
projeção em qualquer lugar na sequência de comandos para que você possa usar suas expressões avaliadas sem precisar invocar expressões novamente).
Então, alguma implementação de SQL permite que você expresse consultas em uma estrutura mais lógica?
Não, o SQL é padronizado. Não há implementações muito diferentes de um padrão. Esse tipo de derrota o propósito. Sempre houve/há uma briga sobre o cálculo relacional (que o SQL finge ser) versus a abordagem de álgebra relacional. É uma velha discussão,
E, novamente do próprio Codd,
Há certamente uma tonelada de implementações para ambas as abordagens. Dito isto, o SQL como uma implementação é bastante fixo na abordagem de cálculo.
Problemas de LINQ
Esses problemas nunca desapareceram com a abordagem algébrica, por exemplo, deste blog, .
Requer otimização manual como,
Se você tiver várias relações diferentes com diferentes características de desempenho (índices, a maioria dos quais são implementados como indiretos e abstratos) e estatísticas, é difícil escrever uma lógica de conjunto procedural que funcione com eficiência.