Freigeben über


Filtern von Zeilen mithilfe von WHERE und HAVING

Die Klauseln WHERE und HAVING in einer SELECT-Anweisung steuern, welche Zeilen aus den Quelltabellen zum Erstellen des Resultsets verwendet werden. Bei WHERE und HAVING handelt es sich um Filter. Sie geben eine Reihe von Suchbedingungen an, sodass nur Zeilen, die den Suchbedingungen entsprechen, zum Erstellen des Resultsets verwendet werden. Die den Suchbedingungen entsprechenden Zeilen gelten als qualifiziert, am Resultset beteiligt zu sein. Die WHERE-Klausel in der folgenden SELECT-Anweisung qualifiziert die Zeilen beispielsweise nur für ein bestimmtes Vertriebsgebiet.

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;

Die HAVING-Klausel wird in der Regel zusammen mit der GROUP BY-Klausel verwendet, um die Ergebnisse von Aggregatwerten zu filtern. HAVING kann jedoch ohne GROUP BY angegeben werden. Die HAVING-Klausel gibt zusätzliche Filter an, die nach den Filtern der WHERE-Klausel angewendet werden. Diese Filter können auf eine in der SELECT-Liste verwendete Aggregatfunktion angewendet werden. Die WHERE-Klausel in folgendem Beispiel qualifiziert beispielsweise nur Bestellungen von Produkten, bei denen der Einzelpreis $100 übersteigt. Durch die HAVING-Klausel wird das Ergebnis zusätzlich auf nur die Bestellungen eingeschränkt, die mehr als 100 Einheiten einschließen.

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;

Suchbedingungen in den WHERE- und HAVING-Klauseln

Die Suchbedingungen (oder Qualifizierungen) in den WHERE- und HAVING-Klauseln können Folgendes einschließen:

  • Vergleichsoperatoren, z. B. =, < >, < und >

    Mit folgender Abfrage werden beispielsweise die Zeilen aus der Product-Tabelle für die Produkte in Klasse H abgerufen.

    SELECT ProductID, Name
    FROM AdventureWorks2008R2.Production.Product
    WHERE Class = 'H'
    ORDER BY ProductID;
    
  • Bereiche (BETWEEN und NOT BETWEEN)

    Mit folgender Abfrage werden beispielsweise die Zeilen aus der Product-Tabelle mit einem Listenpreis zwischen 100 $ und 500 $ abgerufen.

    SELECT ProductID, Name
    FROM AdventureWorks2008R2.Production.Product
    WHERE ListPrice BETWEEN 100 and 500
    ORDER BY ListPrice;
    
  • Listen (IN, NOT IN)

    Mit folgender Abfrage werden beispielsweise Produkte abgerufen, die in eine Liste mit Farben fallen.

    SELECT ProductID, Name
    FROM AdventureWorks2008R2.Production.Product
    WHERE Color IN ('Multi', 'Silver')
    ORDER BY ProductID;
    
  • Musterübereinstimmungen (LIKE und NOT LIKE)

    Mit folgender Abfrage werden beispielsweise Zeilen aus der Product-Tabelle abgerufen, in denen der Produktname mit dem Buchstaben Ch beginnt.

    SELECT ProductID, Name
    FROM AdventureWorks2008R2.Production.Product
    WHERE Name LIKE 'Ch%'
    ORDER BY ProductID;
    
    HinweisHinweis

    Die einzigen WHERE-Bedingungen, die Sie für text-Spalten verwenden können, sind Funktionen, die einen anderen Datentyp zurückgeben, z. B. PATINDEX(), oder Operatoren, wie z. B. IS NULL, IS NOT NULL, LIKE und NOT LIKE.

  • NULL-Werte (IS NULL und IS NOT NULL)

    Mit folgender Abfrage werden beispielsweise Zeilen aus der Customer-Tabelle abgerufen, in denen die IDs des Vertriebsmitarbeiters der Kunden nicht NULL sind.

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

    Gehen Sie beim Vergleichen von NULL-Werten mit Bedacht vor. So entspricht beispielsweise das Angeben von = NULL nicht dem Angeben von IS NULL. Weitere Informationen finden Sie unter NULL-Werte.

  • Alle Datensätze (=ALL, >ALL, <= ALL, ANY)

    Mit folgender Abfrage werden beispielsweise IDs von Bestellungen und Produkten aus der SalesOrderDetail-Tabelle abgerufen, bei denen die Menge des ausgelieferten Produkts größer als die ausgelieferte Menge eines der Produkte in Klasse H ist.

    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
    
  • Kombinationen dieser Bedingungen (AND, OR, NOT)

    Mit folgender Abfrage werden beispielsweise alle Produkte abgerufen, deren Listenpreis entweder niedriger als 500 $ bzw. bei denen L die Produktklasse und S die Produktgruppe ist.

    SELECT ProductID, Name
    FROM AdventureWorks2008R2.Production.Product
    WHERE ListPrice < 500
       OR (Class = 'L' AND ProductLine = 'S');
    

    Stellen Sie sicher, dass Sie beim Suchen nach einer Unicode-Zeichenfolge in einer WHERE-Klausel den Buchstaben N vor die Suchzeichenfolge setzen:

    SELECT BusinessEntityID 
    FROM AdventureWorks2008R2.Sales.Store 
    WHERE Name = N'Riders Company';