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;
Hinweis 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;
Hinweis 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';