Udostępnij za pośrednictwem


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'