Usare clausole HAVING e WHERE nella stessa query (Visual Database Tools)
si applica a:SQL Server
database SQL di Azure
Istanza gestita di SQL di Azure
Azure Synapse Analytics
Analytics Platform System (PDW)
In alcuni casi, è possibile escludere singole righe dai gruppi (usando una clausola WHERE
) prima di applicare una condizione ai gruppi nel suo complesso (usando una clausola HAVING
).
Una clausola HAVING
è simile a una clausola WHERE
, ma si applica solo ai gruppi nel suo complesso , ovvero alle righe del set di risultati che rappresentano i gruppi, mentre la clausola WHERE
si applica alle singole righe. Una query può contenere sia una clausola WHERE
che una clausola HAVING
. In tal caso:
La clausola
WHERE
viene applicata prima alle singole righe nelle tabelle o negli oggetti con valori di tabella nel diagramma . Vengono raggruppate solo le righe che soddisfano le condizioni nella clausolaWHERE
.La clausola
HAVING
viene quindi applicata alle righe del set di risultati. Nell'output della query vengono visualizzati solo i gruppi che soddisfano le condizioni diHAVING
. È possibile applicare una clausolaHAVING
solo alle colonne visualizzate anche nella clausola GROUP BY o in una funzione di aggregazione.
Specificare una clausola WHERE e HAVING su due tabelle collegate
Nota
Il database usato in questo articolo è il database pubs
, disponibile nei database di esempio Northwind e pubs per Microsoft SQL Server su GitHub.
Si supponga, ad esempio, di unire le tabelle titles
e publishers
per creare una query che mostra il prezzo medio del libro per un set di editori. Si vuole visualizzare il prezzo medio solo per un set specifico di editori , forse solo gli editori nello stato della California. E anche allora, si vuole vedere il prezzo medio solo se è superiore a $ 10,00.
È possibile stabilire la prima condizione includendo una clausola WHERE
, che rimuove tutti gli editori che non si trovano in California, prima di calcolare i prezzi medi. La seconda condizione richiede una clausola HAVING
, perché la condizione si basa sui risultati del raggruppamento e del riepilogo dei dati. L'istruzione SQL risultante potrebbe essere simile alla seguente:
SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10;
In Visual Database Tools di SQL Server Management Studio è possibile creare clausole HAVING
e WHERE
nel riquadro Criteri. Per impostazione predefinita, se si specifica una condizione di ricerca per una colonna, la condizione diventa parte della clausola HAVING
. Tuttavia, è possibile modificare la condizione in modo che sia una clausola WHERE
.
È possibile creare una clausola WHERE
e HAVING
che include la stessa colonna. A tale scopo, è necessario aggiungere la colonna due volte al riquadro Criteri, quindi specificare una volta come parte della clausola HAVING
e l'altra volta come parte della clausola WHERE
.
Specificare una condizione WHERE in una query di aggregazione
Specifica i gruppi per la query. Per informazioni dettagliate, vedere Raggruppare le righe nei risultati delle query (Visual Database Tools).
Se non è già presente nel riquadro Criteri , aggiungere la colonna su cui si vuole basare la condizione
WHERE
.Cancellare la colonna Output a meno che la colonna di dati non faccia parte della clausola GROUP BY o sia inclusa in una funzione di aggregazione.
Nella colonna Filtro specificare la condizione di
WHERE
. Il progettazione delle query e delle viste aggiunge la condizione alla clausolaHAVING
dell'istruzione SQL.Nota
La query illustrata nell'esempio per questa procedura unisce due tabelle,
titles
epublishers
.A questo punto della query, l'istruzione SQL contiene una clausola
HAVING
:SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id GROUP BY titles.pub_id HAVING publishers.state = 'CA'
Nella colonna Group By selezionare Where nell'elenco di opzioni di gruppo e riepilogo. La Progettazione query e la Progettazione viste rimuovono la condizione dalla clausola
HAVING
nell'istruzione SQL e la aggiungono alla clausolaWHERE
.L'istruzione SQL cambia per includere invece una clausola
WHERE
:SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id WHERE publishers.state = 'CA' GROUP BY titles.pub_id;
Contenuto correlato
- SELECT - HAVING (Transact-SQL)
- ordinare e raggruppare i risultati delle query (Visual Database Tools)
- Riepilogare i risultati delle query (Visual Database Tools)