SQL Escrita X SQL Execução Lógica

Nesse post tenho como objetivo abordar a diferença entre a sintaxe escrita de uma query SQL e como o SGBD entende e interpreta logicamente a mesma query.

Exemplo da SINTAXE de uma query

SINTAXE

SELECT colunas
FROM tabela
WHERE condições
GROUP BY colunas
ORDER BY colunas

Como o SGBD interpreta a mesma query

EXECUÇÃO DO SGBD

FROM tabela
WHERE condição
GROUP BY colunas
select colunas
order by colunas

Vamos exemplificar um select hipotético.

SINTAXE


SELECT NOME_DO_CLIENTE, TELEFONE, ENDERECO 
FROM CLIENTE 
ORDER BY ID;

EXECUÇÃO DO SGBD

FROM CLIENTE
SELECT NOME_DO_CLIENTE, TELEFONE, ENDERECO
ORDER BY ID;

Considerando uma query mais completa:

SINTAXE

SELECT colunas
FROM tabela
JOIN tabela2
WHERE condições
GROUP BY colunas
HAVING filtro com funções agregadas  + condições
ORDER BY colunas

EXECUÇÃO DO SGBD

FROM tabela
JOIN tabela2
WHERE condições
GROUP BY colunas
HAVING filtro com funções agregadas  + condições
SELECT colunas
ORDER BY colunas

É isso.. um pouco sobre o assunto..Abraços!

Deixo agora a seguinte query

SELECT SEXO AS SEXO_M_F_O, IDADE, COUNT(ID) AS QT_POR_SEXO
FROM CLIENTE
WHERE IDADE >= 18
GROUP BY SEXO_M_F_O, IDADE
ORDER BY IDADE DESC

Como uma questão para Vocês me dizer se a query vai funcionar(rodar) ou não?

Referências: https://oracle.readthedocs.io/en/latest/sql/basics/query-processing-order.html

https://qxf2.com/blog/mysql-query-execution/

https://community.oracle.com/tech/developers/discussion/1558084/select-query-execution-steps-order

Creio que sim, from cliente (irá pegar da tabela), where idade >= 18 (filtrar), group by sexo_m_f_o (agrupar clientes que tem mesma idade e sexo), select sexo as sexo_m_f_o, idade, count(id) as qt_por_sexo o select trará os dados alem de mostrar quantas pessoas tem a mesma caracteristica, e por ultimo ordernar de forma descrescente. Pela ordem de excução não vi nada que interfira na execução.

O GROUP BY, não consegue definir/saber o alias (apelido) definido dentro da cláusula SELECT.

Muito legal, você tem alguma referência que documente essa ordem de execução para outros casos?

Obrigado raulpy271, tenho sim. Referências: https://oracle.readthedocs.io/en/latest/sql/basics/query-processing-order.html https://qxf2.com/blog/mysql-query-execution/ https://community.oracle.com/tech/developers/discussion/1558084/select-query-execution-steps-order Acrescentei no post também para ficar melhor.
Que legal que considerou meu comentário, vou usar as referências.

Não roda, já que se colocar o apelido de uma coluna no order by ele vai dar pau porque o sistema ainda não leu o select para saber que coluna é aquela

Bom dia Cinder, na verdade no order by ele vai rodar, pois o select ja vai ter sido executado, mas no group by não, pois tem a ordem de execução primeiro GROUP, SELECT E DEPOIS ORDER, então antes do select nenhum campo roda com apelido, exemplo o group, porem depois do select ja roda, por exemplo o order

Muito obrigado pela publicação...

Agora sobre a query que você deixou no final:

Não podemos usar o apelido dado a coluna no select pois na ordem de execução o group by vem primeiro pro SGDB, então ele não consegue identificar a coluna

GROUP BY SEXO_M_F_O, IDADE

O certo seria

GROUP BY SEXO, IDADE

Boa tarde, creio eu que não vai rodar pois a coluna SEXO está com "apelido", e como vemos que a ordem de execução do sgbd é executado primeiro o group by e depois o select(QUE É O RESPONSAVEL PELO APELIDO) pois esse motivo ele não rodara

Acredito que não, Pois haverá conflito de sequencia da leitura do ordem by com o select

Oi VitorHugo123, não entendi qual o conflito que pode acontecer com o order by e o select.. Poderia específicar melhor essa situação?

Não. Pois o GROUP BY deve ser referenciado pela coluna referência no caso SEXO e não SEXO_M_F_O, ao colocar o apelido no GROUP BY o mesmo não funcionará. Caso o contratio funcionária Normalmente.