Filtrar dados com predicados

Concluído

As instruções SELECT mais simples, com apenas as cláusulas SELECT e FROM, avaliarão todas as linhas de uma tabela. Usando uma cláusula WHERE, você define condições que determinam quais linhas serão processadas e potencialmente reduzirão o conjunto de resultados.

A estrutura da cláusula WHERE

A cláusula WHERE é composta de uma ou mais condições de pesquisa, cada uma das quais deve ser avaliada como TRUE, FALSE ou "desconhecida" para cada linha da tabela. As linhas só serão retornadas quando a cláusula WHERE for avaliada como TRUE. As condições individuais atuam como filtros nos dados e são conhecidas como "predicados". Cada predicado inclui uma condição que está sendo testada, geralmente usando os operadores de comparação básicos:

  • = (igual a)
  • <> (não iguais)
  • > (maior que)
  • >= (maior ou igual a)
  • < (menor que)
  • <= (menor ou igual a)

Por exemplo, a consulta a seguir retorna todos os produtos com um valor ProductCategoryID de 2:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;

Da mesma forma, a consulta a seguir retorna todos os produtos com um ListPrice menor que 10.00:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;

IS NULL/IS NOT NULL

Você também pode filtrar facilmente para permitir ou excluir os valores "desconhecidos" ou NULL usando IS NULL ou IS NOT NULL.

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;

Condições múltiplas

Vários predicados podem ser combinados com os operadores AND e OR e com parênteses. No entanto, o SQL Server processará apenas duas condições por vez. Todas as condições deverão ser TRUE ao conectar várias condições ao operador AND. Ao usar o operador OR para conectar duas condições, uma ou ambas poderão ser TRUE para o conjunto de resultados.

Por exemplo, a consulta a seguir retorna produtos na categoria 2 que custam menos de 10,00:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
    AND ListPrice < 10.00;

Os operadores AND são processados antes dos operadores OR, a menos que sejam usados parênteses. Para melhor prática, use parênteses ao usar mais de dois predicados. A consulta a seguir retorna produtos na categoria 2 OR 3 AND custa menos de 10,00:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
    AND (ListPrice < 10.00);

Operadores de comparação

O Transact-SQL inclui operadores de comparação que podem ajudar a simplificar a cláusula WHERE.

IN

O operador IN é um atalho para várias condições de igualdade para a mesma coluna conectada com OR. Não há nada de errado em usar várias condições OR em uma consulta, como no seguinte exemplo:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
    OR ProductCategoryID = 3
    OR ProductCategoryID = 4;

No entanto, o uso de IN é claro e conciso, e o desempenho da consulta não será afetado.

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);

BETWEEN

BETWEEN é outro atalho que poderá ser usado ao filtrar um limite superior e inferior para o valor em vez de usar duas condições com o operador AND. As duas consultas são equivalentes:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice >= 1.00
    AND ListPrice <= 10.00;
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice BETWEEN 1.00 AND 10.00;

O operador BETWEEN usa valores de limite inclusivos. Os produtos com preço 1,00 ou 10,00 seriam incluídos nos resultados. BETWEEN também será útil ao consultar campos de data. Por exemplo, a seguinte consulta incluirá todos os nomes de produtos modificados entre 1º de janeiro de 2012 e 31 de dezembro de 2012:

SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';

ProductName

ModifiedDate

Meias para Motocicleta, M

01-01-2012 00:00:00.000

Mountain Frame HL – prata, 42

05-03-2012 00:00:00.000

HL Mountain Frame - Silver, 38

29-08-2012 00:00:00.000

Mountain-100 Silver, 38

31-12-2012 00:00:00.000

No entanto, como não especificamos um intervalo de tempo, nenhum resultado é retornado após 31-12-2012 00:00:00.000. Para incluir com precisão a data e hora, precisamos incluir a hora no predicado:

SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01 00:00:00.000' AND '2012-12-31 23:59:59.999';

Operadores de comparação básicos, como Maior Que (>) e Igual (=) também serão precisos ao filtrar apenas por data:

SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01' 
    AND ModifiedDate < '2013-01-01';

LIKE

O operador de comparação final só pode ser usado para dados de caracteres e nos permite usar caracteres curinga e padrões de expressão comuns. Os curingas nos permitem especificar cadeias de caracteres parciais. Por exemplo, você pode usar a consulta a seguir para retornar todos os produtos com nomes que contenham a palavra "mountain":

SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';

O curinga % representa qualquer cadeia de 0 ou mais caracteres, de modo que os resultados incluem produtos com a palavra "mountain" em qualquer lugar de seu nome, assim:

Nome

ListPrice

Meias para Motocicleta, M

9.50

Mountain Bike Socks, L

9.50

Mountain Frame HL – prata, 42

1364.0

HL Mountain Frame - Black, 42

1349.60

HL Mountain Frame - Silver, 38

1364.50

Mountain-100 Silver, 38

3399.99

Você pode usar o curinga _ (sublinhado) para representar um único caractere, desta forma:

SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';

Os seguintes resultados incluem apenas produtos que começam com "Meias de Mountain Bike" e um único caractere após:

ProductName

ListPrice

Meias para Motocicleta, M

9.50

Mountain Bike Socks, L

9.50

Você também pode definir padrões complexos para cadeias de caracteres que deseja encontrar. Por exemplo, a seguinte consulta pesquisou produtos com um nome que começa com "Mountain-" seguido por:

  • três caracteres entre 0 e 9
  • um espaço
  • qualquer cadeia de caracteres
  • uma vírgula
  • um espaço
  • dois caracteres entre 0 e 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';

Os resultados dessa consulta podem ter a seguinte aparência:

ProductName

ListPrice

Mountain-100 Silver, 38

3399.99

Mountain-100 Silver, 42

3399.99

Mountain-100 Black, 38

3399.99

Mountain-100 Black, 42

3399.99

Mountain-200 Silver, 38

2319.99

Mountain-200 Silver, 42

2319.99

Mountain-200 Black, 38

2319.99

Mountain-200 Black, 42

2319.99