sql comandos agregacao
DESCRIPTION
As funções de agregação executam um cálculo em um conjunto de valores e retornam um único valor. Com exceção de COUNT, as funções de agregação ignoram valores nulos. As funções de agregação normalmente são usadas com a cláusula GROUP BY da instrução SELECT.TRANSCRIPT
SQL – Comandos de Agregação
Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke
OPERADORES DE AGREGAÇÃO
COUNT ([DISTINCT] A) Número de valores da coluna A
SUM ([DISTINCT] A) Soma dos valores da coluna A
AVG ([DISTINCT] A) Média dos valores da coluna A
MAX(A) Maior valor da coluna A
MIN(A) Menor valor da coluna A
Exemplos: AVG, Sum
Dê a média das idades dos marinheiros SELECT AVG(S.Idade) FROM Sailors S Dê a soma das idades dos marinheiros com
status 10SELECT Sum(S.Idade)FROM Sailors SWHERE S.rating = 10
Exemplos: MAX, MIN (ERRADO)
Dê o nome e idade do marinheiro mais velho
SELECT S.Snome, MAX(S.Idade)
FROM Sailors S
Agregado não pode aparecer junto com outro atributoA MENOS QUE SE UTILIZE O OPERADORGROUP BY
Exemplos: MAX, MIN (CORRETO) Dê o nome e idade do marinheiro mais velho
SELECT S.Snome, S.Idade
FROM Sailors S
WHERE S.Idade = (SELECT Max(S2.Idade)
FROM Sailors S2)
Resultado da consulta é uma tabela com um únicoelemento (um número)Tabela é transformada em um número
Exemplos (NEM SEMPRE ACEITO POR ALGUNS SGBDs) Dê o nome e idade do marinheiro mais velho
SELECT S.Snome, S.Idade
FROM Sailors S
WHERE (SELECT Max(S2.Idade)
FROM Sailors S2) = S.Idade
Exemplo: COUNT
Conte o número de marinheiros
SELECT COUNT (*)FROM Sailors
Conte os nomes diferentes de marinheiros
SELECT COUNT( DISTINCT S.Snome)FROM Sailors
Substituindo ALL por MAX
Encontre o nome dos marinheiros que são mais velhos do que o marinheiro mais velho que tem status 10.
SELECT S.SnomeFROM Sailors SWHERE S.Idade >= ALL (SELECT S2.Idade FROM Sailors S2 WHERE S2.Status = 10)SELECT S.SnomeFROM Sailors SWHERE S.Idade >= (SELECT MAX(S2.Idade) FROM Sailors S2 WHERE S2.Status = 10)
Substituindo ANY por MIN
Encontre o nome dos marinheiros que são mais velhos do que algum marinheiro que tem status 10.
SELECT S.SnomeFROM Sailors SWHERE S.Idade >= ANY (SELECT S2.Idade FROM Sailors S2 WHERE S2.Status = 10)SELECT S.SnomeFROM Sailors SWHERE S.Idade >= (SELECT MIN(S2.Idade) FROM Sailors S2 WHERE S2.Status = 10)
Exercicio 6
Dê a soma das idades e a média dos status dos marinheiros que reservaram barcos vermelhos.
SELECT Sum(S.Idade), AVG(S.Status)FROM Sailors SWHERE S.Sid IN (SELECT R.Sid FROM Reservas R, Barcos B WHERE B.Bid = R.Bid AND B.Cor = ‘Vermelho’)
GROUP BY - HAVING
SELECT <lista-atributos>
FROM <lista-tabelas>
WHERE <condição sobre tuplas>
GROUP BY <lista-atributos-de-agrupamento>
HAVING <condição sobre os grupos>
Exemplo Para cada nível de status, dê a idade do marinheiro mais jovem
neste statusSailors
Sid Snome Status Idade22
29
313258
64
7174
8595
N1
N2
N3N4N5
N6
N7N6
N8N9
7
1
8810
7
109
33
45
33
55,525,535
35
1635
25,563,5
Sailors
Sid SnomeStatus Idade22293132586471748595
N1N2N3N4N5N6N7N6N8N9
7188107
10933
453355,525,53535163525,563,5
Resposta
Status M-Age7
1
8
10
9
3
35
33
25,5
16
35
25,5
SELECT S.Status, MIN(S.Idade) AS M-AgeFROM Sailors SGROUP BY S.Status
Exemplo
Para cada nível de status, dê a idade do marinheiro mais jovem neste status, excluindo-se o status 1
SELECT S.Status, Min(S.Idade) AS M-Age
FROM Sailors S
GROUP BY S.Status
HAVING S.Status <> 1
Exemplo
Para cada nível de status diferente de 1, dê a idade do marinheiro mais jovem neste status que reservou o barco ‘102’.
SELECT S.Status, Min(S.Idade) FROM Sailors S WHERE S.Sid in (Select R.Sid
FROM Reservas R WHERE R.Bid = ‘102’ )GROUP BY S.StatusHAVING S.Status <> 1
Exemplo
Encontre a idade do marinheiro mais jovem mas que possa votar (com pelo menos 18 anos) para cada nivel de status com ao menos dois marinheiros neste nível.
SELECT S.Status, Min(S.Idade)AS M-AgeFROM Sailors S WHERE S.Idade >= 18GROUP BY S.StatusHAVING COUNT(*) > 1
Sailors
Sid Snome Status Idade22
29
313258
64
7174
8595
N1
N2
N3N4N5
N6
N7N6
N8N9
7
1
8810
7
109
33
45
33
55,525,535
35
1635
25,563,5
M-Age
Resposta
Status
7
8
3
35
25,5
25,5
Exemplo Encontre a idade do marinheiro mais jovem mas
que possa votar (com pelo menos 18 anos) para cada nivel de status com ao menos dois marinheiros neste nível. Exiba a resposta ordenada por Status.
SELECT S.Status, Min(S.Idade) AS M-Age
FROM Sailors S
WHERE S.Idade >= 18
GROUP BY S.Status
HAVING COUNT(*) > 1
ORDER BY S.Status
M-Age
Resposta
Status
7
8
3
35
25,5
25,5
Exemplo Encontre a idade do marinheiro mais jovem mas
que possa votar (com pelo menos 18 anos) para cada nivel de status com ao menos dois marinheiros neste nível e onde todo marinheiro neste nível tenha no máximo 60 anos.
SELECT S.Status, Min(S.Idade)AS Min-AFROM Sailors S WHERE S.Idade >= 18GROUP BY S.StatusHAVING COUNT(*) > 1 AND EVERY (S.Idade <= 60)
Sailors
Sid Snome Status Idade22
29
313258
64
7174
8595
N1
N2
N3N4N5
N6
N7N6
N8N9
7
1
88
10
7
109
33
45
33
55,525,535
35
1635
25,563,5
Min-A
Resposta
Status
7
8
35
25,5
97 N10 3 24
A consulta a seguir é equivalente à precedente ?
SELECT S.Status, Min(S.Idade)
FROM Sailors S
WHERE S.Idade >= 18 AND S.Idade <= 60
GROUP BY S.Status
HAVING COUNT(*) > 1
Resposta : Não são equivalentes !
Encontre a idade e status dos marinheiros mais jovens que possam votar (com pelo menos 18 anos) e que tenham no
máximo 60 anos, agrupados por status, onde cada grupo tem ao
menos dois marinheiros nestas condições
SELECT S.Status, Min(S.Idade) AS Min-AGE
FROM Sailors S WHERE S.Idade >= 18 AND S.Idade <= 60
GROUP BY S.StatusHAVING COUNT(*) > 1
Sailors
SidSnome Status Idade22
29
313258
64
7174
8595
N1
N2
N3N4N5
N6
N7N6
N8N9
7
1
88
10
7
109
33
45
33
55,525,535
35
1635
25,563,5
Min-A
Resposta
Status
7
8
35
25,5
97 N10 3 24
3 24
Exemplo Encontre a idade do marinheiro mais jovem mas
que possa votar (com pelo menos 18 anos) para cada nivel de status com ao menos dois marinheiros neste nível e onde pelo menos um marinheiro no nível tenha idade inferior a 60 anos.
SELECT S.Status, Min(S.Idade)
FROM Sailors S
WHERE S.Idade >= 18
GROUP BY S.Status
HAVING COUNT(*) > 1 AND ANY (S.Idade <= 60)
Exercício 7
Para cada barco vermelho, dê o número de reservas que foram feitas para este barco.
SELECT COUNT(*) AS ContadorReserva
FROM Barcos B, Reservas R
WHERE R.Bid = R. Bid and B.Cor = ‘Verm’
GROUP BY B.Bid
Exercicio 8 Encontre a média de idade dos
marinheiros com mais de 18 anos, para cada nível de status que tem ao menos dois marinheiros.
SELECT S.Status, AVG(S.Idade) AS Min-AGEFROM Sailors SWHERE S.Idade > 18GROUP BY S.StatusHAVING COUNT(*) > 1
Consultas dentro do comando FROM Dê os status para os quais a média de idades dos
marinheiros neste status é igual à menor das médias de idades de cada status.
SELECT Temp.StatusFROM (SELECT S.Status, AVG(S.Idade) FROM Sailors S GROUP BY S.Status) AS TempWHERE Temp.AVG = (SELECT MIN (Temp.AVG) FROM Temp)
Resumo Geral do uso de AgregadosSELECT <lista-seleção>FROM <lista-tabelas>WHERE <condição-sobre-tuplas>GROUP BY <lista-atributos-de-agrupamento>HAVING <condição-sobre-os-grupos>
1. lista-seleção = lista de atributos + lista de termos do tipo operador(atributo) AS novo-atributo
2. Todo atributo que aparece em “lista de atributos” deve aparecer na lista-atributos-de-agrupamento.
3. Atributos que aparecem em condição-sobre-os-grupos devem aparecer em “operador(atributo)” ou em lista-atributos-de-agrupamento.
Exemplo
SELECT ,Min( ) AS Min-Age
FROM Sailors S
WHERE S.Idade >= 18
GROUP BY
HAVING > 5 AND
EVERY ( <= 60)
S.Status
S.Status
S.Idade
S.IdadeS.Status
Particularidade de SQL 1999
Se a lista-atributos-de-agrupamento contém a chave primária de uma tabela da lista-tabelas então cada coluna desta tabela só tem um único valor em cada grupo. Em SQL1999, tais colunas podem aparecer na lista de atributos da lista-seleção.
SELECT S.Status, S.Snome, AVG(S.Idade) AS Min-AGE
FROM Sailors S
GROUP BY S.Sid
HAVING COUNT(*) > 1
Chave de SailorsLogo: os grupos têm um único elemento