Condividi tramite


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

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

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 AdventureWorks2008R2.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 AdventureWorks2008R2.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 AdventureWorks2008R2.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 AdventureWorks2008R2.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 AdventureWorks2008R2.Sales.Customer c
    JOIN AdventureWorks2008R2.Sales.Store s
    ON c.CustomerID = S.CustomerID
    WHERE c.CustomerID 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 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
    
  • 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 AdventureWorks2008R2.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 BusinessEntityID 
    FROM AdventureWorks2008R2.Sales.Store 
    WHERE Name = N'Riders Company';