Executando verificação de segurança...
6

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

Carregando publicação patrocinada...
2

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.

2
1
1

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

1

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

1

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
1

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

1
1

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?

1

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.