Filtrar dados com predicados

Concluído

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

A estrutura da cláusula WHERE

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

  • = (igual)
  • <> (não é igual)
  • > (maior que)
  • >= (maior ou igual a)
  • < (menos que)
  • <= (inferior 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;

É NULO / NÃO É NULO

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

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

Múltiplas condições

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

Por exemplo, a consulta a seguir retorna o produto na categoria 2 que custa 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 melhores práticas, use parênteses ao usar mais de dois predicados. A consulta a seguir retorna produtos na categoria 2 OU 3 E 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 condições de igualdade múltiplas 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 exemplo a seguir:

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

No entanto, o uso do 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 pode 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 a seguir 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. Produtos com um preço de 1,00 ou 10,00 seriam incluídos nos resultados. BETWEEN também é útil ao consultar campos de data. Por exemplo, a consulta a seguir 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 Bicicletas de Montanha, M

2012-01-01 00:00:00.000

HL Mountain Frame - Prata, 42

2012-03-05 00:00:00.000

HL Mountain Frame - Prata, 38

2012-08-29 00:00:00.000

Montanha 100 Prateado, 38

2012-12-31 00:00:00.000

No entanto, como não especificamos um intervalo de tempo, nenhum resultado é retornado após 2012-12-31 00:00:00.000. Para incluir com precisão a data e a 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';

Os operadores de comparação básicos, como Maior que (>) e Igual (=), também são precisos quando filtram apenas por data:

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

GOSTAR

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 regular. Os curingas nos permitem especificar cadeias de caracteres parciais. Por exemplo, você pode usar a seguinte consulta para retornar todos os produtos com nomes que contenham a palavra "montanha":

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

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

Nome

PreçoListado

Meias para Bicicletas de Montanha, M

9.50

Meias para Bicicletas de Montanha, L

9.50

HL Mountain Frame - Prata, 42

1364.0

HL Mountain Frame - Preto, 42

1349.60

HL Mountain Frame - Prata, 38

1364.50

Montanha 100 Prateado, 38

3399.99

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

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

Os resultados a seguir incluem apenas produtos que começam com "Mountain Bike Socks", e um único caractere depois:

ProductName

PreçoListado

Meias para Bicicletas de Montanha, M

9.50

Meias para Bicicletas de Montanha, L

9.50

Você também pode definir padrões complexos para cadeias de caracteres que deseja localizar. Por exemplo, a seguinte consulta procurou 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 esta aparência:

ProductName

PreçoListado

Montanha 100 Prateado, 38

3399.99

Montanha 100 Prateado, 42

3399.99

Montanha-100 Preto, 38

3399.99

Montanha 100 Preto, 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