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

Postagens mais visitadas deste blog

Iniciar e Parar Serviços do Windows (Delphi)

Em certas ocasiões nos deparamos com a necessidade de manipular determinadas atividades do SO, como iniciar ou parar um banco de dados, ou qualquer outro serviço que esteja funcionando no momento. Segue abaixo um código que encontrei na Internet para tal finalidade (não me recordo à fonte, assim que eu a encontrar colocarei).
Iniciar Serviço:

uses WinSvc;
//
// start service
//
// return TRUE if successful
//
// sMachine:
//   machine name, ie: \SERVER
//   empty = local machine
//
// sService
//   service name, ie: Alerter
//
function ServiceStart(
  sMachine,
  sService : string ) : boolean;
var
//
  // service control
  // manager handle
  schm,
//
  // service handle
  schs   : SC_Handle;
//
  // service status
  ss     : TServiceStatus;
//
  // temp char pointer
  psTemp : PChar;
//
  // check point
  dwChkP : DWord;
begin
  ss.dwCurrentState := -1;
// connect to the service
  // contr…

Alterar cores do PageControl (Delphi)

O padrão Windows todo cinza não é muito atraente, por isso quando nos utilizarmos do PageControl podemos alterar suas cores e fontes da seguinte maneira:
Em primeiro lugar devemos alterar a propriedade OwnerDraw para TRUE;
Depois implementar seu método DrawTab da seguinte maneira: //pinta a fonte
Control.Canvas.Font.Color:=clBlack;
//
// pinta a paleta / aba
Control.Canvas.brush.Color:=clSkyBlue;

PageControl1.Canvas.Rectangle(Rect);
Control.Canvas.TextOut(Rect.left+5,Rect.top+3,PageControl1.Pages[tabindex].Caption);
// pinta a parte interna (tabsheet)
PageControl1.Pages[TabIndex].brush.Color := Control.Canvas.brush.Color;
PageControl1.Pages[TabIndex].Repaint;

Caso a intenção seja manter cada aba com seu próprio estilo basta adicionar um CASE filtrando o índice das abas: case TabIndex of
  0: Control.Canvas.Font.Color:=clBlack;
  1: Control.Canvas.Font.Color:=clWindow;
  2: Control.Canvas.Font.Color:=clRed;
en…

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
begin
if TemAtributo(F.Attr, faDirectory) then
begin
if (F.Name <> '.') And (F.Name &l…