Filtrowanie wierszy przy użyciu WHERE i HAVING
WHERE i HAVING w instrukcja SELECT klauzule kontrolować wiersze z tabel źródłowych, które są używane do utworzenia zestaw wyników.WHERE i HAVING są filtry.Określają one szereg warunki wyszukiwania, a tylko te wiersze, które spełniają warunki warunki wyszukiwania są używane do konstruowania zestaw wyników.Te wiersze spełniające warunki wyszukiwania są określane jako kwalifikacje do uczestniczenia zestaw wyników.Na przykład WHERE w następujących klauzula SELECT Instrukcja jest zgodna z wierszy tylko do określonego obszaru sprzedaży.
USE AdventureWorks;
GO
SELECT c.CustomerID, s.Name
FROM AdventureWorks.Sales.Customer c
JOIN AdventureWorks.Sales.Store s
ON s.CustomerID = c.CustomerID
WHERE c.TerritoryID = 1
Klauzula HAVING jest zazwyczaj używany wraz z klauzuli GROUP BY do filtrowania wyniki wartości agregacja.Jednak HAVING można określić bez GROUP BY.Klauzula HAVING określa dodatkowe filtry, które są stosowane po klauzuli WHERE filtrów.Filtry te mogą być stosowane do funkcja agregującej używanych na liście select.W poniższym przykładzie WHERE Klauzula tylko kwalifikuje zamówień sprzedaży produktu z powyżej ceny jednostkowej $100, a także HAVING Klauzula dodatkowo ogranicza wyników do tylko tych zleceń produkcyjnych, które zawierają więcej niż 100 jednostki.
USE AdventureWorks;
GO
SELECT OrdD1.SalesOrderID AS OrderID,
SUM(OrdD1.OrderQty) AS "Units Sold",
SUM(OrdD1.UnitPrice * OrdD1.OrderQty) AS Revenue
FROM Sales.SalesOrderDetail AS OrdD1
WHERE OrdD1.SalesOrderID in (SELECT OrdD2.SalesOrderID
FROM Sales.SalesOrderDetail AS OrdD2
WHERE OrdD2.UnitPrice > $100)
GROUP BY OrdD1.SalesOrderID
HAVING SUM(OrdD1.OrderQty) > 100
Warunki wyszukiwania WHERE i HAVING klauzule
Warunki wyszukiwania lub kwalifikacji, WHERE i HAVING klauzule mogą być następujące:
Operatory porównania, takie jak: =, < >, <, and >
Na przykład, poniższa kwerenda pobiera wiersze z Product Tabela produkty, które znajdują się w klasie H.
SELECT ProductID, Name FROM AdventureWorks.Production.Product WHERE Class = 'H' ORDER BY ProductID
Zakresy (BETWEEN i nie między nimi)
Na przykład, poniższa kwerenda pobiera wiersze z Product Tabela z cenami listy od 100 do 500 zł.
SELECT ProductID, Name FROM AdventureWorks.Production.Product WHERE ListPrice BETWEEN 100 and 500 ORDER BY ListPrice
List (IN, NOT IN)
Na przykład poniższa kwerenda pobiera produktów, które mieszczą się na liście kolorów.
SELECT ProductID, Name FROM AdventureWorks.Production.Product WHERE Color IN ('Multi', 'Silver') ORDER BY ProductID
Pasuje do wzorca (LIKE i NOT LIKE)
Na przykład, poniższa kwerenda pobiera wiersze z Product Tabela, w którym nazwa produktu rozpoczyna się od litery Ch.
SELECT ProductID, Name FROM AdventureWorks.Production.Product WHERE Name LIKE 'Ch%' ORDER BY ProductID
Uwaga
Tylko warunki WHERE, których można używać na text kolumny są funkcje, które zwracają inne typy danych, takich jak PATINDEX(); lub operatorów, takich jak IS NULL, IS NOT NULL, LIKE i NOT LIKE.
Wartości null (IS NULL i IS NOT NULL)
Na przykład, poniższa kwerenda pobiera wiersze z Customer Tabela, w którym nazwy sprzedawcy nabywców, którzy nie są wartości NULL.
SELECT s.Name FROM AdventureWorks.Sales.Customer c JOIN AdventureWorks.Sales.Store s ON c.CustomerID = S.CustomerID WHERE c.SalesPersonID IS NOT NULL ORDER BY s.Name
Uwaga
Należy zachować ostrożność przy porównywaniu wartości null.Na przykład określanie = Wartość NULL nie jest taka sama, jak określanie IS NULL.Aby uzyskać więcej informacji zobaczNull Values.
Wszystkie rekordy (= ALL, >WSZYSTKIE, <= ALL, WSZELKIE)
Na przykład, poniższa kwerenda pobiera identyfikatory zamówienia i produktów z SalesOrderDetail Tabela, w którym wysłane ilość produktu jest większy niż ilość wydane w odniesieniu do produktu w klasie H.
USE AdventureWorks; GO SELECT OrdD1.SalesOrderID, OrdD1.ProductID FROM Sales.SalesOrderDetail OrdD1 WHERE OrdD1.OrderQty > ALL (SELECT OrdD2.OrderQty FROM Sales.SalesOrderDetail OrdD2 JOIN Production.Product Prd ON OrdD2.ProductID = Prd.ProductID WHERE Prd.Class = 'H') GO
Kombinacje tych warunków (AND, OR, NOT)
Na przykład poniższa kwerenda pobiera wszystkie produkty, których cena katalogowa jest mniejsza niż 500 zł lub klasy produktu L i linii produktów S.
SELECT ProductID, Name FROM AdventureWorks.Production.Product WHERE ListPrice < 500 OR (Class = 'L' AND ProductLine = 'S')
Należy zauważyć, że podczas wyszukiwania ciągu Unicode w WHERE umieszczanie klauzula, N znak przed ciąg do wyszukania:
SELECT CustomerID FROM AdventureWorks.Sales.Store WHERE Name = N'Berglunds snabbkp'