Publicidade

Precedência das cláusulas SQL

7/20/2012 10:48:00 AM Rafael Rodrigues 0 Comments


Bom pessoal,

A algum tempo atrás precisei ajudar um colega meu do trabalho a fazer uma Query em que ele precisava, por algum motivo, primeiro utilizar a cláusula ORDER BY e depois a WHERE. Quando um comando SQL está em execução temos que obedecer as regras de precedência, que no caso do exemplo do meu colega de trabalho está "errado", pois a ordem de precedência é essa:
  1. Cláusula FROM 
  2. Cláusula WHERE 
  3. Cláusula GROUP BY 
  4. Cláusula HAVING 
  5. Cláusula SELECT 
  6. Cláusula ORDER BY
Pesquisando aqui, encontrei algumas dicas interessantes para três dessas clausulas:

Cláusula FROM

Como esta é a primeira cláusula a rodar, torna-se bem interessante restringir a entrada de dados e o volume a ser processado aqui.
Uma dica valiosa…
Faça relacionamentos usando, como no exemplo:


SELECT * FROM tabela1 INNER JOIN tabela2 ON (tabela1.id=tabela2.id AND tabela2.tipo=5)

Explicando… Estou pegando dados relacionados da tabela1 e da tabela2 pelo campo id das duas e impondo que só preciso dos dados da tabela que tenha tabela2.tipo=5… Com isso, os outros tipos, sejam lá quais forem, não terão a entrada nos dados válidos para a consulta. Mais ainda… Se a tabela1 e tabela2 formariam, por exemplo, 49000 registros, separados pelo tipo 5, isso ficaria em 780 registros dos 49000 registros totais, por exemplo, apenas os 780 registros serão dados como entrada pela cláusula FROM desta query. O meu espaço amostral restringiu bastante.

Cláusula WHERE

Como a cláusula WHERE é a segunda a rodar na consulta, podemos enfrentar problemas de não ter disponível algo porque a precedência não foi obedecida.

Exemplo:
SELECT marcas AS VEICULO não me permitirá utilizar na cláusula WHERE, o alias VEICULO, porque VEICULO não foi formado ainda porque o SELECT ainda não rodou…

Na WHERE, procure colocar os dados mais acertivos da análise, depois de tê-los restringidos no FROM.

Cláusula ORDER BY

Agora é a confusão geral… Os dados das colunas do SELECT não estão disponíveis na cláusula WHERE, mas eles estão disponíveis na cláusula ORDER BY!!!

Como SELECT é executada antes de ORDER BY, os dados do SELECT estarão disponíveis quando for executado o ORDER BY.

É isso...

0 comentários: