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

Criando uma Aplicação CRUD com Flask, PostgreSQL e Docker

Criando uma Aplicação CRUD com Flask, PostgreSQL e Docker Neste guia, vamos criar uma aplicação básica que acessa um banco de dados PostgreSQL e realiza operações CRUD (Create, Read, Update, Delete). Vamos usar Flask e executar tudo com Docker. Sem estilos ou extras, apenas o essencial. Estrutura do Projeto crud-app/ |-- app/ | |-- app.py | |-- templates/ | | |-- index.html | | |-- edit.html |-- Dockerfile |-- requirements.txt |-- docker-compose.yml Passo 1: Dependências Crie um arquivo requirements.txt com as seguintes linhas: Flask==2.2.2 Flask-SQLAlchemy==3.0.2 psycopg2-binary==2.9.3 Werkzeug==2.2.2 Passo 2: Aplicação Flask Arquivo app/app.py : from flask import Flask, render_template, request, redirect, url_for from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # Configuração do banco de dados app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://user:password@db:5432/crud_db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db...

Listar arquivos existentes em diretório (Delphi)

Mostraremos uma maneira simples e prática para listar o conteúdo de um diretório com a opção de incluir nessa listagem os arquivos de seus subdiretórios. No exemplo abaixo temos um Edit para receber o diretório a ser pesquisado um CheckBox para indicar se os subdiretórios entrarão na pesquisa um botão para efetuar a pesquisa e um Memo para listar os arquivos encontrados, no final um Edit que receberá o cálculo final (em bytes) da soma do tamanho dos arquivos. procedure TForm1.Button1Click(Sender: TObject); begin   tamanhoTotal := 0;   memLista.Lines.Clear;   ListarArquivos(edtDiretorio.Text, chkSub.Checked);   Edit1.Text := IntToStr( tamanhoTotal ); end; procedure TForm1.ListarArquivos(Diretorio: string; Sub:Boolean); var   F: TSearchRec;   Ret: Integer;   TempNome: string; begin   Ret := FindFirst(Diretorio+'\*.*', faAnyFile, F);   try     while Ret = 0 do ...

Array no PL/SQL (Oracle)

Trabalhar com estruturas indexadas pode nos poupar muito trabalho, deixar o código mais limpo e reutilizável, pois bem vamos dar um exemplo de como fazer isso no PL/SQL. Criaremos um tipo table que seja capaz de armazenar nomes de uma tabela de funcionários de forma indexada, e em seguida mostraremos o que foi armazenado, segue o código: 1: declare 2: -- tipo tabela contendo apenas texto e indexado 3: type TipoNomFunc is table of varchar 2(200) index by binary_integer; 4: -- variável do nosso tipo (como nosso tipo é indexado ele funcionará como um array) 5: func TipoNomFunc; 6: -- indice para loop 7: indice number := 1; 8: -- 9: begin 10: -- 11: -- cursor para nossa tabela de funcionarios 12: for emps in ( 13: select * 14: from funcionarios 15: ) 16: loop 17: -- colocamos o nome do funcionario em nosso "vetor" 18: func(indice) := emps.nom_funcionario; 19: -- incrementamos o indice 20:...