Profa. Sandra de Amo Capitulo 5 Livro Texto Database Management Systems Ramakrishnan - Gehrke
OPERADORES DE AGREGAO
COUNT ([DISTINCT] A)
Nmero de valores da coluna A Soma dos valores da coluna A Mdia dos valores da coluna A Maior valor da coluna A Menor valor da coluna A
SUM ([DISTINCT] A)
AVG ([DISTINCT] A)
MAX(A)
MIN(A)
Agregado no pode aparecer junto com outro atributo A MENOS QUE SE UTILIZE O OPERADOR GROUP BY
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 nico elemento (um nmero) Tabela transformada em um nmero
SELECT S.Snome, S.Idade FROM Sailors S WHERE (SELECT Max(S2.Idade) FROM Sailors S2) = S.Idade
Exemplo: COUNT
Encontre o nome dos marinheiros que so mais velhos do que o marinheiro mais velho que tem status 10.
SELECT S.Snome FROM Sailors S WHERE S.Idade >= ALL (SELECT S2.Idade FROM Sailors S2 WHERE S2.Status = 10) SELECT S.Snome FROM Sailors S WHERE S.Idade >= (SELECT MAX(S2.Idade) FROM Sailors S2 WHERE S2.Status = 10)
Encontre o nome dos marinheiros que so mais velhos do que algum marinheiro que tem status 10.
SELECT S.Snome FROM Sailors S WHERE S.Idade >= ANY (SELECT S2.Idade FROM Sailors S2 WHERE S2.Status = 10) SELECT S.Snome FROM Sailors S WHERE S.Idade >= (SELECT MIN(S2.Idade) FROM Sailors S2 WHERE S2.Status = 10)
Exercicio 6
D a soma das idades e a mdia dos status dos marinheiros que reservaram barcos vermelhos.
SELECT Sum(S.Idade), AVG(S.Status) FROM Sailors S WHERE 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 <condio sobre tuplas> GROUP BY <lista-atributos-de-agrupamento> HAVING <condio sobre os grupos>
Exemplo
Para cada nvel de status, d a idade do marinheiro mais jovem neste status
Sailors Sailors
Sid Snome Status Idade 22 N1 7 45 35 7 64 N6 8 31 N3 55,5 25,5 8 32 N4 10 58 N5 35 10 71 N7 16 35 74 N6 9 29 N2 33 1 3 85 N8 25,5 95 N9 3 63,5
Resposta
Status M-Age 7 35 8 25,5
Sid 22 29 31 32 58 64 71 74 85 95
10
9 1 3
16
35 33 25,5
Exemplo
Para cada nvel 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 nvel 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.Status HAVING 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 nvel.
Sailors Resposta Status 7
M-Age Sid Snome Status Idade 22 N1 7 45 35 7 64 N6 8 31 N3 55,5 25,5 8 32 N4 58 N5 10 35 71 N7 10 16 9 35 74 N6 29 N2 33 1 25,5 3 85 N8 95 N9 3 63,5
SELECT S.Status, Min(S.Idade) AS M-Age FROM Sailors S WHERE S.Idade >= 18 GROUP BY S.Status HAVING COUNT(*) > 1
35
8
3
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 nvel. Exiba a resposta ordenada por Status.
Resposta
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
Status M-Age
3 7 8 25,5 35 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 nvel e onde todo marinheiro neste nvel tenha no mximo 60 anos.
Sailors Resposta Status Min-A 35 7 8 25,5
Sid Snome Status Idade 22 N1 7 45 7 64 N6 35 8 55,5 31 N3 32 N4 25,5 8 58 N5 10 35 71 N7 10 16 9 74 N6 35 29 N2 1 33 3 25,5 85 N8 63,5 3 95 N9 97 N10 24 3
SELECT S.Status, Min(S.Idade) AS Min-A FROM Sailors S WHERE S.Idade >= 18 GROUP BY S.Status HAVING COUNT(*) > 1 AND EVERY (S.Idade <= 60)
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 : No so equivalentes !
SELECT S.Status, Min(S.Idade) AS Min-AGE FROM Sailors S WHERE S.Idade >= 18 AND S.Idade <= 60
Sailors
Sid Snome Status Idade 22 N1 7 45 7 64 N6 35 8 55,5 31 N3 32 N4 25,5 8 58 N5 10 35 16 71 N7 10 9 74 N6 35 1 33 29 N2 3 25,5 85 N8 95 N9 3 63,5 97 N10 3 24
Resposta
Status Min-A 35 7
8 3 25,5 24
Encontre a idade e status dos marinheiros mais jovens que possam votar (com pelo menos 18 anos) e que tenham no mximo 60 anos, agrupados por status, onde cada grupo tem ao menos dois marinheiros nestas condies
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 nvel e onde pelo menos um marinheiro no nvel 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)
Exerccio 7
Para cada barco vermelho, d o nmero 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 mdia de idade dos marinheiros com mais de 18 anos, para cada nvel de status que tem ao menos dois marinheiros.
SELECT S.Status, AVG(S.Idade) AS Min-AGE FROM Sailors S WHERE S.Idade > 18 GROUP BY S.Status HAVING COUNT(*) > 1
D os status para os quais a mdia de idades dos marinheiros neste status igual menor das mdias de idades de cada status.
SELECT Temp.Status FROM (SELECT S.Status, AVG(S.Idade) FROM Sailors S GROUP BY S.Status) AS Temp WHERE Temp.AVG = (SELECT MIN (Temp.AVG) FROM Temp)
Exemplo
SELECT S.Status ,Min( S.Idade ) AS Min-Age FROM Sailors S WHERE S.Idade >= 18 GROUP BY S.Status HAVING S.Status > 5 AND EVERY ( S.Idade <= 60)
SELECT S.Status, S.Snome, AVG(S.Idade) AS Min-AGE FROM Sailors S Chave de Sailors GROUP BY S.Sid Logo: os grupos tm um nico elemento HAVING COUNT(*) > 1