SlideShare uma empresa Scribd logo
1 de 26
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
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 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 não 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 número)
Tabela é transformada em um número
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 número 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 são 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 são 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 média 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 <condição sobre tuplas>
GROUP BY <lista-atributos-de-agrupamento>
HAVING <condição sobre os grupos>
Exemplo
 Para cada nível de status, dê a idade do marinheiro mais jovem
neste status
Sailors
SidSnome 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 SnomeStatus 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 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
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.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 nível.
SELECT S.Status, Min(S.Idade)
AS M-Age
FROM Sailors S
WHERE S.Idade >= 18
GROUP BY S.Status
HAVING COUNT(*) > 1
Sailors
SidSnome 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 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
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-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 : 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.Status
HAVING COUNT(*) > 1
Sailors
SidSnome 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 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)
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
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-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 média de idades dos
marinheiros neste status é igual à menor das médias
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-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.
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
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 Sailors
Logo: os grupos têm um
único elemento

Mais conteúdo relacionado

Mais procurados

Apresentação de Linux Ubuntu
Apresentação de Linux UbuntuApresentação de Linux Ubuntu
Apresentação de Linux UbuntuCDP_Online
 
HTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEB
HTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEBHTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEB
HTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEBPeslPinguim
 
Aula 05 - UML e Padrões de Projeto
Aula 05 - UML e Padrões de ProjetoAula 05 - UML e Padrões de Projeto
Aula 05 - UML e Padrões de ProjetoVinícius de Paula
 
Référentiel d'architecture avec TOGAF
Référentiel d'architecture avec TOGAFRéférentiel d'architecture avec TOGAF
Référentiel d'architecture avec TOGAFPierre-Xavier Fouillé
 
Linguagem de programação
Linguagem de programação Linguagem de programação
Linguagem de programação Marcos Gregorio
 
Sistemas Distribuídos - Computação Paralela - Introdução
Sistemas Distribuídos - Computação Paralela - IntroduçãoSistemas Distribuídos - Computação Paralela - Introdução
Sistemas Distribuídos - Computação Paralela - IntroduçãoAdriano Teixeira de Souza
 
Aplicação dos microcontroladores no dia a dia
Aplicação dos microcontroladores no dia a diaAplicação dos microcontroladores no dia a dia
Aplicação dos microcontroladores no dia a diaDaniel Rodrigues de Sousa
 
MS Excel - Aula 01
MS Excel - Aula 01MS Excel - Aula 01
MS Excel - Aula 01Roney Sousa
 
Aula 04 arquitetura de computadores
Aula 04   arquitetura de computadoresAula 04   arquitetura de computadores
Aula 04 arquitetura de computadoresDaniel Moura
 
Cours crm scm erp vision globale v1.0
Cours crm scm erp vision globale v1.0Cours crm scm erp vision globale v1.0
Cours crm scm erp vision globale v1.0CHARLES Frédéric
 
Questões de informática em concursos públicos
Questões de informática em concursos públicosQuestões de informática em concursos públicos
Questões de informática em concursos públicosCDIM Daniel
 
Interação Humano Computador Capítulo 8 - Antecipação
Interação Humano Computador Capítulo 8 - AntecipaçãoInteração Humano Computador Capítulo 8 - Antecipação
Interação Humano Computador Capítulo 8 - AntecipaçãoWellington Oliveira
 

Mais procurados (20)

Risc e cisc
Risc e ciscRisc e cisc
Risc e cisc
 
CISC e RISC
CISC e RISCCISC e RISC
CISC e RISC
 
Apresentação de Linux Ubuntu
Apresentação de Linux UbuntuApresentação de Linux Ubuntu
Apresentação de Linux Ubuntu
 
HTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEB
HTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEBHTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEB
HTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEB
 
Computação em Nuvem
Computação em NuvemComputação em Nuvem
Computação em Nuvem
 
Aula 05 - UML e Padrões de Projeto
Aula 05 - UML e Padrões de ProjetoAula 05 - UML e Padrões de Projeto
Aula 05 - UML e Padrões de Projeto
 
PHP - Arrays
PHP - ArraysPHP - Arrays
PHP - Arrays
 
Aprendendo a Usar o Netbeans
Aprendendo a Usar o NetbeansAprendendo a Usar o Netbeans
Aprendendo a Usar o Netbeans
 
Référentiel d'architecture avec TOGAF
Référentiel d'architecture avec TOGAFRéférentiel d'architecture avec TOGAF
Référentiel d'architecture avec TOGAF
 
Linguagem de programação
Linguagem de programação Linguagem de programação
Linguagem de programação
 
Sistemas Distribuídos - Computação Paralela - Introdução
Sistemas Distribuídos - Computação Paralela - IntroduçãoSistemas Distribuídos - Computação Paralela - Introdução
Sistemas Distribuídos - Computação Paralela - Introdução
 
História e evolução dos computadores
História e evolução dos computadores História e evolução dos computadores
História e evolução dos computadores
 
02 algoritmo
02   algoritmo02   algoritmo
02 algoritmo
 
Aplicação dos microcontroladores no dia a dia
Aplicação dos microcontroladores no dia a diaAplicação dos microcontroladores no dia a dia
Aplicação dos microcontroladores no dia a dia
 
MS Excel - Aula 01
MS Excel - Aula 01MS Excel - Aula 01
MS Excel - Aula 01
 
Aula 04 arquitetura de computadores
Aula 04   arquitetura de computadoresAula 04   arquitetura de computadores
Aula 04 arquitetura de computadores
 
Cours crm scm erp vision globale v1.0
Cours crm scm erp vision globale v1.0Cours crm scm erp vision globale v1.0
Cours crm scm erp vision globale v1.0
 
Cisc, risc e pipeline
Cisc, risc e pipelineCisc, risc e pipeline
Cisc, risc e pipeline
 
Questões de informática em concursos públicos
Questões de informática em concursos públicosQuestões de informática em concursos públicos
Questões de informática em concursos públicos
 
Interação Humano Computador Capítulo 8 - Antecipação
Interação Humano Computador Capítulo 8 - AntecipaçãoInteração Humano Computador Capítulo 8 - Antecipação
Interação Humano Computador Capítulo 8 - Antecipação
 

Destaque

Reforçando a atividade lição
Reforçando a atividade liçãoReforçando a atividade lição
Reforçando a atividade liçãoAlessandra Sra JM
 
Lição 3 - As pragas divinas e as propostas ardilosas de Faraó
Lição 3 - As pragas divinas e as propostas ardilosas de FaraóLição 3 - As pragas divinas e as propostas ardilosas de Faraó
Lição 3 - As pragas divinas e as propostas ardilosas de FaraóNildo Junior
 
Divisão dos livros da Bíblia - Novo Testamento
Divisão dos livros da Bíblia - Novo TestamentoDivisão dos livros da Bíblia - Novo Testamento
Divisão dos livros da Bíblia - Novo TestamentoAmor pela EBD
 
Lição 13 - A segunda vinda de Cristo
Lição 13 - A segunda vinda de CristoLição 13 - A segunda vinda de Cristo
Lição 13 - A segunda vinda de CristoSergio Silva
 
Curso avançado de excell 120 lições
Curso avançado de excell   120 liçõesCurso avançado de excell   120 lições
Curso avançado de excell 120 liçõesLilian Gomes
 
Lição 13 os últimos dias serão tempos trabalhosos e de apostasia
Lição 13 os últimos dias serão tempos trabalhosos e de apostasiaLição 13 os últimos dias serão tempos trabalhosos e de apostasia
Lição 13 os últimos dias serão tempos trabalhosos e de apostasiaÉder Tomé
 

Destaque (7)

Reforçando a atividade lição
Reforçando a atividade liçãoReforçando a atividade lição
Reforçando a atividade lição
 
Lição 3 - As pragas divinas e as propostas ardilosas de Faraó
Lição 3 - As pragas divinas e as propostas ardilosas de FaraóLição 3 - As pragas divinas e as propostas ardilosas de Faraó
Lição 3 - As pragas divinas e as propostas ardilosas de Faraó
 
LIÇÃO 10 – AS SETENTA SEMANAS
LIÇÃO 10 – AS SETENTA SEMANASLIÇÃO 10 – AS SETENTA SEMANAS
LIÇÃO 10 – AS SETENTA SEMANAS
 
Divisão dos livros da Bíblia - Novo Testamento
Divisão dos livros da Bíblia - Novo TestamentoDivisão dos livros da Bíblia - Novo Testamento
Divisão dos livros da Bíblia - Novo Testamento
 
Lição 13 - A segunda vinda de Cristo
Lição 13 - A segunda vinda de CristoLição 13 - A segunda vinda de Cristo
Lição 13 - A segunda vinda de Cristo
 
Curso avançado de excell 120 lições
Curso avançado de excell   120 liçõesCurso avançado de excell   120 lições
Curso avançado de excell 120 lições
 
Lição 13 os últimos dias serão tempos trabalhosos e de apostasia
Lição 13 os últimos dias serão tempos trabalhosos e de apostasiaLição 13 os últimos dias serão tempos trabalhosos e de apostasia
Lição 13 os últimos dias serão tempos trabalhosos e de apostasia
 

Mais de RADILSON RIPARDO DE FRETIAS (6)

Debug tool
Debug toolDebug tool
Debug tool
 
Formação cobol
Formação cobolFormação cobol
Formação cobol
 
Algoritmo e estruturas de dados operações com matrizes
Algoritmo e estruturas de dados operações com matrizesAlgoritmo e estruturas de dados operações com matrizes
Algoritmo e estruturas de dados operações com matrizes
 
Apostila de banco de dados da ucg
Apostila de banco de dados da ucgApostila de banco de dados da ucg
Apostila de banco de dados da ucg
 
Código de Processo Penal
Código de Processo PenalCódigo de Processo Penal
Código de Processo Penal
 
Serminario itil service_desk
Serminario itil service_deskSerminario itil service_desk
Serminario itil service_desk
 

Sql comandos agregacao

  • 1. SQL – Comandos de Agregação Profa. Sandra de Amo Capitulo 5 – Livro Texto Database Management Systems Ramakrishnan - Gehrke
  • 2. 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
  • 3. 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 10 SELECT Sum(S.Idade) FROM Sailors S WHERE S.rating = 10
  • 4. 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 atributo A MENOS QUE SE UTILIZE O OPERADOR GROUP BY
  • 5. 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 número) Tabela é transformada em um número
  • 6. 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
  • 7. 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
  • 8. 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.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)
  • 9. Substituindo ANY por MIN  Encontre o nome dos marinheiros que são 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)
  • 10. 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 S WHERE S.Sid IN (SELECT R.Sid FROM Reservas R, Barcos B WHERE B.Bid = R.Bid AND B.Cor = ‘Vermelho’)
  • 11. 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>
  • 12. Exemplo  Para cada nível de status, dê a idade do marinheiro mais jovem neste status Sailors SidSnome 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 SnomeStatus 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
  • 13. 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
  • 14. 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.Status HAVING S.Status <> 1
  • 15. 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-Age FROM Sailors S WHERE S.Idade >= 18 GROUP BY S.Status HAVING COUNT(*) > 1 Sailors SidSnome 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
  • 16. 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
  • 17. 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-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
  • 18. 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
  • 19. 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.Status HAVING COUNT(*) > 1 Sailors SidSnome 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
  • 20. 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)
  • 21. 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
  • 22. 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-AGE FROM Sailors S WHERE S.Idade > 18 GROUP BY S.Status HAVING COUNT(*) > 1
  • 23. 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.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)
  • 24. Resumo Geral do uso de Agregados SELECT <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.
  • 25. 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
  • 26. 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 Sailors Logo: os grupos têm um único elemento