# HAVING in SQL: come filtrare risultati sulla base di funzioni aggregate

HAVING in SQL è una condizione che può essere applicata a valori già raggruppati. Si usa con funzioni aggregate e serve a restringere ulteriormente i risultati.

## Cos’è HAVING in SQL?

Oltre a WHERE, nello [Structured Query Language](https://www.ionos.it/digitalguide/server/know-how/che-cose-sql/) esiste un’ulteriore clausola comunemente usata. HAVING in SQL è stata aggiunta per filtrare dati sulla base di specifici criteri. La condizione si dichiara mediante il [comando SQL](https://www.ionos.it/digitalguide/server/configurazione/comandi-sql/) `SELECT` e l’espressione [SQL GROUP BY](https://www.ionos.it/digitalguide/server/configurazione/sql-group-by/). Quest’ultima ha la funzione di raggruppare i risultati, mentre HAVING delimita le quantità **con l’aiuto di diverse funzioni aggregate**. Questa clausola è stata introdotta perché WHERE non è in grado di interagire con le funzioni aggregate [SQL AVG()](https://www.ionos.it/digitalguide/server/configurazione/sql-avg/), [SQL COUNT()](https://www.ionos.it/digitalguide/server/configurazione/sql-count/), `MAX()`, `MIN()` o `SUM()`. HAVING si specifica dopo la condizione `WHERE` (se disponibile) e `GROUP BY`, ma prima di `ORDER BY`.

## Sintassi e funzionamento

Per capire il funzionamento e l’utilità di HAVING in SQL, può essere utile dare un’occhiata alla sintassi della clausola. Il relativo codice si scrive così:

```sql
SELECT nome_della(e)_colonna(e)
FROM nome_della_tabella
WHERE condizione
GROUP BY nome_della(e)_colonna(e)
HAVING condizione
ORDER BY nome_della(e)_colonna(e);
```

Spesso è possibile applicare una funzione aggregata su una o più colonne. Quindi si specifica il nome della tabella ai fini della localizzazione. La condizione `WHERE` **è opzionale**. `GROUP BY` raggruppa valori identici, mentre HAVING consente di delimitarli in modo ancora più preciso e di ordinarli secondo le proprie preferenze tramite `ORDER BY`.

## Esempio della condizione

Spieghiamo il funzionamento di HAVING in SQL con un esempio pratico. A questo proposito creiamo una piccola tabella denominata “Elenco\_clienti”, che contiene le colonne “Numero\_cliente”, “Cognome”, “Città” e “Articoli”:

<table>
  <thead>
    <tr>
      <th>Numero\_cliente</th>
      <th>Cognome</th>
      <th>Città</th>
      <th>Articoli</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1427</td>
      <td>Rossi</td>
      <td>Roma</td>
      <td>13</td>
    </tr>
    <tr>
      <td>1377</td>
      <td>Bianchi</td>
      <td>Milano</td>
      <td>9</td>
    </tr>
    <tr>
      <td>1212</td>
      <td>Ferrari</td>
      <td>Milano</td>
      <td>15</td>
    </tr>
    <tr>
      <td>1431</td>
      <td>Costa</td>
      <td>Firenze</td>
      <td>22</td>
    </tr>
    <tr>
      <td>1118</td>
      <td>Russo</td>
      <td>Roma</td>
      <td>10</td>
    </tr>
  </tbody>
</table>

Ora usiamo HAVING in SQL per scoprire quanti clienti di Milano hanno ordinato 10 o più articoli. A tal proposito usiamo la seguente sintassi e specifichiamo la quantità con l’aiuto di un [alias SQL](https://www.ionos.it/digitalguide/server/configurazione/alias-sql/) come “QuantitàOrdini”:

```sql
SELECT Città, COUNT(Città) AS QuantitàOrdini
FROM Elenco_clienti
WHERE Città = 'Milano'
GROUP BY Città, Articoli
HAVING Articoli > 10;
```

Il relativo output è il seguente:

<table>
  <thead>
    <tr>
      <th>Città</th>
      <th>QuantitàOrdini</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Milano</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

## La condizione in combinazione con INNER JOIN

Puoi combinare HAVING in SQL anche con la parola chiave `INNER JOIN`. A tal proposito creiamo una seconda tabella dal titolo “Articoli\_01” contenente il numero di volte che un articolo è stato ordinato e la data di ordine. Nell’output presentato di seguito, la tabella contiene quindi il numero dell’ordine, il numero cliente, la quantità e la data dell’ordine:

<table>
  <thead>
    <tr>
      <th>Numero\_dell’ordine</th>
      <th>Numero\_cliente</th>
      <th>Quantità</th>
      <th>Data</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>00283</td>
      <td>1427</td>
      <td>4</td>
      <td>2024-01-15</td>
    </tr>
    <tr>
      <td>00284</td>
      <td>1211</td>
      <td>7</td>
      <td>2024-01-19</td>
    </tr>
    <tr>
      <td>00285</td>
      <td>1275</td>
      <td>15</td>
      <td>2024-01-29</td>
    </tr>
    <tr>
      <td>00286</td>
      <td>1431</td>
      <td>10</td>
      <td>2024-02-01</td>
    </tr>
    <tr>
      <td>00287</td>
      <td>1427</td>
      <td>9</td>
      <td>2024-02-05</td>
    </tr>
  </tbody>
</table>

Ora possiamo istruire il sistema in modo tale da visualizzare tutti i clienti che hanno effettuato più di un ordine. Il relativo codice è:

```sql
SELECT Elenco_clienti.Cognome, COUNT(Articoli_01.Numero_dell’ordine) AS QuantitàOrdini
FROM (Articoli_01
INNER JOIN Elenco_clienti ON Articoli_01.Numero_cliente = Elenco_clienti.Numero_cliente)
GROUP BY Nome
HAVING COUNT(Articoli_01.Numero_dell’ordine) > 1;
```

L’output ottenuto è il seguente:

<table>
  <thead>
    <tr>
      <th>Cognome</th>
      <th>QuantitàOrdini</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Rossi</td>
      <td>2</td>
    </tr>
  </tbody>
</table>

## Alternativa a HAVING in SQL

Un’alternativa a HAVING nel linguaggio SQL è WHERE. Le due opzioni, tuttavia, non possono essere impiegate in modo identico: WHERE si applica a singole voci e può essere utilizzata in combinazione con SELECT, DELETE o UPDATE. HAVING, invece, è destinata **esclusivamente alle voci raggruppate** e può essere utilizzata solo con SELECT. WHERE si usa prima di GROUP BY e HAVING dopo. Inoltre, HAVING può essere usata solo assieme a funzioni aggregate.

Consiglio Un server adatto alle tue esigenze personali: grazie all’[hosting SQL server](https://www.ionos.it/cloud/sql-server-hosting "Hosting SQL server di IONOS") di IONOS puoi scegliere fra MSSQL, MySQL o MariaDB e approfittare di una solida architettura di sicurezza, prestazioni eccezionali e consulenza personalizzata.


This is a markdown version of: [https://www.ionos.it/digitalguide/server/configurazione/sql-having/](https://www.ionos.it/digitalguide/server/configurazione/sql-having/) for AI/LLM consumption.