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 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)

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 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

SnomeStatus Idade N1 7 45 33 N2 1 8 55,5 N3 N4 25,5 8 35 N5 10 35 N6 7 10 N7 16 N6 9 35 N8 3 25,5 3 N9 63,5

10
9 1 3

16
35 33 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.
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)

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 !
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

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

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

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-deagrupamento.

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)

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 Chave de Sailors GROUP BY S.Sid Logo: os grupos tm um nico elemento HAVING COUNT(*) > 1