Filtrowanie danych przy użyciu predykatów

Ukończone

Najprostsze instrukcje SELECT z klauzulami SELECT i FROM będą oceniać każdy wiersz w tabeli. Używając klauzuli WHERE, należy zdefiniować warunki określające, które wiersze zostaną przetworzone i potencjalnie zmniejszyć zestaw wyników.

Struktura klauzuli WHERE

Klauzula WHERE składa się z co najmniej jednego warunków wyszukiwania, z których każda musi mieć wartość TRUE, FALSE lub "unknown" dla każdego wiersza tabeli. Wiersze będą zwracane tylko wtedy, gdy klauzula WHERE zwróci wartość TRUE. Poszczególne warunki działają jako filtry danych i są określane jako "predykaty". Każdy predykat zawiera testowany warunek, zwykle przy użyciu podstawowych operatorów porównania:

  • = (równa się)
  • <> (nie równa się)
  • > (większe niż)
  • >= (większe lub równe)
  • < (mniejsze niż)
  • <= (mniejsze niż lub równe)

Na przykład następujące zapytanie zwraca wszystkie produkty z wartością ProductCategoryID 2:

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

Podobnie następujące zapytanie zwraca wszystkie produkty z wartością ListPrice mniejszą niż 10,00:

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

MA WARTOŚĆ NULL/NIE MA WARTOŚCI NULL

Można również łatwo filtrować, aby zezwolić lub wykluczyć wartości "nieznane" lub NULL przy użyciu wartości IS NULL lub IS NOT NULL.

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

Wiele warunków

Wiele predykatów można łączyć z operatorami AND i OR oraz nawiasami. Jednak program SQL Server będzie przetwarzać tylko dwa warunki naraz. Wszystkie warunki muszą mieć wartość TRUE podczas łączenia wielu warunków z operatorem AND. W przypadku używania operatora OR do łączenia dwóch warunków jeden lub oba mogą mieć wartość TRUE dla zestawu wyników.

Na przykład następujące zapytanie zwraca produkt w kategorii 2, który kosztuje mniej niż 10,00:

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

Operatory AND są przetwarzane przed operatorami OR, chyba że są używane nawiasy. Najlepszym rozwiązaniem jest użycie nawiasów w przypadku używania więcej niż dwóch predykatów. Następujące zapytanie zwraca produkty w kategorii 2 LUB 3 i kosztują mniej niż 10,00:

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

Operatory porównania

Język Transact-SQL zawiera operatory porównania, które mogą pomóc uprościć klauzulę WHERE.

IN

Operator IN to skrót do wielu warunków równości dla tej samej kolumny połączonej z OR. W zapytaniu nie ma nic złego w przypadku używania wielu warunków OR, jak w poniższym przykładzie:

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

Jednak użycie funkcji IN jest jasne i zwięzłe, a wydajność zapytania nie będzie miała wpływu.

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

BETWEEN

BETWEEN to inny skrót, który może być używany podczas filtrowania dla górnej i dolnej granicy wartości zamiast używania dwóch warunków z operatorem AND. Następujące dwa zapytania są równoważne:

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;

Operator BETWEEN używa wartości granic inkluzywnych. Produkty z ceną 1.00 lub 10.00 zostaną uwzględnione w wynikach. Funkcja BETWEEN jest również przydatna podczas wykonywania zapytań dotyczących pól daty. Na przykład następujące zapytanie będzie zawierać wszystkie nazwy produktów zmodyfikowane między 1 stycznia 2012 r. a 31 grudnia 2012 r.:

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

ProductName

ModifiedDate

Skarpety do jazdy na rowerze górskim, M

2012-01-01 00:00:00.000

HL Mountain Frame - Srebro, 42

2012-03-05 00:00:00.000

HL Mountain Frame - Srebro, 38

2012-08-29 00:00:00.000

Górskie — 100 srebrnych, 38

2012-12-31 00:00:00.000

Jednak ponieważ nie określamy zakresu czasu, żadne wyniki nie są zwracane po 2012-12-31 00:00:00.000. Aby dokładnie uwzględnić datę i godzinę, musimy uwzględnić godzinę w predykacie:

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

Podstawowe operatory porównania, takie jak Greater Than (>) i Equals (=) są również dokładne w przypadku filtrowania tylko według daty:

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

LIKE

Końcowy operator porównania może być używany tylko dla danych znaków i umożliwia korzystanie z symboli wieloznacznych i wzorców wyrażeń regularnych. Symbole wieloznaczne umożliwiają określenie ciągów częściowych. Na przykład możesz użyć następującego zapytania, aby zwrócić wszystkie produkty o nazwach zawierających słowo "góra":

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

Symbol % wieloznaczny reprezentuje dowolny ciąg o długości co najmniej 0 znaków, więc wyniki obejmują produkty ze słowem "góra" w dowolnym miejscu w nazwie, w następujący sposób:

Nazwisko

ListPrice

Skarpety do jazdy na rowerze górskim, M

9.50

Skarpety do jazdy na rowerze górskim, L

9.50

HL Mountain Frame - Srebro, 42

1364.0

HL Mountain Frame -, 42

1349.60

HL Mountain Frame - Srebro, 38

1364.50

Górskie — 100 srebrnych, 38

3399.99

Symbol wieloznaczny _ (podkreślenie) służy do reprezentowania pojedynczego znaku w następujący sposób:

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

Następujące wyniki obejmują tylko produkty, które zaczynają się od "Mountain Bike Socks", i jeden znak po:

ProductName

ListPrice

Skarpety do jazdy na rowerze górskim, M

9.50

Skarpety do jazdy na rowerze górskim, L

9.50

Można również zdefiniować złożone wzorce dla ciągów, które chcesz znaleźć. Na przykład następujące zapytanie wyszukało produkty o nazwie rozpoczynającej się od "Mountain-", a następnie w następujący sposób:

  • trzy znaki z zakresu od 0 do 9
  • spacja
  • dowolny ciąg
  • przecinek
  • spacja
  • dwa znaki z zakresu od 0 do 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';

Wyniki tego zapytania mogą wyglądać mniej więcej tak:

ProductName

ListPrice

Górskie — 100 srebrnych, 38

3399.99

Górskie — 100 srebrnych, 42

3399.99

Górskie — 100 czarnych, 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