Critérios de seleção em SQL
Estudaremos as possibilidades de filtrar os registros com o fim de recuperar somente aqueles que cumpram umas condições pré-estabelecidas.Por Claudio
Publicado em: 29/9/07
Na seção anterior vimos a forma de recuperar os registros das tabelas, as formas empregadas devolviam todos os registros da mencionada tabela. Ao longo deste manual se estudarão as possibilidades de filtrar os registros com o fim de recuperar somente aqueles que cumpram umas condições pré-estabelecidas.
Antes de começar o desenvolvimento deste artigo, há que ressaltar três detalhes de vital importância. O primeiro deles é que cada vez que se deseja estabelecer uma condição referida a um campo de texto a condição de busca deve ir fechada entre aspas simples; a segunda é que não é possível estabelecer condições de busca nos campos memo e; a terceira e última faz referência às datas. Ate hoje não fui capaz de encontrar uma sintaxe que funcione em todos os sistemas, por isso se faz necessário particulariza-las segundo o banco de dados:
| Banco de Datos | | Sintaxe |
| SQL-SERVER | | Data = #mm-dd-aaaa# |
| ORACLE | | Data = to_date('YYYYDDMM','aaaammdd',) |
| ACCESS | | Fecha = #mm-dd-aaaa# |
Exemplo
Banco de Dados Exemplo (para gravar a data 18 de maio de 1969)
| SQL-SERVER | | Data = #05-18-1969# ó
Data = 19690518 |
| ORACLE | | Data = to_date('YYYYDDMM', '19690518') |
| ACCESS | | Data = #05-18-1969# |
Referente aos valores lógicos True ou False cabe destacar que não são reconhecidos em ORACLE, nem nesse sistema de banco de dados, nem em SQL-SERVER existem os campos de tipo "SIM/NAO" de ACCESS; nesses sistemas se utilizam os campos BIT que permitem armazenar valores de 0 ou 1. Internamente, ACCESS, armazena neste campos valores de 0 ou -1, por tanto tudo se complica bastante, porém, aproveitando a coincidência do 0 para os valores FALSE, pode-se utilizar a sintaxe seguinte que funciona em todos os casos: se se deseja saber se o campo é falso "... CAMPO = 0" e para saber os verdadeiros "CAMPO <> 0".
Operadores Lógicos
Os operadores lógicos suportados por SQL são: AND, OR, XOR, Eqv, Imp, Is e Not. Com exceção dos dois últimos, todos possuem a seguinte sintaxe:
<expressao1> operador <expressao2>
Onde expressao1 e expressao2 são as condições a avaliar, o resultado da operação varia em função do operador lógico. A tabela anexa mostra os diferentes possíveis resultados:
| <expressao1> | Operador | <expressao2> | Resultado |
| Verdadeiro | AND | Falso | Falso |
| Verdadeiro | AND | Verdadeiro | Verdadeiro |
| Falso | AND | Verdadeiro | Falso |
| Falso | AND | Falso | Falso |
| Verdadeiro | OR | Falso | Verdadeiro |
| Verdadeiro | OR | Verdadeiro | Verdadeiro |
| Falso | OR | Verdadeiro | Verdadeiro |
| Falso | OR | Falso | Falso |
| Verdadeiro | XOR | Verdadeiro | Falso |
| Verdadeiro | XOR | Falso | Verdadeiro |
| Falso | XOR | Verdadeiro | Verdadeiro |
| Falso | XOR | Falso | Falso |
| Verdadeiro | Eqv | Verdadeiro | Verdadeiro |
| Verdadeiro | Eqv | Falso | Falso |
| Falso | Eqv | Verdadeiro | Falso |
| Falso | Eqv | Falso | Verdadeiro |
| Verdadeiro | Imp | Verdadeiro | Verdadeiro |
| Verdadeiro | Imp | Falso | Falso |
| Verdadeiro | Imp | Null | Null |
| Falso | Imp | Verdadeiro | Verdadeiro |
| Falso | Imp | Falso | Verdadeiro |
| Falso | Imp | Null | Verdadeiro |
| Null | Imp | Verdadeiro | Verdadeiro |
| Null | Imp | Falso | Null |
| Null | Imp | Null | Null |
Se a qualquer das anteriores condições lhe ante-pusermos o operador NOT o resultado da operação será o contrário ao devolvido sem o operador NOT.
O último operador denominado Is se emprega para comparar duas variáveis de tipo objeto <Objeto1> Is <Objeto2>. este operador devolve verdadeiro se os dois objetos forem iguais.
SELECT *
FROM
Empregados
WHERE
Idade > 25 AND Idade < 50
SELECT *
FROM
Empregados
WHERE
(Idade > 25 AND Idade < 50)
OR
Salario = 100
SELECT *
FROM
Empregados
WHERE
NOT Estado = 'Solteiro'
SELECT *
FROM
Empregados
WHERE
(Salario >100 AND Salario < 500)
OR
(Cidade = 'Madri' AND Estado = 'Casado')
Intervalos de Valores
Para indicar que desejamos recuperar os registros segundo o intervalo de valores de um campo empregaremos o operador Between cuja sintaxe é:
campo [Not] Between valor1 And valor2 (a condição Not é opcional)
Neste caso a consulta devolveria os registros que contiverem em "campo" um valor incluído no intervalo valor1, valor2 (ambos inclusive). Se ante-pusermos a condição Not devolverá aquelos valores não incluídos no intervalo.
SELECT *
FROM
Pedidos
WHERE
CodPostal Between 28000 And 28999
(Devolve os pedidos realizados na cidade de Madrid)
O Operador Like
Utiliza-se para comparar uma expressão de cadeia com um modelo em uma expressão SQL. Sua sintaxe é:
expressão Like modelo
Onde expressão é uma cadeia modelo ou campo contra o que se compara expressão. Pode-se utilizar o operador Like para encontrar valores nos campos que coincidam com o modelo especificado. Por modelo pode especificar um valor completo (Ana Maria), ou se pode utilizar uma cadeia de caracteres asterisco como os reconhecidos pelo sistema operacional para encontrar uma classificação de valores (Like An*).
O operador Like pode ser utilizado em uma expressão para comparar um valor de um campo com uma expressão de cadeia. Por exemplo, se introduzirmos Like C* em uma consulta SQL, a consulta devolve todos os valores de campo que começarem pela letra C. Em uma consulta com parâmetros, pode fazer com que o usuário escreva o modelo que será utilizado.
O exemplo seguinte devolve os dados que começam com a letra P seguido de qualquer letra entre A e F e de três dígitos:
Like 'P[A-F]###'
Este exemplo devolve os campos cujo conteúdo comece com uma letra da A à D seguidas de qualquer cadeia.
Like '[A-D]*'
Na tabela seguinte se mostra como utilizar o operador Like para comprovar expressões com diferentes modelos.
ACCESS
| Tipo de coincidência | Modelo Planejado | Coincidee | Nao coincide |
| Varios caracteres | 'a*a' | aa', 'aBa', 'aBBBa' | ''aBC' |
| Caractere especial | 'a[*]a' | 'a*a' | 'aaa' |
| Varios caracteres | 'ab*' | 'abcdefg', 'abc' | 'cab', 'aab' |
| Um so caractere | 'a?a' | 'aaa', 'a3a', 'aBa' | 'aBBBa' |
| Um so digito | 'a#a' | 'a0a', 'a1a', 'a2a' | 'aaa', 'a10a' |
| Categoria de caracteres | '[a-z]' | 'f', 'p', 'j' | '2', '&' |
| Fora de uma categoria | '[!a-z]' | '9', '&', '%' | 'b', 'a' |
| Diferente de um digito | '[!0-9]' | 'A', 'a', '&', '~' | '0', '1', '9' |
| Combinada | 'a[!b-m]#' | 'An9', 'az0', 'a99' | 'abc', 'aj0' |
SQL-SERVER
| Exemplo | Descrição |
| LIKE 'A%' | Tudo que comecar por A |
| LIKE '_NG' | Tudo que comece por qualquer caractere e logo siga NG |
| LIKE '[AF]%' | Tudo que comecar por A ou F |
| LIKE '[A-F]%' | Tudo que comece por qualquer letra compreendida entre a A e a F |
| LIKE '[A^B]%' | Tudo que comecar por A e a segunda letra nao for uma B |
Em determinado motores de banco de dados, esta cláusula, não reconhece o asterisco como caractere e há que substitui-lo pelo caractere tanto por cento (%).
O Operador In
Este operador devolve aqueles registros cujo campo indicado coincide com algum dos em uma lista. Sua sintaxe é:
expressao [Not] In(valor1, valor2, . . .)
SELECT *
FROM
Pedidos
WHERE
Cidade In ('Madri', 'Barcelona', 'Sevilha')
A cláusula WHERE
A cláusula WHERE pode ser usada para determinar que registros das tabelas enumeradas na cláusula FROM aparecerão nos resultados da instrução SELECT. Depois de escrever esta cláusula deve-se especificar as condições expostas nas seções anteriores. Se não se emprega esta cláusula, a consulta devolverá todas as filas da tabela. WHERE é opcional, mas quando aparece deve ir a seguir de FROM.
SELECT
Sobrenome, Salario
FROM
Empregados
WHERE
Salario = 21000
SELECT
IdProduto, Existencias
FROM
Produtos
WHERE
Existencias <= NovoPedido
SELECT *
FROM
Pedidos
WHERE
DataEnvio = #05-30-1994#
SELECT
Sobrenomes, Nome
FROM
Empregados
WHERE
Sobrenomes = 'King'
SELECT
Sobrenomes, Nome
FROM
Empregados
WHERE
Sobrenomes Like 'S*'
SELECT
Sobrenomes, Salario
FROM
Empregados
WHERE
Salario Between 200 And 300
SELECT
Sobrenomes, Salario
FROM
Empregados
WHERE
Sobrenomes Between 'Lon' And 'Tol'
SELECT
IdPedido, DataPedido
FROM
Pedidos
WHERE
DataPedido Between #01-01-1994# And #12-31-1994#
SELECT
Sobrenomes, Nome, Cidade
FROM
Empregados
WHERE
Cidade In ('Sevilha', 'Los Angeles', 'Barcelona')
Comentários do artigo