Este documento descreve um modelo de base de dados para registrar uma coleção de livros de uma biblioteca pessoal. Ele inclui entidades como livros, autores, editoras e compras, bem como as relações entre eles. O desafio proposto é resolver 12 consultas sobre esta base de dados relacional.
1. Bases
de
dados
Desafio
1
Responder
às
questões
adicionais
Consultas
sobre
a
base
de
dados
Biblio.db
Luis
Borges
Gouveia
Dezembro
de
2012
2. Considere
o
seguinte
contexto
• Considere
a
necessidade
de
registo
de
uma
pequena
coleção
de
livros
associada
a
uma
biblioteca
pessoal
– Pretende-‐se
o
registo
de
livros,
indicando
o
respeHvo
Itulo,
isbn
e
língua
em
que
está
escrito
– É
necessário
associar
os
respeHvos
autores,
considerando
o
seu
nome
e
nacionalidade
– Deve
ser
igualmente
registada
a
editora
(nome)
– Deve
ser
considerado
o
registo
de
compra,
indicando
o
livro,
o
valor
e
a
data
de
aquisição
– Adicionalmente,
as
relações
de
quem
escreveu
o
livro
(associando
o
livro
e
o
autor),
quem
publicou
(associando
o
livro
e
a
editora)
3. Um
modelo
E-‐R
do
contexto
proposto
• Consideram-‐se:
– quatro
enHdades:
editora,
livro,
autor
e
compra
– Três
relações
binárias:
publicado,
escrito
e
pago
• Publicado:
uma
editora
publica
vários
livros
e
um
livro
é
publicado
por
várias
editoras
• Escrito:
um
livro
é
escrito
por
vários
autores
e
um
autor
escreve
vários
livros
• Pago:
um
livro
é
pago
numa
compra
e
uma
compra
paga
um
livro
5. Desafio
1
(resolver
as
seguintes
consultas)
• Listar
os
livros
disponíveis,
indicando
Titulo,
editora,
preço
e
isbn
• Listar
as
línguas
das
obras
disponíveis,
indicando
o
número
de
obras
associadas
a
cada
uma
das
línguas
existentes
• Contar
o
número
de
livros
existentes
• Contar
o
número
de
livros
existentes
por
ano
de
compra
• Listar
as
editoras
existentes,
indicando
o
número
de
livros
por
cada
editora
• Contar
o
número
de
diferentes
autores,
existentes
na
base
de
dados
• Contar
o
número
de
nacionalidades
disHntas
• Listar
as
nacionalidades,
indicando
o
número
de
autores
para
cada
uma
delas
• Listar
as
editoras,
indicando
o
número
de
livros
publicados
por
cada
• Indicar
o
valor
de
livros
comprados
por
autor
• Indicar
o
valor
de
livros
comprados
por
editora
• Indicar
o
valor
de
livros
comprados
por
ano
• Indicar
o
número
de
compras
efetuadas
por
ano
• Listar
as
compras
efetuadas
por
editora
• Listar
as
compras
efetuadas
por
língua
e
ordenadas
por
editora
6. Listar
os
livros
disponíveis,
indicando
Titulo,
editora,
preço
e
isbn
select
Htulo,
editora.nome,
valor,
isbn
from
livro,
editora,
publicado,
compra
where
livro.idl=compra.idl
and
livro.idl=publicado.idl
and
publicado.ide=editora.ide;
Listar
as
línguas
das
obras
disponíveis,
indicando
o
número
de
obras
associadas
a
cada
uma
das
línguas
existentes
select
lingua,
count(lingua)
from
livro
group
by
lingua;
Contar
o
número
de
livros
existentes
select
count(*)
from
livro;
Contar
o
número
de
livros
existentes
por
ano
de
compra
select
str_ime('%Y',data),
count(*)
from
compra
group
by
str_ime('%Y',
data);
7. Listar
as
editoras
existentes,
indicando
o
número
de
livros
por
cada
editora
select
editora.nome,
count(*)
from
editora,
livro,
publicado
where
livro.idl=publicado.idl
and
publicado.ide=editora.ide
group
by
editora.nome;
Contar
o
número
de
diferentes
autores,
existentes
na
base
de
dados
select
count(*)
from
autor;
Contar
o
número
de
nacionalidades
dis<ntas
select
count(disHnct
nacionalidade)
from
autor;
Listar
as
nacionalidades,
indicando
o
número
de
autores
para
cada
uma
delas
select
nacionalidade,
count(nacionalidade)
from
autor
group
by
nacionalidade;
8. Listar
as
editoras,
indicando
o
número
de
livros
publicados
por
cada
select
editora.nome,
count(*)
from
editora,
livro,
publicado
where
livro.idl=publicado.idl
and
publicado.ide=editora.ide
group
by
editora.nome;
Indicar
o
valor
de
livros
comprados
por
autor
select
autor.nome,
sum(valor)
from
autor,
escrito,
compra
where
compra.idl=escrito.idl
and
escrito.ida=autor.ida
group
by
autor.nome;
Indicar
o
valor
de
livros
comprados
por
editora
select
editora.nome,
sum(valor)
from
editora,
compra,
publicado
where
compra.idl=publicado.idl
and
publicado.ide=editora.ide
group
by
editora.nome;
9. Indicar
o
valor
de
livros
comprados
por
ano
select
str_ime('%Y',data),
sum(valor)
from
compra
group
by
str_ime('%Y',
data);
Indicar
o
número
de
compras
efetuadas
por
ano
select
str_ime('%Y',data),
count(*)
from
compra
group
by
str_ime('%Y',
data);
Listar
as
compras
efetuadas
por
editora
select
editora.nome,
count(*)
from
compra,
publicado,
editora
where
compra.idl=publicado.idl
and
publicado.ide=editora.ide
group
by
editora.nome;
Listar
as
compras
efetuadas
por
íÌngua
e
ordenadas
por
editora
select
livro.lingua,
count(*)
from
livro,
compra,
publicado,
editora
where
compra.idl=publicado.idl
and
publicado.ide=editora.ide
and
compra.idl=livro.idl
group
by
livro.lingua
order
by
editora.nome;
10. Alguns
comentários
• Nem
todas
das
consultas
tem
a
mesma
complexidade
• Existem
pedidos
diferentes,
mas
que
basicamente
obtem
as
mesmas
respostas
(logo
os
comandos
são
idênHcos…)
• Para
testar
os
comandos,
convém
usar
um
conjunto
restrito
de
dados
e
que
permita
idenHficar
os
resultados
obHdos
como
correctos
(e
dessa
forma,
verificar
a
qualidade
do
comando
de
consulta)
11. Respostas
às
consultas
(exemplo…)
• Quantas
compras
estão
registadas?
– select
count(*)
from
compra;
12
• Qual
o
valor
total
dos
livros
comprados?
– select
sum(valor)
from
compra;
222
• Qual
o
valor
mínimo
de
compra
registado?
– select
min(valor)
from
compra;
7
• Qual
o
valor
máximo
de
compra
registado?
– select
max(valor)
from
compra;
75
• Diferença
entre
o
maior
e
o
menor
valor
de
compra?
– select
max(valor)-‐min(valor)
from
compra;
68
• Valor
médio
das
compras
registadas?
– select
sum(valor)/count(*)
from
compra;
18,5
…ou
(o
resultado
é
igual,
mas
exige
o
uso
de
menos
funções
– select
avg(valor)
from
compra;
18,5
12. 1
Listar
os
livros
disponíveis,
indicando
Titulo,
editora,
preço
e
isbn
select
Htulo,
editora.nome
as
editora,
valor,
isbn
from
livro,
editora,
compra,
publicado
where
livro.idl=compra.idl
and
publicado.idl=livro.idl
and
editora.ide=publicado.ide;
13. 2
Listar
as
línguas
das
obras
disponíveis,
indicando
o
número
de
obras
associadas
a
cada
uma
das
línguas
existentes
select
Htulo,
lingua
from
livro;
14. 3
Contar
o
número
de
livros
existentes
select
count
(idl)
as
livros
from
livro;
5
Listar
as
editoras
existentes,
indicando
o
número
de
livros
por
cada
editora
select
editora.nome
as
editora,
count
(idl)
from
editora,
publicado
where
publicado.ide=editora.ide
group
by
editora;
6
Contar
o
número
de
diferentes
autores,
existentes
na
base
de
dados
select
disHnct
count
(autor.nome)
as
autores
from
autor;
15. 7
Contar
o
número
de
nacionalidades
dis<ntas
select
disHnct
nacionalidade
from
autor;
8
Listar
as
nacionalidades,
indicando
o
número
de
autores
para
cada
uma
delas
select
disHnct
nacionalidade,
count(autor.nome)
as
autores
from
autor;
9
Listar
as
editoras,
indicando
o
número
de
livros
publicados
por
cada
select
editora.nome
as
editoras,
count
(idl)
from
editora,
publicado
where
editora.ide=publicado.ide
group
by
editoras;
16. 10
Indicar
o
valor
de
livros
comprados
por
autor
select
autor.nome,
sum(valor)
as
valores
from
compra,
autor,
escrito
where
compra.idl=escrito.idl
and
autor.ida=escrito.ida
group
by
nome;
17. 11
Indicar
o
valor
de
livros
comprados
por
editora
select
editora.nome
as
editora,
sum(valor)
as
valores
from
compra,
editora,
publicado
where
compra.idl=publicado.idl
and
editora.ide=publicado.ide
group
by
editora;
18. 14
Listar
as
compras
efetuadas
por
editora
select
Htulo,
editora.nome
as
editora,
valor
from
livro,
compra,
editora,
publicado
where
compra.idl=livro.idl
and
publicado.ide=editora.ide
and
publicado.idl=compra.idl
order
by
editora;
19. 15
Listar
as
compras
efetuadas
por
língua
e
ordenadas
por
editora
select
Htulo,
valor,
editora.nome
as
editora,
lingua
from
livro,
compra,
editora,
publicado
where
compra.idl=livro.idl
and
publicado.ide=editora.ide
and
publicado.idl=compra.idl
order
by
editora;