Filtrowanie wierszy przy użyciu WHERE i HAVING
Klauzulach WHERE i HAVING w instrukcja SELECT kontroli wiersze z źródło tabel, które są używane do tworzenia zestaw wyników.GDZIE i HAVING są filtry.Określają szereg warunków wyszukiwania i tylko te wiersze, które spełniają warunki warunki wyszukiwania są używane do budowania zestaw wyników.Te wiersze spełniające warunki wyszukiwania są określane jako kwalifikowane do uczestnictwa zestaw wyników.Na przykład WHERE w następujących klauzula SELECT instrukcja kwalifikuje wierszy tylko do określonych sprzedaży terytorium.
USE AdventureWorks2008R2;
GO
SELECT c.CustomerID, s.Name
FROM AdventureWorks2008R2.Sales.Customer c
JOIN AdventureWorks2008R2.Sales.Store s
ON s.BusinessEntityID = c.CustomerID
WHERE c.TerritoryID = 1;
klauzula HAVING jest zazwyczaj używane razem z klauzula GROUP BY filtrowania wyniki wartooci wartość zagregowana.Jednakże HAVING można określić bez Grupuj według.Klauzula HAVING określa dodatkowe filtry, które są stosowane po klauzuli WHERE filtry.Filtry te można stosować do funkcja agregująca używany na liście select.W poniższym przykładzie WHERE klauzula kwalifikuje się tylko zamówień sprzedaży produktu z przekraczającej cena jednostkowa $100oraz HAVING klauzula dodatkowo ogranicza wynik tych zamówień, które zawierają więcej niż 100 jednostek.
USE AdventureWorks2008R2;
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 w WHERE i HAVING klauzul
Warunków wyszukiwania lub kwalifikacje w klauzulach WHERE i HAVING mogą być następujące:
Operatory porównania, takie jak: =, < >, <, and >
Na przykład, poniższa kwerenda pobiera wiersze z Product tabela dla produktów, które są w klasie H.
SELECT ProductID, Name FROM AdventureWorks2008R2.Production.Product WHERE Class = 'H' ORDER BY ProductID;Zakresy (BETWEEN i nie między)
Na przykład, poniższa kwerenda pobiera wiersze z Product tabela z listy cen od 100 do 500 zł.
SELECT ProductID, Name FROM AdventureWorks2008R2.Production.Product WHERE ListPrice BETWEEN 100 and 500 ORDER BY ListPrice;List (W, nie W)
Na przykład poniższa kwerenda pobiera produktów, które znajdą się na liście kolorów.
SELECT ProductID, Name FROM AdventureWorks2008R2.Production.Product WHERE Color IN ('Multi', 'Silver') ORDER BY ProductID;Wzorców (takie jak i nie chcesz)
Na przykład, poniższa kwerenda pobiera wiersze z Product tabela, w którym nazwa produktu rozpoczyna się od liter Ch.
SELECT ProductID, Name FROM AdventureWorks2008R2.Production.Product WHERE Name LIKE 'Ch%' ORDER BY ProductID;Ostrzeżenie
Tylko warunki gdzie korzystających w text kolumny są funkcje, które zwracają innego typu danych, takich jak PATINDEX(); lub operatorów, takich jak jest NULL, nie jest NULL, jak i nie.
Wartości null (jest puste i nie jest NULL)
Na przykład, poniższa kwerenda pobiera wiersze z Customer tabela, w którym znajdują się identyfikatory sprzedawcy klientów NULL.
SELECT s.Name FROM AdventureWorks2008R2.Sales.Customer c JOIN AdventureWorks2008R2.Sales.Store s ON c.CustomerID = S.CustomerID WHERE c.CustomerID IS NOT NULL ORDER BY s.Name;Ostrzeżenie
Należy zachować ostrożność podczas porównywania wartości null.Na przykład, określenie = NULL nie jest taka sama, jak określanie IS NULL.Aby uzyskać więcej informacji, zobacz Wartości null.
Wszystkie rekordy (= ALL, >wszystkich, <= ALL, wszelkie)
Na przykład, poniższa kwerenda pobiera identyfikatory zamówienia i produktów z SalesOrderDetail tabela, w którym ilość produktu, dostarczane jest większa niż ilość wydana dla każdego produktu w klasie H.
USE AdventureWorks2008R2; 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'); GOKombinacje tych warunków (AND, OR, NOT)
Na przykład, poniższa kwerenda pobiera wszystkie produkty albo listy cenowej, która jest mniejsza niż 500 zł lub klasy produktu jest L i linii produktów jest S.
SELECT ProductID, Name FROM AdventureWorks2008R2.Production.Product WHERE ListPrice < 500 OR (Class = 'L' AND ProductLine = 'S');Należy zauważyć, że podczas wyszukiwania ciągu Unicode w WHERE umieszczać klauzula, N przed wyszukiwany ciąg znaków:
SELECT BusinessEntityID FROM AdventureWorks2008R2.Sales.Store WHERE Name = N'Riders Company';