Considere a seguinte questão:
SQL>
1 select id "Produto ID", sum(preco) "Preco"
2 from estoque
3 where Preco > 50
4 group by "Produto ID"
5* order by sum(preco)
Qual linha causa um erro ?
Analisando a questão, pode-se perceber várias partes que podem dar a entender estar errado. Olhando o SQL, vemos que os campos utilizam-se de alíases, e o campo preco tem um alias semelhante ao nome do campo: "Preco". Isso pode passar despercebido ou confundir, fazendo alguém pensar que a linha 3 está errado, pois o alias está sendo referênciado.
Então a primeira regra que temos que saber: na cláusula WHERE, devemos referênciar o campo e não o alias, senão um erro ocorre.
Na consulta acima, agora não resta dúvida, estamos acessando o campo preco, pois SQL é case insensitive, não importa como escrevemos: preco, Preco, PRECO, PReco, etc. Com isso, podemos concluir também que, se fizermos uma prova para certificação em SQL e aparecer um alias na cláusula WHERE, é certo que há um erro ai.
Para não restar dúvida, segue um SQL de exemplo:
SQL> select codigo "Codigo" from estoque 2 where "Codigo" <> 0; where "Codigo" <> 0 * ERRO na linha 2: ORA-00904: "Codigo": identificador invßlido
Seguindo o exercício da questão, alguns podem dizer que a linha 4 está errado. E de fato, está. A mesma regra do WHERE vale no GROUP BY, na cláusula WHERE e GROUP BY, devemos referênciar o campo e não o alias, senão um erro ocorre.
Segue dois exemplos, o primeiro SQL referenciou um alias no group by e o segundo o próprio campo:
EXEMPLO 1: SQL> 1 select codigo as num 2 from estoque 3* group by num SQL> / group by num * ERRO na linha 3: ORA-00904: "NUM": identificador invßlido EXEMPLO 2: SQL> 1 select codigo as num 2 from estoque 3* group by codigo SQL> / NUM ------------- 1255 124 126 125
Bom, sabemos que o erro na questão está na linha 4, onde é referênciado o alias "Produto ID". Mas quero mostrar outra regra, que nesta questão não se aplica, mas que devemos saber mesmo assim:
Na cláusula ORDER BY, podemos acessar tanto o campo, como o alias ou um número que indica a posição do campo na cláusula SELECT.
Isso pode confundir muitos, pois porque não podemos acessar o alias no WHERE e no GROUP BY mas podemos acessar no ORDER BY. E ainda, podemos acessar o campo pela sua posição na lista de campos do SELECT.
Isso mesmo, segue vários exemplos que mostram isso na prática:
EXEMPLO 1: SQL> 1 select codigo as num 2 from estoque 3* order by codigo SQL> / NUM ------------- 124 124 124 125 125 125 1255 126 8 linhas selecionadas. EXEMPLO 2: SQL> 1 select codigo as num 2 from estoque 3* order by num SQL> / NUM ------------- 124 124 124 125 125 125 1255 126 8 linhas selecionadas. EXEMPLO 3: SQL> 1 select codigo as num 2 from estoque 3* order by 1 SQL> / NUM ------------- 124 124 124 125 125 125 1255 126 8 linhas selecionadas. SQL>
Então como vemos, o ORDER BY é a cláusula mais flexivel de todas, podemos acessar os campos da consulta de qualquer maneira e vai funcionar. A cláusula ORDER BY tem como finalidade ordenar as tuplas de uma relação, portanto, ela é a última etapa executada e consegue ver a relação pronta, ao contrário das demais cláusulas.
Mais uma vez, espero ter ajudado a comunidade de desenvolvedores, sempre tive muita dúvida a respeito disso, até que resolvi escrever este post e testar de diversas maneiras, vários SQL e terminar de uma vez por todas, estas dúvidas sobre o uso do alias em consultas SQL.
Até o próximo post!
Nenhum comentário:
Postar um comentário