Cosa fa la clausola HAVING in una query?
La clausola HAVING è come WHERE ma opera su record raggruppati restituiti da un GROUP BY.
HAVING si applica ai record di gruppo riassunti, mentre WHERE si applica ai record individuali.
Solo i gruppi che soddisfano i criteri HAVING saranno restituiti.
HAVING richiede che sia presente una clausola GROUP BY.
Entrambi i criteri WHERE e HAVING possono essere usati contemporaneamente nella stessa query.
La sintassi SQL HAVING
La sintassi generale è
SELECT column-names FROM table-name WHERE condition GROUP BY column-namesHAVING condition
La sintassi generale con ORDER BY è:
SELECT column-names FROM table-name WHERE condition GROUP BY column-namesHAVING condition ORDER BY column-names
Id
FirstName
LastName
City
Country
Phone
SQL GROUP BY Esempi
Problema: Elencare il numero di clienti in ogni paese.
Includere solo i paesi con più di 10 clienti.
Includere solo i paesi con più di 10 clienti.
SELECT COUNT(Id), Country FROM Customer GROUP BY CountryHAVING COUNT(Id) > 10
Risultato: 3 record
| Conte | Paese |
|---|---|
| 11 | Francia |
| 11 | Germania |
| 13 | USA |
Id
Nome
Cognome
Città
Paese
Telefono
Problema: Elenca il numero di clienti in ogni paese,
eccetto gli USA, ordinati dal più alto al più basso.
Inserisci solo i paesi con 9 o più clienti.
eccetto gli USA, ordinati dal più alto al più basso.
Inserisci solo i paesi con 9 o più clienti.
SELECT COUNT(Id), Country FROM Customer WHERE Country 'USA' GROUP BY CountryHAVING COUNT(Id) >= 9 ORDER BY COUNT(Id) DESC
Risultato: 3 record
| Conto | Paese |
|---|---|
| 11 | Francia |
| 11 | Germania |
| 9 | Brasile |
Id
OrderDate
OrderNumber
CustomerId
TotalAmount
Id
FirstName
LastName
City
Country
Phone
Problema: Elencare tutti i clienti con ordini medi
tra $1000 e $1200.
tra $1000 e $1200.
SELECT AVG(TotalAmount), FirstName, LastName FROM O JOIN Customer C ON O.CustomerId = C.Id GROUP BY FirstName, LastNameHAVING AVG(TotalAmount) BETWEEN 1000 AND 1200
Risultato: 10 record
| Media | Nome | Cognome |
|---|---|---|
| 1081.215000 | Miguel | Angel Paolino |
| 1063.420000 | Isabel | de Castro |
| 1008.440000 | Alexander | Feuer |
| 1062.038461 | Thomas | Hardy |
| 1107.806666 | Pirkko | Koskitalo |
| 1174.945454 | Janete | Limeira |
| 1073.621428 | Antonio | Moreno |
| 1065.385000 | Rita | Müller |
| 1183.010000 | José | Pedro Freyre |
| 1057.386666 | Carine | Schmitt |