Filtrování dat pomocí predikátů

Dokončeno

Nejjednodušší příkazy SELECT s pouze klauzulí SELECT a FROM vyhodnotí každý řádek v tabulce. Pomocí klauzule WHERE definujete podmínky, které určují, které řádky se budou zpracovávat a potenciálně snížit sadu výsledků.

Struktura klauzule WHERE

Klauzule WHERE se skládá z jedné nebo více podmínek hledání, z nichž každá musí být vyhodnocena jako PRAVDA, NEPRAVDA nebo Neznámá pro každý řádek tabulky. Řádky budou vráceny pouze v případě, že klauzule WHERE vyhodnotí hodnotu PRAVDA. Jednotlivé podmínky fungují jako filtry dat a označují se jako "predikáty". Každý predikát zahrnuje podmínku, která se testuje, obvykle pomocí základních relačních operátorů:

  • = (rovná se)
  • <> (nerovná se)
  • > (větší než)
  • >= (větší než nebo rovno)
  • < (menší než)
  • <= (menší než nebo rovno)

Následující dotaz například vrátí všechny produkty s hodnotou ProductCategoryID 2:

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

Podobně následující dotaz vrátí všechny produkty s listPrice menší než 10.00:

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

IS NULL / IS NOT NULL

Můžete také snadno filtrovat a povolit nebo vyloučit neznámé hodnoty nebo hodnoty NULL pomocí hodnoty IS NULL nebo IS NOT NULL.

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

Více podmínek

Více predikátů lze kombinovat s operátory AND a OR a s závorky. SQL Server však zpracuje pouze dvě podmínky najednou. Při připojování více podmínek pomocí operátoru AND musí být splněny všechny podmínky. Při použití operátoru OR pro propojení dvou podmínek může být jedna nebo obě pro sadu výsledků pravda.

Například následující dotaz vrátí produkt v kategorii 2, který stojí méně než 10,00:

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

Operátory AND se zpracovávají před operátory OR, pokud nejsou použity závorky. Osvědčeným postupem je použít závorky při použití více než dvou predikátů. Následující dotaz vrátí produkty v kategorii 2 NEBO 3 A náklady nižší než 10,00:

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

Operátory porovnání

Transact-SQL obsahuje relační operátory, které můžou pomoct zjednodušit klauzuli WHERE.

IN

Operátor IN je zkratka pro více podmínek rovnosti pro stejný sloupec spojený s operátorem OR. Při použití více podmínek OR v dotazu není nic špatného, jak je znázorněno v následujícím příkladu:

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

Použití funkce IN je však jasné a stručné a výkon dotazu nebude ovlivněn.

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

BETWEEN

BETWEEN je další klávesová zkratka, kterou lze použít při filtrování horní a dolní hranice hodnoty místo použití dvou podmínek s operátorem AND. Následující dva dotazy jsou ekvivalentní:

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;

Operátor BETWEEN používá inkluzivní hodnoty hranic. Výrobky s cenou 1,00 nebo 10,00 by byly zahrnuty do výsledků. Funkce BETWEEN je užitečná také při dotazování polí kalendářních dat. Například následující dotaz bude obsahovat všechny názvy produktů změněné mezi 1. lednem 2012 a 31. prosincem 2012:

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

ProductName

Modifieddate

Mountain Bike Socks, M

2012-01-01 00:00:00.000

HL Mountain Frame - Silver, 42

2012-03-05 00:00:00.000

HL Mountain Frame - Silver, 38

2012-08-29 00:00:00.000

Mountain-100 Silver, 38

2012-12-31 00:00:00.000

Vzhledem k tomu, že neurčujeme časový rozsah, po 2012-12-31 00:00:00,00,000 se však nevrátí žádné výsledky. Abychom přesně zahrnuli datum a čas, musíme zahrnout čas do predikátu:

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';

Základní relační operátory, jako jsou Například Větší než (>) a Rovná se (=), jsou také přesné, pokud filtruje pouze podle data:

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

LIKE

Konečný relační operátor lze použít pouze pro data znaků a umožňuje nám používat zástupné znaky a vzory regulárních výrazů. Zástupné znaky nám umožňují zadat částečné řetězce. Pomocí následujícího dotazu můžete například vrátit všechny produkty s názvy, které obsahují slovo "mountain":

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

Zástupný % znak představuje libovolný řetězec 0 nebo více znaků, takže výsledky obsahují produkty se slovem "mountain" kdekoli ve svém názvu, například takto:

Název

ListPrice

Mountain Bike Socks, M

9.50

Mountain Bike Socks, L

9.50

HL Mountain Frame - Silver, 42

1364.0

HL Mountain Frame - černá, 42

1349.60

HL Mountain Frame - Silver, 38

1364.50

Mountain-100 Silver, 38

3399.99

Zástupný znak _ (podtržítko) můžete použít k reprezentaci jednoho znaku, například takto:

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

Následující výsledky obsahují pouze produkty, které začínají na "Mountain Bike Socks" a po jednom znaku:

ProductName

ListPrice

Mountain Bike Socks, M

9.50

Mountain Bike Socks, L

9.50

Můžete také definovat složité vzory pro řetězce, které chcete najít. Například následující dotaz vyhledá produkty s názvem, který začíná na "Mountain-", a pak následuje:

  • tři znaky mezi 0 a 9
  • mezera
  • libovolný řetězec
  • čárka
  • mezera
  • dva znaky mezi 0 a 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';

Výsledky z tohoto dotazu můžou vypadat nějak takto:

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