Agregaç˜oes • os operadores SUM, MIN, MAX, AVG, e COUNT

Transcrição

Agregaç˜oes • os operadores SUM, MIN, MAX, AVG, e COUNT
Agregações
• os operadores SUM, MIN, MAX, AVG, e
COUNT, podem ser aplicados a um atributo de uma tabela.
• os operadores aparecem na cláusula SELECT. O resultado é um valor agregado
para o respectivo atributo.
• COUNT(*) conta o número de tuplos.
1
Exemplos
Qual a duração média dos filmes da Disney?
SELECT AVG(duracao)
FROM Filmes
WHERE nomeEstudio = ’Disney’;
avg
113.667
Quantos actores existem na tabela de Actores?
SELECT COUNT(*)
FROM Actores;
count
18
2
NULLs são ignorados
• um valor NULL não conta para uma soma,
média ou contagem.
• um valor NULL nunca pode ser o mı́nimo
ou máximo de uma coluna.
• mas se todos os valores de uma coluna
forem NULL, então o resultado da agregação
é NULL.
3
Exemplo
--- número de filmes da Disney
-SELECT COUNT(*)
FROM Filmes
WHERE nomeEstudio = ’Disney’;
--- número de filmes da Disney
-- cuja duraç~
ao é conhecida
-SELECT COUNT(duracao)
FROM Filmes
WHERE nomeEstudio = ’Disney’;
4
Agrupar
• após um SELECT-FROM-WHERE podemos utilizar GROUP BY seguido de uma
lista de atributos.
• o resultado do SELECT-FROM-WHERE é
agrupado de acordo com os valores desses
atributos.
• as agregações são aplicadas a cada grupo.
5
Exemplo
Quantos filmes é que cada estúdio já produziu?
--- número de filmes da Disney
-SELECT nomeEstudio, COUNT(*)
FROM Filmes
GROUP BY nomeEstudio;
nomeEstudio
Disney
Fox
Paramount
Universal
Warner Brothers
count
3
8
5
5
1
6
Como funciona?
nome
Mighty Ducks
Lion King
Pocahontas
Star Wars
Empire Strikes Back
Return of the Jedi
Total Recall
Top Gun
Moulin Rouge
JFK
Dances with Wolves
Wayne’s World
Addams Family
Gone With the Wind
Basic Instinct
Eyes Wide Shut
King Kong
King Kong
Indiana Jones
The Fugitive
Bridges of Madison County
Batman Returns
ano
1991
1994
1995
1977
1980
1983
1990
1986
2001
1996
1990
1992
1991
1939
1986
1999
1933
1976
1981
1993
1995
1992
duracao
104
122
115
124
143
165
110
145
124
130
132
95
102
181
100
148
130
130
120
147
122
aCores
t
t
t
t
t
t
t
t
t
t
t
t
t
f
t
t
f
t
t
t
t
t
nomeEstudio
Disney
Disney
Disney
Fox
Fox
Fox
Fox
Fox
Fox
Fox
Fox
Paramount
Paramount
Paramount
Paramount
Paramount
Universal
Universal
Universal
Universal
Universal
Warner Brothe
• COUNT(*) é aplicado a cada grupo.
7
Outro exemplo
Quantos filmes é que cada actriz fez?
SELECT nomeActor AS ’actriz’, COUNT(*)
FROM Participa, Actores
WHERE nomeActor = nome
AND sexo=’f’
GROUP BY nomeActor;
actriz
Carrie Fisher
Dana Carvey
Meryl Streep
Michelle Pfeiffer
Nicole Kidman
Sharon Stone
count
3
1
1
1
2
2
8
Mais um exemplo
Qual a duração máxima e mı́nima de cada
estúdio?
SELECT nomeEstudio AS ’estudio’,
MAX(duracao), MIN(duracao)
FROM Filmes
GROUP BY nomeEstudio;
estudio
Disney
Fox
Paramount
Universal
Warner Brothers
max
122
165
181
147
122
min
104
110
95
120
122
9
Restrições nos elementos a especificar
em SELECT
• se usarmos um operador de agregação, então
cada elemento especificado em SELECT
tem de ser:
1. uma agregação, ou
2. um atributo especificado em GROUP
BY.
10
Exemplo de um query inválido
Qual a filme da Disney com maior duração?
-- incorrecto
SELECT nome, MAX(duracao)
FROM Filmes
WHERE nomeEstudio=’Disney’;
• a query é inválida.
• nome não é uma agregação, e também não
aparece especificado em GROUP BY.
11
Porque é que é inválido?
-- incorrecto
SELECT nome, MAX(duracao)
FROM Filmes
WHERE nomeEstudio=’Disney’;
nome
Mighty Ducks
Lion King
Pocahontas
ano
1991
1994
1995
duracao
104
122
115
nomeEstudio
Disney
Disney
Disney
...
...
...
...
• MAX(duracao) → 122.
nome → ???
• Não faz sentido seleccionar nome.
12
Cláusula HAVING
• podemos ter HAVING <condição> a seguir
a uma cláusula GROUP BY.
• a condição é aplicada a cada grupo.
• os grupos que satisfazem a condição vão
para o output, os outros são eliminados.
13
Exemplo
Quais as actrizes que fizeram mais do que 1
filme?
SELECT nomeActor AS ’actriz’, COUNT(*)
FROM Participa, Actores
WHERE nomeActor = nome
AND sexo=’f’
GROUP BY nomeActor
HAVING COUNT(*) > 1;
actriz
Carrie Fisher
Nicole Kidman
Sharon Stone
count
3
2
2
14