TÓPICO 2 – RESTRICTING AND SORTING DATA
- Subtópico 2.1 – Limit the rows that are retrieved by a query (Limitar as linhas retornadas por uma query)
- Subtópico 2.2 – Sort the rows that are retrieved by a query (Ordenar as linhas retornadas por uma query)
- Subtópico 2.3 – Use ampersand substitution to restrict and sort output at runtime (Usar o & para restringir e ordenar a saida em tempo de execução)
Neste post, falarei um pouco sobre o segundo tópico oficial da prova de SQL Básico (1Z0-051). Um pouco já foi nos tópicos anteriores sobre algumas funcionalidades abordadas neste tópico, como ordenação das linhas, e limitação de linhas retornadas. Farei uma recapitulação destes itens e também falarei sobre o caractere “&”, que serve como substituição de variáveis em nível de execução.
Ainda usaremos as tabelas CERTIFICACAO.TAB_EMPREGADOS e CERTIFICACAO.TAB_DEPARTAMENTOS como forma de exemplificar os conceitos aqui abordados.
SUBTÓPICO 2.1 – LIMITAR AS LINHAS RETORNADAS POR UMA QUERY
Basicamente, para limitar as linhas retornadas por uma query, nós precisamos filtrar as linhas que são realmente necessárias para o nosso objetivo, seja a geração de relatórios e etc. Para isso, usamos o operador WHERE
. Exemplos:
Uma outra forma de limitar as linhas retornadas é usando a cláusula ROWNUM
. Esta cláusula faz com que minha query retorne no máximo X linhas. Ela poderia ser útil, por exemplo, para exibir apenas uma amostra da tabela (que também pode ser feito com o SAMPLE
). Exemplo:
Quando se insere uma linha em determinada tabela, o Oracle atribui um ROWNUM
a essa linha. Cada linha possui um ROWNUM
único que é atribuído a cada nova linha inserida em determinada tabela. Caso eu execute a seguinte query:
Agora, voltando a query QU01. Ela executará da seguinte forma: Serão buscadas as 10 primeiras linhas, por ordem de inserção, da tabela CERTIFICACAO.TAB_EMPREGADOS, e depois esse subgrupo de 10 linhas será ordenado. Na verdade, não é isso que quero, mas sim os 10 maiores salários entre todos os empregados. Para atingir esse objetivo, eu devo alterar a minha query, para que fique da seguinte forma:
O que eu estou fazendo acima: Primeiro eu busco todos os empregados e ordeno de forma decrescente pelo salário, para depois filtrar os 10 registros, que já estarão ordenados do jeito que eu preciso. A query mais interna, neste caso, é chamada de Inline View. Ela funciona como uma VIEW
temporária. Falaremos sobre Views em uma outra oportunidade.
SUBTÓPICO 2.2 – ORDENAR AS LINHAS RETORNADAS POR UMA QUERY
Para se ordenar as linhas retornadas por uma query, usa-se o ORDER BY
(que vocês já devem estar bem familiarizados). Tomando como exemplos, queries usadas no post anterior:
É importante mencionar que quando se usa a ordenação por nome de coluna, eu posso colocar nomes de colunas que não estão dentro da lista de colunas de meu SELECT
(mas que obviamente existem na tabela). No exemplo abaixo, eu estou ordenando pelo salário, mas reparem que não busco a coluna SALARIO:
SUBTÓPICO 2.3 – USAR O & PARA RESTRINGIR E ORDENAR A SAÍDA EM TEMPO DE EXECUÇÃO
No SQL*Plus, podemos usar o “e comercial”, ou “&” para trabalhar com variáveis e dinamicamente fornecer valores para definir filtros e colunas a serem buscadas. Abaixo é possível ver um exemplo bem simples. Para executa-lo, basta acessar o SQL*Plus
, digitando no terminal o comando “sqlplus
“, ou caso o ORACLE_HOME não esteja definido na variável PATH, digitar “ORACLE_HOME/bin/sqlplus”, onde ORACLE_HOME é o diretório de instalação do Oracle:
…quando eu pressionar enter, o SQL*Plus
irá pedir para que eu forneça o valor para a variável “ID”, através da seguinte mensagem:
Eu também posso fornecer dinamicamente as colunas que eu desejo buscar, inserindo essas “variáveis” na lista de colunas do SELECT
:
Também é possível definir em tempo de execução, o nome da tabela a ser buscada:
Basicamente é possível usar essas variáveis temporárias em todas as partes de uma query. Inclusive da ordenação:
Só devemos ter cuidado, no momento de inserir um varchar, e este contenha o caractere “&”. Caso eu não use um escape, esse caractere será interpretado pelo SQL*Plus
como uma variavel a ser definida. Ex:
Para evitarmos isso, usamos um escape, que eu prefiro chamar de “Gambiarra da Oracle”:
Também é possível definir uma variável no SQL*Plus, mas para isso, é necessário reverter o passo anterior:
Por último, mas não menos importante, é possível ativar o caractere de escape, ex:
É isso ai pessoal. Até o próximo post.
Fabrício,
Agradeço pelas dicas acima. Estou com uma duvida no comando abaixo. Como trabalhar coluna variável dentro de um comando de repetição um FOR por exemplo:
Exemplo:
Declare
saida varchar2(30);
coluna varchar2(30);
Begin
For r in (select ‘a’ coluna_a,
‘b’ coluna_b,
‘c’ coluna_c
from dual) Loop
–define coluna = r.coluna_a; — Não funcionou, nesse ponto que preciso de ajuda
Begin
select ‘&coluna’
into saida
from dual;
End;
DBMS_OUTPUT.put_line(saida);
End Loop;
End;
Boa tarde,
Qual o banco de dados eu baixo, para ter estas tabelas para que eu possa fazer os testes?
Desde já agradeço.
Efrain Lirio
Está no tópico anterior, capítulo anterior desta mesma prova:
http://certificacaobd.com.br/2012/07/08/oracle-1z0-051-topico-1-2-executar-uma-clausula-select-basica/