Na SQL (Structured Query Language, ou Linguagem de Consulta Estruturada) através do comando SELECT é possível implementar consultas para recuperar, de acordo com os critérios desejados, os dados existentes em um banco de dados.
A estrutura básica de uma consulta em SQL consiste em três cláusulas: SELECT, FROM e WHERE. Onde:
- SELECT: usada para relacionar os campos desejados no resultado de uma consulta.
- FROM: associa as tabelas de dados que serão pesquisadas.
- WHERE: consiste em uma expressão envolvendo campos das tabelas que aparecem na cláusula FROM.
Por exemplo:
1) Para recuperar todos os registros da tabela "employee", ordenando o resultado pelo campo "first_name" e apresentando no resultado somente os campos "first_name", "last_name" e "dept_no":
Listagem 1: Select básico sem where
select first_name, last_name, dept_no
from employee
order by first_name
2) Para recuperar todos os registros da tabela "employee" para os quais o valor do campo "salary" pertença ao intervalo fechado de 80000.00 até 90000.00:
Listagem 2: Select usando between
select *
from employee
where salary between 80000.00 and 90000.00
Operador LIKE
Em consultas SQL as expressões com strings mais usadas são as checagens para verificação de coincidências de pares, usando o operador LIKE combinado com os caracteres especiais porcentagem (%) e sublinhado (_). O caractere % é utilizado para indicar a posição (no início, em qualquer posição ou no final) que um conteúdo será procurado no valor string do campo especificado enquanto que o caractere _ indica o número de caracteres envolvidos na pesquisa.
Na Tabela 1 pode-se observar exemplos de expressões com strings usando o operador LIKE.
Expressão | Resultado |
LIKE 'Juca%' | Qualquer string que iniciem com Juca. |
LIKE '%Silva' | Qualquer string que terminem com Silva. |
LIKE '%Santos%' | Qualquer string que tenha Santos em qualquer posição. |
LIKE 'A_' | String de dois caracteres que tenham a primeira letra A e o segundo caractere seja qualquer outro. |
LIKE '_A' | String de dois caracteres cujo primeiro caractere seja qualquer um e a última letra seja a letra A. |
LIKE '_A_' | String de três caracteres cuja segunda letra seja A, independentemente do primeiro ou do último caractere. |
LIKE '%A_' | Qualquer string que tenha a letra A na penúltima posição e a última seja qualquer outro caractere. |
LIKE '_A%' | Qualquer string que tenha a letra A na segunda posição e o primeiro caractere seja qualquer outro caractere. |
LIKE '___' | Qualquer string com exatamente três caracteres. |
LIKE '___%' | Qualquer string com pelo menos três caracteres. |
LIKE '%''%' | Qualquer string que tenha o caractere ' em qualquer posição. |
Tabela 1: Expressões com strings usando o operador LIKE
É importante destacar que comparações com strings geralmente são sensíveis ao tamanho da letra; isto é, minúsculas não são iguais a maiúsculas, e vice-versa.
Para comparações que envolvam os caracteres especiais % e _, a SQL permite o uso de um caractere de escape (\). Esse caractere é usado imediatamente antes do caractere especial que deverá ser tratado como um caractere normal, como pode ser observado nos exemplos apresentados na Tabela 2.
Expressão | Resultado |
LIKE 'ab\%cd%' | Qualquer string que comece por ab%cd. |
LIKE 'ab\\cd%' | Qualquer string que comece por ab\cd. |
Tabela 2: Outras expressões com strings usando o operador LIKE
A SQL permite pesquisar diferenças em vez de coincidências, por meio do uso do operador de comparação NOT LIKE.
Estudo de caso: Operador LIKE em consultas SQL no Delphi
Na aplicação, apresentada na Figura 1, foi utilizada a tecnologia ADO para configurar o acesso ao banco de dados Microsoft Access "dbdemos.mdb".
Figura 1: Projetando a aplicação Operador LIKE em consultas SQL no Delphi
Na interface da aplicação (Figura 1) também foram disponibilizados os seguintes componentes:
- Label: rótulo da entrada de dados.
- Edit: para realizar a entrada de dados que corresponde ao conteúdo usado na expressão com strings usando o operador LIKE. A propriedade "CharCase" foi configurada com o valor "ecUpperCase" para aceitar somente caracteres maiúsculos na entrada.
- RadioGroup: oferece os itens com as opções de verificação (no início, em qualquer posição ou no final da string).
- DBGrid: para apresentar o resultado da consulta SQL.
- DBNavigator: barra de navegação.
- BitBtn: botão "Fechar".
A Listagem 3 apresenta o código completo da unit do formulário da aplicação (Figura 1) desenvolvida para demonstrar a utilização do operador LIKE em consultas SQL no Delphi. Como principal aspecto da programação, a definição da expressão usada na cláusula WHERE é realizada no evento OnChange do componente Edit e também no evento OnClick do componente RadioGroup de acordo com as seguintes escolhas do usuário final:
- No início: 'where ucase(company) like '+QuotedStr(Edit1.Text+'%')
- Em qualquer posição: 'where ucase(company) like '+QuotedStr('%'+Edit1.Text+'%')
- No final: 'where ucase(company) like '+QuotedStr('%'+Edit1.Text)
A função QuotedStr no Delphi retorna a string que é informada como parâmetro entre aspas simples. E a função ucase no banco de dados Microsoft Access realiza a conversão de valores string de minúsculas para maiúsculas.
Listagem 3: Código da aplicação “Operador LIKE em Consultas SQL no Delphi”
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DBCtrls, DB, ADODB, Grids, DBGrids, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
BitBtn2: TBitBtn;
DBGrid1: TDBGrid;
ADOConnection1: TADOConnection;
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
ADOQuery1CustNo: TFloatField;
ADOQuery1Company: TWideStringField;
ADOQuery1Contact: TWideStringField;
DBNavigator1: TDBNavigator;
RadioGroup1: TRadioGroup;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Edit1Change(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
begin
ADOQuery1.Open;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ADOQuery1.Close;
end;
// Evento OnChange do componente Edit que também está
// ligado ao evento OnClick do componente RadioGroup.
procedure TForm1.Edit1Change(Sender: TObject);
var sql: string;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from customer');
// opções da verificação, RadioGroup1.ItemIndex:
// 0: no início
// 1: em qualquer posição
// 2: no final
// A função QuotedStr, retorna a string que é informada
// como parâmetro entre aspas simples.
// ucase: conversão de minúsculas para maiúsculas no BD MS Access
if (RadioGroup1.ItemIndex = 0)
then sql := 'where ucase(company) like '+QuotedStr(Edit1.Text+'%')
else if (RadioGroup1.ItemIndex = 1)
then sql := 'where ucase(company) like '+QuotedStr('%'+Edit1.Text+'%')
else sql := 'where ucase(company) like '+QuotedStr('%'+Edit1.Text);
ADOQuery1.SQL.Add(sql);
ADOQuery1.SQL.Add('order by company');
ADOQuery1.Open;
end;
end.
Na Figura 2 pode-se observar a aplicação em tempo de execução apresentando os registros da tabela "employee" que no campo "Company" apresentam SCUBA em qualquer posição. Por exemplo, no início em "SCUBA Heaven", no meio em "American SCUBA Supply" e no final em "On-Target SCUBA". O resultado conquistado neste exemplo de execução equivale a seguinte instrução SQL:
Listagem 4: Exemplo de select com where e %
select * from customer
where ucase(company) LIKE '%SCUBA%'
order by company
Figura 2: Executando a aplicação Operador LIKE em consultas SQL no Delphi
Referência
- Abraham Silberschatz; Henry F. Korth; S. Sudarshan. Sistema de Banco de Dados. Capítulo 4: SQL. São Paulo: Makron Books, 3ª ed., 1999.
Obrigado e um abraço.