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