Você está na página 1de 26

SQL Comandos de

Agregao
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
SUM ([DISTINCT] A)
Soma dos valores da coluna A
AVG ([DISTINCT] A)
Mdia dos valores da coluna A
MAX(A)
Maior valor da coluna A
MIN(A)
Menor valor da coluna A

Exemplos: AVG, Sum
D a mdia das idades dos marinheiros
SELECT AVG(S.Idade)
FROM Sailors S

D a soma das idades dos marinheiros com
status 10
SELECT Sum(S.Idade)
FROM Sailors S
WHERE 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 no pode aparecer junto com outro atributo
A MENOS QUE SE UTILIZE O OPERADOR
GROUP 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 nico
elemento (um nmero)
Tabela transformada em um nmero
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 nmero 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 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)

Substituindo ANY por MIN
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
Sid Snome Status Idade
22
29
31
32
58
64
71
74
85
95
N1
N2
N3
N4
N5
N6
N7
N6
N8
N9
7
1
8
8
10
7
10
9
3
3
45
33
55,5
25,5
35
35
16
35
25,5
63,5
Sailors
Sid
Snome Status Idade
22
29
31
32
58
64
71
74
85
95
N1
N2
N3
N4
N5
N6
N7
N6
N8
N9
7
1
8
8
10
7
10
9
3
3
45
33
55,5
25,5
35
35
16
35
25,5
63,5
Resposta
Status M-Age
7
1
8
10
9
3
35
33
25,5
16
35
25,5
SELECT S.Status, MIN(S.Idade)
AS M-Age
FROM Sailors S
GROUP BY S.Status
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.

SELECT S.Status, Min(S.Idade)
AS M-Age
FROM Sailors S
WHERE S.Idade >= 18
GROUP BY S.Status
HAVING COUNT(*) > 1

Sailors
Sid Snome Status Idade
22
29
31
32
58
64
71
74
85
95
N1
N2
N3
N4
N5
N6
N7
N6
N8
N9
7
1
8
8
10
7
10
9
3
3
45
33
55,5
25,5
35
35
16
35
25,5
63,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 nvel. 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 nvel e onde todo marinheiro neste nvel
tenha no mximo 60 anos.

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)


Sailors
Sid Snome Status Idade
22
29
31
32
58
64
71
74
85
95
N1
N2
N3
N4
N5
N6
N7
N6
N8
N9
7
1
8
8
10
7
10
9
3
3
45
33
55,5
25,5
35
35
16
35
25,5
63,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 : No so equivalentes !
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
SELECT S.Status, Min(S.Idade) AS
Min-AGE

FROM Sailors S
WHERE S.Idade >= 18 AND S.Idade
<= 60

GROUP BY S.Status
HAVING COUNT(*) > 1

Sailors
Sid Snome Status Idade
22
29
31
32
58
64
71
74
85
95
N1
N2
N3
N4
N5
N6
N7
N6
N8
N9
7
1
8
8
10
7
10
9
3
3
45
33
55,5
25,5
35
35
16
35
25,5
63,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 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
Consultas dentro do comando FROM
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)

Resumo Geral do uso de Agregados
SELECT <lista-seleo>
FROM <lista-tabelas>
WHERE <condio-sobre-tuplas>
GROUP BY <lista-atributos-de-agrupamento>
HAVING <condio-sobre-os-grupos>

1. lista-seleo = 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 condio-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.Idade
S.Status
Particularidade de SQL 1999
Se a lista-atributos-de-agrupamento contm a chave primria de
uma tabela da lista-tabelas ento cada coluna desta tabela s tem
um nico valor em cada grupo. Em SQL1999, tais colunas podem
aparecer na lista de atributos da lista-seleo.

SELECT S.Status, S.Snome, AVG(S.Idade) AS
Min-AGE
FROM Sailors S
GROUP BY S.Sid
HAVING COUNT(*) > 1


Chave de Sailors
Logo: os grupos tm um
nico elemento

Você também pode gostar