Pular para o conteúdo principal

O que devemos conhecer sobre SQL/Oracle Parte 5: Restringindo e ordenando dados

Limitando registros recuperados por uma consulta

Na grande maioria dos casos apenas listar as colunas desejadas de certa tabela não é o suficiente, é necessário restringir o resultado de acordo com regras para que esse resultado possa ter algum significado, isso é alcançado pela cláusula WHERE.
O WHERE não é obrigatório, mas quando usado no comando SELECT deve vir depois da cláusula FROM. Ele sempre testa todos os registros recuperados pela consulta, retornando aqueles que o satisfizerem.
Para realizar as comparações da cláusula WHERE temos o operador de igualdade “=”, maior que “>”, maior ou igual “>=”, menor que “<”, menor ou igual “<=”, diferente “<>“, “!=” ou “^=”, se pertence “IN” e se contém uma parte especifica “LIKE”. Comparações com números são logicas, onde números menores são menores que números maiores. Os caracteres respeitam a ordem do alfabeto, onde “A” é menor que “Z”, e “Z” é menor que “a” (letras maiúsculas são sempre menores), além disso, os caracteres “10” são considerados menores que “2”. Quanto as datas podemos dizer que “hoje” é sempre menor que “amanhã”, logo datas anteriores são menores que datas posteriores.
O operador de comparação “LIKE” é muito poderoso, ele faz uso de caracteres “coringa” que permitem restringir partes, como por exemplo, pode-se usar o underline “_” para indicar um caractere, seja ele qual for, ou a porcentagem “%”, que indica que a partir dali qualquer resultado satisfaz a comparação, veja um exemplo:

SELECT NOME FROM FUNCIONARIOS WHERE NOME LIKE ‘JO__’;

Na consulta acima utilizamos o underline, estamos fazendo uma comparação de tamanho fixo, procurando por nomes que possuem as duas primeiras letras “JO” e que tenham apenas mais dois caracteres “__”. Agora veja o próximo exemplo:

SELECT NOME FROM FUNCIONARIOS WHERE NOME LIKE ‘JO%’;

No exemplo acima a busca ocorre por nomes iniciando em “JO”, onde os próximos caracteres não importam. Suponhamos que na base dos exemplos acima nos temos dois funcionários, “JOÃO” e “JOANA”, o primeiro exemplo retornaria apenas “JOÃO”, enquanto o segundo retornaria ambos.
Com os operadores booleanos (“AND” e “OR”) é possível realizar a combinação de condições, lembrando que sua avaliação se da de acordo com as convenções matemáticas:

SELECT * FROM FUNCIONARIOS WHERE ID != 2 AND STATUS = ‘S’;

Outro operador Booleano é o “NOT”, que é negação de uma condição:

SELECT * FROM FUNCIONARIOS WHERE ID != 2 AND NOT STATUS = ‘S’;

É importante ter em mente a ordem de precedência das comparações, onde temos no topo o “NOT”, depois “AND” e por fim “OR”.
O “IN” é utilizado na comparação com grupos, pode ser usado com datas, números e caracteres, as expressões devem estar dentro de aspas simples, elas também devem ser do mesmo tipo em ambos os lados da comparação:

SELECT * FROM FUNCIONARIOS WHERE NOME IN (‘ANA’, ‘MARIA’, ‘MARTA’);

O BETWEEN é usado para verificar se um determinado valor esta dentro de um limite determinado:

SELECT * FROM FUNCIONARIOS WHERE SALARIO BETWEEN 1000 AND 5000;

Por fim temos os operadores para comparar os valores nulos, ou seja, para a falta de valor:

SELECT * FROM FUNCIONARIO WHERE TELEFONE IS NULL;

Resumindo:

  • A cláusula WHERE vem sempre depois da clausula FROM;
  • O WHERE identifica os registros que devem ser incluídos no comando SQL;
  • O WHERE é usado em SELECT, UPDATE e DELETE;
  • WHERE é uma clausula opcional;
  • A cláusula WHERE é composta por expressões;
  • Essas expressões podem conter nomes de colunas, valores literais. A clausula WHERE compara ambos os lados determinando se o resultado é TRUE ou FALSE;
  • Os operadores booleanos separam as comparações para criar validações complexas. Coletivamente o resultado final para cada registro da tabela será TRUE ou FALSE, se TRUE o registro é retornado;
  • Os operadores booleanos são AND, OR e NOT;
  • As regras de precedência dos operadores booleanos definem que o operador NOT seja avaliado primeiro, em seguida o AND e então o OR;
  • O uso de parênteses pode alterar as regras originais de precedência;
  • Quando comparando datas, datas recentes são consideradas menores que datas antigas, como por exemplo, janeiro é menor que dezembro do mesmo ano;
  • Quando comparando caracteres, a letra ‘a’ é menor que a letra ‘z’, letras maiúsculas são menores que letras minúsculas e a representação de ‘3’ é maior que a representação de ‘22’;
  • LIKE pode ser usado com “coringas”;
  • IN pode ser usado para comparar uma expressão com um conjunto de uma ou mais expressões;
  • BETWEEN é usado para comparar expressões que estejam dentro de um limite. Ele é “inclusivo”, ou seja, “BETWEEN 2 AND 3” incluirá os valores 2 e 3 nos limites;
  • Devem ser usados IS NULL ou IS NOT NULL quando for necessário testar se uma coluna possui valor NULL (ou não);


Ordenando registros recuperados por uma consulta

Além de selecionar e restringir o resultado dessa seleção, também é possível ordenar o resultado, seja de forma descendente ou ascendente (ASC, DESC). Para fazermos uso da cláusula ORDER BY, basta especificar o nome da coluna que desejamos utilizar para a ordenação, ou a posição da coluna na listagem do SELECT.
O ORDER BY é sempre a ultima cláusula do comando SELECT, nele é possível listar uma ou mais colunas, separadas por vírgulas, onde a cada quebra ocorre uma reordenação.
É possível na cláusula WHERE usar expressões, ou mesmo apelidos atribuídos a colunas, também é possível mesclar todas essas possibilidades descritas acima:

SELECT ID, (SALARIO*2) SAL, NOME FROM FUNCIONARIOS ORDER BY ID, SAL, 3;

Resumindo:

  • ORDER BY é uma clausula opcional para ordenar registros recuperados pelo comado SELECT;
  • Se usado, o ORDER BY é sempre a ultima clausula do comando SELECT;
  • O ORDER BY utiliza expressões para direcionar a ordenação do comando SELECT;
  • Cada expressão é avaliada na sequencia, o primeiro item do ORDER BY realizara a primeira ordenação, o segundo ordenará dentro dos grupos já ordenados pelo primeiro item e assim por diante;
  • É possível ordenar por colunas não listadas no SELECT;
  • O ORDER BY pode utilizar expressões de qualquer tipo, seguindo as mesmas regras de expressões vistas na clausula WHERE;
  • Dados numéricos por padrão são ordenados de forma ascendente, do menor para o maior;
  • Caracteres por padrão são ordenados de forma ascendente, de ‘A’ a ‘Z’;
  • Datas por padrão são ordenadas de forma ascendente, de datas anteriores a posteriores;
  • As ordenações podem ser alteradas para descendente com a palavra DESC;
  • O ORDER BY pode identificar colunas por seus nomes, apelidos e posição na lista SELECT;


Comentários

Mais visitadas

Funções de data Oracle

  Com o Oracle é possível obter uma série de resultados a partir de uma ou mais datas, como por exemplo verificar o último dia do mês ou verificar a quantidade de meses entre duas datas, então vamos a alguns exemplos:   Data atual do sistema: SYSDATE Remover meses de uma data: ADD_MONTHS(SYSDATE, -1) Adicionar meses de uma data: ADD_MONTHS(SYSDATE, +1) Buscar o último dia do mês: LAST_DAY(SYSDATE) Primeiro dia do mês: TRUNC(SYSDATE, ‘MONTH’) Quantidade de meses entre duas datas: MONTHS_BETWEEN(SYSDATE, ‘27/07/1982’) Primeiro dia do ano: TRUNC(SYSDATE, ‘YEAR’) Dias da semana: DECODE( TO_NUMBER( TO_CHAR          (SYSDATE, ‘D’) ) ,1, ‘domingo’ ,2, ‘segunda-feira’ ,3, ‘terça-feira’ ,4, ‘quarta-feira’ ,5, ‘quinta-feira’ ,6, ‘sexta-feira’ ,7,’sábado’ )

Manipular arquivos com PL/SQL (Oracle)

O bom e velho arquivo, é impressionante como lidamos com seus vários tipos durante todos os dias, bom hoje vamos mostrar um jeito simples de se escrever e ler arquivos apenas com a codificação nativa do Oracle. A primeira coisa a fazer é criar um diretório válido configurado no Oracle, e permissões de acesso a esse diretório para o usuário de banco onde faremos o exemplo, sendo assim suponhamos que nosso usuário de banco se chame programero, e nosso diretório real esteja em c:\programero, então logado como SYSTEM devemos executar os seguintes comandos: 1: -- cria diretorio 2: create or replace directory DIR_PROGRAMERO as ' C:\PROGRAMERO '; 3: -- concede permissão de escrita e leitura para nosso usuário 4: grant read , write on directory DIR_PROGRAMERO to PROGRAMERO; Para escrever, basicamente precisamos apenas saber onde esse arquivo ficará, no nosso caso no diretório criado acima, segue o código de escrita: 1: declare 2: -- nosso handler 3: v_a

Funções de Data e Hora (Delphi)

É muito comum nos depararmos no dia a dia com a necessidade de manipular datas e horas, seja para um calculo de permanência, dias de atraso enfim, é praticamente escapar de alguma situação que necessite desse tipo de controle. Assim como a necessidade e se utilizar algum recurso para manipular as datas e horas de alguma maneira e freqüente, as duvidas de como o faze-lo também é, basta um breve olhar em qualquer fórum especializado e lá está, alguma duvida relacionada, por isso decidi falar um pouco sobre uma unit muito poderosa chamada DateUtils para a manipulação de data e hora, com um grande numero de métodos e classes que facilitam a vida de qualquer um. Alguns exemplos: CompareDate(constA, B: TDateTime): TValueRelationship; Compara apenas a data de dois valores (do tipo TDateTime) retornando: LessThanValue O primeiro valor é menor que o segundo EqualsValue Os valores são iguais GreaterThanValue O primeiro valor é maior que o segundo CompareDateTime(const A, B: TD