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.
Muito legal, você tem alguma referência que documente essa ordem de execução para outros casos?
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
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
Acredito que não, Pois haverá conflito de sequencia da leitura do ordem by com o select
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.