SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management...

26
SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

Transcript of SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management...

Page 1: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

SQL – Comandos de Agregação

Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke

Page 2: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

OPERADORES DE AGREGAÇÃO COUNT ([DISTINCT] A)

Número de valores da coluna A SUM ([DISTINCT] A)

Soma dos valores da coluna A AVG ([DISTINCT] A)

Média dos valores da coluna A MAX(A)

Maior valor da coluna A MIN(A)

Menor valor da coluna A

Page 3: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Exemplos: AVG, Sum

Dê a média das idades dos marinheiros SELECT AVG(S.Idade) FROM Sailors S Dê a soma das idades dos marinheiros com

status 10SELECT Sum(S.Idade)FROM Sailors SWHERE S.rating = 10

Page 4: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Exemplos: MAX, MIN (ERRADO) Dê o nome e idade do marinheiro mais velho

SELECT S.Snome, MAX(S.Idade)

FROM Sailors S

Agregado não pode aparecer junto com outro atributoA MENOS QUE SE UTILIZE O OPERADORGROUP BY

Page 5: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

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 únicoelemento (um número)Tabela é transformada em um número

Page 6: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

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

Page 7: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Exemplo: COUNT

Conte o número de marinheiros

SELECT COUNT (*)FROM Sailors

Conte os nomes diferentes de marinheiros

SELECT COUNT( DISTINCT S.Snome)FROM Sailors

Page 8: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Substituindo ALL por MAX

Encontre o nome dos marinheiros que são mais velhos do que o marinheiro mais velho que tem status 10.

SELECT S.SnomeFROM Sailors SWHERE S.Idade >= ALL (SELECT S2.Idade FROM Sailors S2 WHERE S2.Status = 10)SELECT S.SnomeFROM Sailors SWHERE S.Idade >= (SELECT MAX(S2.Idade) FROM Sailors S2 WHERE S2.Status = 10)

Page 9: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Substituindo ANY por MIN

Encontre o nome dos marinheiros que são mais velhos do que algum marinheiro que tem status 10.

SELECT S.SnomeFROM Sailors SWHERE S.Idade >= ANY (SELECT S2.Idade FROM Sailors S2 WHERE S2.Status = 10)SELECT S.SnomeFROM Sailors SWHERE S.Idade >= (SELECT MIN(S2.Idade) FROM Sailors S2 WHERE S2.Status = 10)

Page 10: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Exercicio 6

Dê a soma das idades e a média dos status dos marinheiros que reservaram barcos vermelhos.

SELECT Sum(S.Idade), AVG(S.Status)FROM Sailors SWHERE S.Sid IN (SELECT R.Sid FROM Reservas R, Barcos B WHERE B.Bid = R.Bid AND B.Cor = ‘Vermelho’)

Page 11: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

GROUP BY - HAVING

SELECT <lista-atributos>

FROM <lista-tabelas>

WHERE <condição sobre tuplas>

GROUP BY <lista-atributos-de-agrupamento>

HAVING <condição sobre os grupos>

Page 12: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Exemplo Para cada nível de status, dê a idade do marinheiro mais jovem

neste statusSailors

Sid Snome Status Idade22

29

313258

64

7174

8595

N1

N2

N3N4N5

N6

N7N6

N8N9

7

1

8810

7

109

33

45

33

55,525,535

35

1635

25,563,5

Sailors

Sid SnomeStatus Idade22293132586471748595

N1N2N3N4N5N6N7N6N8N9

7188107

10933

453355,525,53535163525,563,5

Resposta

Status M-Age7

1

8

10

9

3

35

33

25,5

16

35

25,5

SELECT S.Status, MIN(S.Idade) AS M-AgeFROM Sailors SGROUP BY S.Status

Page 13: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Exemplo

Para cada nível 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

Page 14: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Exemplo

Para cada nível 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.StatusHAVING S.Status <> 1

Page 15: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

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 nível.

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

Sailors

Sid Snome Status Idade22

29

313258

64

7174

8595

N1

N2

N3N4N5

N6

N7N6

N8N9

7

1

8810

7

109

33

45

33

55,525,535

35

1635

25,563,5

M-Age

Resposta

Status

7

8

3

35

25,5

25,5

Page 16: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

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 nível. 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

Page 17: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

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 nível e onde todo marinheiro neste nível tenha no máximo 60 anos.

SELECT S.Status, Min(S.Idade)AS Min-AFROM Sailors S WHERE S.Idade >= 18GROUP BY S.StatusHAVING COUNT(*) > 1 AND EVERY (S.Idade <= 60)

Sailors

Sid Snome Status Idade22

29

313258

64

7174

8595

N1

N2

N3N4N5

N6

N7N6

N8N9

7

1

88

10

7

109

33

45

33

55,525,535

35

1635

25,563,5

Min-A

Resposta

Status

7

8

35

25,5

97 N10 3 24

Page 18: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

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

Page 19: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Resposta : Não são equivalentes !

Encontre a idade e status dos marinheiros mais jovens que possam votar (com pelo menos 18 anos) e que tenham no

máximo 60 anos, agrupados por status, onde cada grupo tem ao

menos dois marinheiros nestas condições

SELECT S.Status, Min(S.Idade) AS Min-AGE

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

GROUP BY S.StatusHAVING COUNT(*) > 1

Sailors

SidSnome Status Idade22

29

313258

64

7174

8595

N1

N2

N3N4N5

N6

N7N6

N8N9

7

1

88

10

7

109

33

45

33

55,525,535

35

1635

25,563,5

Min-A

Resposta

Status

7

8

35

25,5

97 N10 3 24

3 24

Page 20: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

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 nível e onde pelo menos um marinheiro no nível 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)

Page 21: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Exercício 7

Para cada barco vermelho, dê o número 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

Page 22: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Exercicio 8 Encontre a média de idade dos

marinheiros com mais de 18 anos, para cada nível de status que tem ao menos dois marinheiros.

SELECT S.Status, AVG(S.Idade) AS Min-AGEFROM Sailors SWHERE S.Idade > 18GROUP BY S.StatusHAVING COUNT(*) > 1

Page 23: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Consultas dentro do comando FROM Dê os status para os quais a média de idades dos

marinheiros neste status é igual à menor das médias de idades de cada status.

SELECT Temp.StatusFROM (SELECT S.Status, AVG(S.Idade) FROM Sailors S GROUP BY S.Status) AS TempWHERE Temp.AVG = (SELECT MIN (Temp.AVG) FROM Temp)

Page 24: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Resumo Geral do uso de AgregadosSELECT <lista-seleção>

FROM <lista-tabelas>WHERE <condição-sobre-tuplas>GROUP BY <lista-atributos-de-agrupamento>HAVING <condição-sobre-os-grupos>

1. lista-seleção = 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 condição-sobre-os-grupos devem aparecer em “operador(atributo)” ou em lista-atributos-de-agrupamento.

Page 25: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

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.IdadeS.Status

Page 26: SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke.

Particularidade de SQL 1999 Se a lista-atributos-de-agrupamento contém a chave primária de

uma tabela da lista-tabelas então cada coluna desta tabela só tem um único valor em cada grupo. Em SQL1999, tais colunas podem aparecer na lista de atributos da lista-seleção.

SELECT S.Status, S.Snome, AVG(S.Idade) AS Min-AGE

FROM Sailors S

GROUP BY S.Sid

HAVING COUNT(*) > 1

Chave de SailorsLogo: os grupos têm um único elemento