Udostępnij przez


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');
    GO
    
  • Kombinacje 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';