O que faz a cláusula HAVING numa consulta?
A cláusula HAVING é como WHERE mas funciona em registos agrupados devolvidos por um GRUPO BY.
HAVING aplica-se a registos de grupo resumidos, enquanto que WHERE se aplica a registos individuais.
Apenas os grupos que cumprem os critérios HAVING serão devolvidos.
HAVING requer que uma cláusula GROUP BY esteja presente.
Bem ONDE e HAVING podem ser utilizados na mesma consulta ao mesmo tempo.
A sintaxe SQL HAVING
A sintaxe geral é
SELECT column-names FROM table-name WHERE condition GROUP BY column-namesHAVING condition
A sintaxe geral com ORDER BY é:
SELECT column-names FROM table-name WHERE condition GROUP BY column-namesHAVING condition ORDER BY column-names
th>CUSTOMERbr>>p>Id>/p>>br>>p>PrimeiroNomebr>>p>PrimeiroNomebr>p>Cidadebr>>p>Paísbr>p>Telefonebr>>>/div>
SQL GROUP BY Exemplos
Problema: Listar o número de clientes em cada país.
Inclua apenas os países com mais de 10 clientes.
Inclua apenas os países com mais de 10 clientes.
SELECT COUNT(Id), Country FROM Customer GROUP BY CountryHAVING COUNT(Id) > 10
Resultado: 3 registos
Count | Country |
---|---|
11 | France |
11 | Alemanha |
13 | USA |
>br>>>>cliente>br>>p>Id>/p>>br>>p>p>PrimeiroNome>br>>p>PrimeiroNomebr>>p>Cidadebr>>p>Paísbr>p>Telefonebr>>>>br>>/div>
Problema: Lista o número de clientes em cada país,
excepto os EUA, classificados de alto a baixo.
incluir apenas os países com 9 ou mais clientes.
excepto os EUA, classificados de alto a baixo.
incluir apenas os países com 9 ou mais clientes.
SELECT COUNT(Id), Country FROM Customer WHERE Country 'USA' GROUP BY CountryHAVING COUNT(Id) >= 9 ORDER BY COUNT(Id) DESC
Resultado: 3 registos
Count | Country |
---|---|
11 | France |
11 | Alemanha |
9 | Brasil |
>ordembr>>p>Idbr>p>p>Data de Ordembr>p>p>Número de Ordembr>p>p>Clientebr>>p>p>TotalAmountbr>>>>cliente>br>>p>>Id>/p>>br>>p>PrimeiroNomebr>p>p>PrimeiroNomebr>p>PrimeiroNomebr>p>Cidadebr>>p>Paísbr>>p>p>Telefonebr>>/div>
Problema: Listar todos os clientes com encomendas médias
entre $1000 e $1200.
entre $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
Resultado: 10 registos
Average | FirstName | LastName | Alexander | Feuer |
---|---|---|
Thomas | Hardy | |
1107.806666 | Koskitalo | |
1174.945454 | Janete | |
Antonio | ||
Carine |