Pesquisar este blog

sexta-feira, 22 de janeiro de 2010

Desafio SQL: Alias em SQL

Ola, vou iniciar este post com uma questão para resolvermos.
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