Filtraggio delle righe utilizzando WHERE e HAVING
Le clausole WHERE e HAVING di un'istruzione SELECT consentono di specificare le righe delle tabelle di origine con cui generare il set di risultati. Le clausole WHERE e HAVING sono filtri che specificano una serie di condizioni di ricerca. Solo le righe che soddisfano tali condizioni verranno incluse nel set di risultati. Tali righe sono definite qualificate per partecipare al set di risultati. La clausola WHERE nell'istruzione SELECT seguente, ad esempio, consente di considerare solo le righe di una zona di vendita specifica.
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
La clausola HAVING viene generalmente utilizzata insieme alla clausola GROUP BY per filtrare i risultati di valori aggregati. È tuttavia possibile specificare la clausola HAVING senza la clausola GROUP BY. La clausola HAVING specifica ulteriori filtri che vengono applicati dopo i filtri della clausola WHERE. Questi filtri possono essere applicati a una funzione di aggregazione utilizzata nell'elenco di selezione. Nell'esempio seguente viene utilizzata la clausola WHERE per selezionare solo gli ordini in cui il prezzo unitario dei prodotti venduti è maggiore di $100. La clausola HAVING limita ulteriormente i risultati agli ordini che includono più di 100 unità.
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
Condizioni di ricerca nelle clausole WHERE e HAVING
Le condizioni di ricerca, o qualificazioni, nelle clausole WHERE e HAVING possono includere gli elementi seguenti:
Operatori di confronto, quali =, < >, < e >
Tramite la query seguente, ad esempio, vengono recuperate le righe della tabella Product per i prodotti che fanno parte della classe H.
SELECT ProductID, Name FROM AdventureWorks.Production.Product WHERE Class = 'H' ORDER BY ProductID
Intervalli (BETWEEN e NOT BETWEEN).
Tramite la query seguente, ad esempio, vengono recuperate le righe della tabella Product con prezzi di listino compresi tra $100 e $500.
SELECT ProductID, Name FROM AdventureWorks.Production.Product WHERE ListPrice BETWEEN 100 and 500 ORDER BY ListPrice
Elenchi (IN e NOT IN)
Tramite la query seguente, ad esempio, vengono recuperati i prodotti che rientrano in un elenco di colori.
SELECT ProductID, Name FROM AdventureWorks.Production.Product WHERE Color IN ('Multi', 'Silver') ORDER BY ProductID
Criteri di ricerca (LIKE e NOT LIKE)
Tramite la query seguente, ad esempio, vengono recuperate le righe della tabella Product in cui il nome del prodotto inizia con le lettere Ch.
SELECT ProductID, Name FROM AdventureWorks.Production.Product WHERE Name LIKE 'Ch%' ORDER BY ProductID
[!NOTA]
Le uniche condizioni WHERE che è possibile applicare alle colonne di tipo text sono funzioni che restituiscono un tipo di dati diverso, ad esempio PATINDEX(), oppure operatori quali IS NULL, IS NOT NULL, LIKE e NOT LIKE.
Valori Null (IS NULL e IS NOT NULL)
Tramite la query seguente, ad esempio, vengono recuperate le righe della tabella Customer in cui l'ID del venditore assegnato al cliente non è 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
[!NOTA]
Eseguire i confronti tra valori Null con cautela. Il valore = NULL, ad esempio, non equivale a IS NULL. Per ulteriori informazioni, vedere Valori Null.
Tutti i record (=ALL, >ALL, <= ALL e ANY)
Tramite la query seguente, ad esempio, vengono recuperati gli ID di ordini e prodotti della tabella SalesOrderDetail in cui la quantità del prodotto spedito è maggiore della quantità spedita per qualsiasi altro prodotto della classe 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
Combinazioni di queste condizioni (AND, OR e NOT)
Tramite la query seguente, ad esempio, vengono recuperati tutti i prodotti per i quali il prezzo di listino è inferiore a $500 oppure la cui classe è L e la linea è S.
SELECT ProductID, Name FROM AdventureWorks.Production.Product WHERE ListPrice < 500 OR (Class = 'L' AND ProductLine = 'S')
Si noti che quando si esegue la ricerca di una stringa Unicode in una clausola WHERE, la stringa di ricerca deve essere preceduta dal carattere N, ad esempio:
SELECT CustomerID FROM AdventureWorks.Sales.Store WHERE Name = N'Berglunds snabbkp'
Vedere anche