Exemplo e caso prático do uso de bases de dados relacionais
SGBDR SQLite e o exemplo de uma biblioteca pessoal
Luis Borges Gouveia
V2.0 - Fevereiro de 2015
1. Um exemplo do uso de bases de
dados relacionais
SQLite e a exploração SQL
Luís Borges Gouveia
lmbg@ufp.edu.pt
V2.1, Fevereiro de 2016
2. Para as práticas
• Utilização do um SGBD relacional
– http://www.sqlite.org
– Software livre, open source e sem custos, de domínio
público (opensource, freeware, public domain)
– Disponível para os sistemas operativos: Linux, MS
Windows e MAC OS
– Permite a criação de bases de dados de fácil utilização
e é adotado em inúmeras aplicações:
• Entre outras: Dropbox, Firefox, Skype e Adobe Acrobat
– Motor de base de dados fiável e de pequena
dimensão
3. Iniciar o SQLite
• O SQLite é um SGBD de interface de linha de comando (baseado num só
ficheiro executável que funciona isolado) que é muito fácil de instalar e
usar (não necessita de servidor ou de um cliente)
– MS Windows: ir para http://www.sqlite.org/download.html e considerar a sessão
Precompiled Binaries for Windows. Descarregar o ficheiro .zip do link command-line shell
(não o DLL ou o da analysis). Extrair o ficheiro sqlite3.exe e colocar o mesmo onde for
pretendido – o desktop pode ser um local. Basta agora um duplo clique no ficheiro
extraído para ser executado
– MAC OS X: ir para http://www.sqlite.org/download.html e considerar a sessão
Precompiled Binaries for Mac OS X. Descarregar o ficheiro .zip file do link command-line
shell (não o link analysis). Extrair o ficheiro sqlite3 e colocar o mesmo onde for
pretendido – o desktop pode ser um local. Basta agora um duplo clique no ficheiro
extraído para ser executado
7. Reutilizar bases de dados no SQLite…
• Depois de utilizar o SGBD e para concluir a sessão, deve utilizar o comando
'.exit‘ (ou ‘.quit’ que, aparentemente, é o mesmo…)
– Tenha em atenção que o estado da base de dados não é gravado entre sessões,
pelo que será necessário repetir os comandos e carregar os dados novamente,
para cada sessão
– Claro que é possível forçar o SQL a manter o estado de base dados entre
sessões
• Para garantir a preservação de estado entre sessões, o SQLite pode ser
executado tendo como argumento a indicação da base dados que se
pretende abrir
– Pode ser utilizada a linha de comando do sistema operativo e executar o SQLite
com indicação do nome do ficheiro para a base de dados a criar ou a utilizar:
SQLite3 nome_basedados (exemplo: sqlite3 teste.db)
– Este comando força o SQLite a abrir um ficheiro onde contém a base dados
com o nome indicado. Caso o ficheiro ainda não exista, cria um. O estado da
base de dados irá sendo gravado e pode ser reutilizado depois
8. Para poder lançar o Sqlite com um
ficheiro para persistência de dados…
• É necessário lançar uma janela de sessão em
ambiente de linha de comando ou MS DOS
– Botão da direita, no menu Windows e selecionar
“executar” ou “procurar”
– Introduzir “cmd” (cria uma janela de linha de comandos,
para poder invocar o SGBD com atributos)
9. Interagir no SQLite
• Uma vez iniciado o SQLite, existem três
opções para correr consultas:
– teclados diretamente, um de cada vez, usando a
linha de comando
– Copiados e colocados (copy & paste) de um outro
local, na linha de comando
– Executados de um ficheiro externo (script)
10. Uso da linha de comando
• Experimentar e obter a resposta, de comando a
comando
– Comandos SQLite: iniciados por um ponto e listados em
.help
– Comandos SQL, de acordo com a norma e finalizados por ;
(ponto e vírgula)
• Um exemplo de um manual sobre a 4GL SQL para o SQLite
(http://zetcode.com/databases/sqlitetutorial/)
11. Copiar e colar na linha de comando
• uma forma fácil de replicar comandos de linha, a partir de manuais ou da
produção de textos em processadores de texto ou outros editores mais
evoluídos, é possível e até desejável
– Selecionar e copiar o texto e, na janela de comando, colar
12. Copiar e colar na linha de comando
• Para assegurar que é possível realizar a operação de copiar e colar
numa janela de comando, é necessário garantir que a opção de
modo de edição rápida esteja selecionada (na barra de título deve
escolher a opção Propriedades do menu acionado pela tecla direita
do rato)
13. Executar um ficheiro de script
• uma forma clássica de reproduzir e correr sequências complexas de
comandos é a utilização de scripts. O SQLite facilita a sua leitura por via do
comando ‘.read’
.read primeiroSQLscript.sql
– Em que o ficheiro de texto de nome primeiroSQLscript.sql está colocado no
diretório do executável SQLite3 e contém o script a correr
/* As duas primeiras linhas formatam os resultados do comando SELECT */
/* Para obter uma lista de comandos específicos do SQLite, digite '.help' */
.mode columns
.headers on
.nullvalue NULL
drop table if exists Tabela;
create table Tabela (Atributo1 text, Atributo2 text);
insert into Tabela values ('Olá,', 'mundo!');
select * from Tabela;
14. Considere o seguinte contexto
• Existe a necessidade de registo de uma pequena
coleção de livros associada a uma biblioteca pessoal
– Pretende-se o registo de livros, indicando o respetivo
título, ISBN e língua em que está escrito
– É necessário associar os respetivos 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)
15. Um modelo E-R do contexto proposto
• Consideram-se:
– quatro entidades: 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
17. Criar a base de dados…
• Na linha de comando do SO
– Sqlite3 biblio.db
• Criar a tabela Livro (idl, título, língua, isbn)
– Create table livro(idl integer primary key, titulo text, lingua text, isbn text);
• Criar a tabela Autor (ida, nome, nacionalidade)
– Create table autor(ida integer primary key, nome text, nacionalidade text);
• Criar a tabela Editora (ide, nome)
– Create table editora(ide integer primary key, nome text);
• Criar a tabela Escrito (idl, ida)
– Create table escrito(esc integer primary key autoincrement, idl integer, ida integer);
• Criar a tabela Publicado (idl, ide)
– Create table publicado(pub integer primary key autoincrement, idl integer, ide integer);
• Criar a tabela Compra (cmp, idl, valor, data)
– Create table compra(cmp integer primary key autoincrement, idl integer, valor real, data
date);
18. Informação sobre a bd biblio.db
• Testar os comandos: .databases (lista as bases de dados consideradas no
ficheiro biblio.db), .tables (lista as tabelas associadas com a base de
dados) e .schema (que lista o esquema das tabelas da base de dados)
19. Teste do modelo criado
• Para testar o modelo criado é tomada uma
coleção de livros, conforme descrita em
http://homepage.ufp.pt/lmbg/lg_livros.htm
– Incluia em 2013, 12 livros
– Foram adicionados mais 3 livros em 2015
20.
21. Inserir dados na base de dados
• Inserir livros… [Livro (idl, título, língua, isbn)]
– Insert into livro values (1, ‘Sistemas de Informação de Apoio à Gestão’, ‘Português’, ‘9728589433’);
– Insert into livro values (2, ‘Cidades e Regiões Digitais: impacte nas cidades e nas pessoas’, ‘Português’, ‘9728830033’);
– Insert into livro values (3, ‘Informática e Competências Tecnológicas para a Sociedade da Informação’, ‘Português’,
‘9728830041’);
– Insert into livro values (4, ‘Readings in Information Society ’, ‘Inglês’, ‘9728830149’);
– Insert into livro values (5, ‘Sociedade da Informação: balanço e implicações ’, ‘Português’, ‘9728830181’);
– Insert into livro values (6, ‘O local e-government: a governação digital na autarquia’, ‘Português’, ‘9728589417’);
– Insert into livro values (7, ‘Informática e Competências Tecnológicas para a Sociedade da Informação 2ed’, ‘Português’,
‘9728830300’);
– Insert into livro values (8, ‘Negócio Electrónico - conceitos e perspectivas de desenvolvimento’, ‘Português’,
‘972858962X’);
– Insert into livro values (9, ‘Gestão da Informação na Biblioteca Escolar ’, ‘Português’, ‘9789899533004’);
– Insert into livro values (10, ‘A virtual environment to share knowledge’, ‘Inglês’, ‘9783639129861’);
– Insert into livro values (11, ‘Ciência da Informação: contributos para o seu estudo’, ‘Português’, ‘9789896430900’);
– Insert into livro values (12, ‘Repensar a Sociedade da Informação e do Conhecimento no Início do Século XXI’,
‘Português’, ‘9789726186953’);
• Os dados de 2015…
– Insert into livro values(13, ‘Gestão da Informação em Museus: uma contribuição para o seu estudo’, ‘Português’,
‘9789899901394’);
– Insert into livro values(14, ‘Web 2.0 and Higher Education. A psychological perspective’, Inglês’, ‘9783659683466’);
– Insert into livro values(15, ‘Contribuições para a discussão de um modelo de Governo Electrónico Local para Angola’ ,
‘Português’, ‘9789899933200’);
22. Inserir dados na base de dados
• Inserir autores… [Autor (ida, nome, nacionalidade)]
– Insert into autor values(1, ‘Luis Borges Gouveia’, ’Português’);
– Insert into autor values(2, ‘João Ranito’, ’Português’);
– Insert into autor values(3, ‘Nuno Magalhães Ribeiro’, ’Português’);
– Insert into autor values(4, ‘Paulo Rurato’, ’Português’);
– Insert into autor values(5, ‘Sofia Gaio’, ’Português’);
– Insert into autor values(6, ‘Rui Moreira’, ’Português’);
– Insert into autor values(7, ‘Margarida Bairrão’, ’Português’);
– Insert into autor values(8, ‘Judite Gonçalves de Freitas’, ’Português’);
– Insert into autor values(9, ‘António Borges Regedor’, ’Português’);
– Insert into autor values(10, ‘José Dias Coelho’, ’Português’);
• Dados de 2015
– Insert into autor values(11, ‘Paula Moura’, ‘Português’);
– Insert into autor values(12, ‘Luis Cunha’, ‘Português’);
– Insert into autor values(13, ‘Pereira Alfredo’, ‘Angolano’);
23. Inserir dados na base de dados
• Inserir editoras… [Editora (ide, nome)]
– Insert into editora values(1, ‘SPI - Principia’);
– Insert into editora values(2, ‘Edições Universidade Fernando Pessoa’);
– Insert into editora values(3, ‘Edições GestKnowing’);
– Insert into editora values(4, ‘VDM – Verlag Dr. Muller’);
– Insert into editora values(5, ‘Sílabo’);
• Dados de 2015
– Insert into editora values(6, ‘Green Lines Instituto’);
– Insert into editora values(7, ‘Lambert Academic Publishing’);
– Insert into editora values(8, ‘Kwigia Editora’);
24. Inserir dados na base de dados
• Associar livros a autores… [Escrito (idl, ida)]
– Insert into escrito values(1, 1, 1);
– Insert into escrito values(2, 1, 2);
– Insert into escrito values(3, 2, 1);
– Insert into escrito values(4, 3, 3);
– Insert into escrito values(5, 3, 1);
– Insert into escrito values(6, 3, 4);
– Insert into escrito values(7, 4, 1);
– Insert into escrito values(8, 4, 5);
– Insert into escrito values(9, 5, 1);
– Insert into escrito values(10, 5, 5);
– Insert into escrito values(11, 6, 1);
– Insert into escrito values(12, 7, 3);
– Insert into escrito values(13, 7, 1);
– Insert into escrito values(14, 7, 4);
– Insert into escrito values(15, 7, 6);
– Insert into escrito values(16, 8, 1);
– Insert into escrito values(17, 9, 7);
– Insert into escrito values(18, 9, 1);
– Insert into escrito values(19, 10, 1);
– Insert into escrito values(20, 11, 8);
– Insert into escrito values(21, 11, 1);
– Insert into escrito values(22, 11, 9);
– Insert into escrito values(23, 12, 10);
– Insert into escrito values(24, 12, 1);
• Dados de 2015
– Insert into escrito values(25, 13, 11);
– Insert into escrito values(26, 13, 1);
– Insert into escrito values(27, 14, 1);
– Insert into escrito values(28, 14, 12);
– Insert into escrito values(29, 15, 13);
– Insert into escrito values(30, 15, 1);
25. Inserir dados na base de dados
• Associar livros a editoras… [Publicado (idl, ide)]
– Insert into publicado values(1, 1, 1);
– Insert into publicado values(2, 2, 2);
– Insert into publicado values(3, 3, 2);
– Insert into publicado values(4, 4, 2);
– Insert into publicado values(5, 5, 2);
– Insert into publicado values(6, 6, 1);
– Insert into publicado values(7, 7, 2);
– Insert into publicado values(8, 8, 1);
– Insert into publicado values(9, 9, 3);
– Insert into publicado values(10, 10, 4);
– Insert into publicado values(11, 11, 2);
– Insert into publicado values(12, 12, 5);
• Dados de 2015
– Insert into publicado values(13, 13, 6);
– Insert into publicado values(14, 14, 7);
– Insert into publicado values(15, 15, 8);
26. Inserir dados na base de dados
• Inserir compras… [Compra (cmp, idl, valor, data)]
– Insert into compra values(1, 1, 15, ‘2004-12-12’);
– Insert into compra values(2, 2, 12, ‘2003-11-12’);
– Insert into compra values(3, 3, 10, ‘2003-10-20’);
– Insert into compra values(4, 4, 7, ‘2004-04-20’);
– Insert into compra values(5, 5, 14, ‘2004-06-15’);
– Insert into compra values(6, 6, 15, ‘2004-12-12’);
– Insert into compra values(7, 7, 10, ‘2003-10-26’);
– Insert into compra values(8, 8, 15, ‘2006-12-10’);
– Insert into compra values(9, 9, 15, ‘2007-03-10’);
– Insert into compra values(10, 10, 75, ‘2009-02-05’);
– Insert into compra values(11, 11, 10, ‘2012-06-18’);
– Insert into compra values(12, 12, 24, ‘2012-09-10’);
• Dados de 2015
– Insert into compra values(13, 13, 25, ‘2015-01-10’);
– Insert into compra values(14, 14, 54, ‘2015-01-25’);
– Insert into compra values(15, 15, 17, ‘2015-01-17’);
27. Obter o esquema da base de dados
• Obter o esquema da base de dados biblio,
utilizando o comando .schema
28. Obter uma cópia da base dados
• De forma a poder replicar a estrutura e conteúdos
da base de dados é possível obter a sequência de
comandos SQL, atráves de .dump
– Para obter a listagem num ficheiro de texto,
deve ser redirecionado o output, com base no
comando .output nome_do_ficheiro, antes do
uso do comando .dump (após o comando, deve
redirecionar novamente o output para o ecran,
utilizando .output stdout)
– O exemplo do dump da base de dados biblio.db,
ao lado…
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE livro(idlinteger primary key, titulo text, lingua text, isbn text);
INSERT INTO "livro" VALUES(1,'Sistemas de Informa‡Æo para
GestÆo','Portuguˆs','9728589433');
INSERT INTO "livro" VALUES(2,'Cidades e RegiäesDigitais: impacte nas cidadese
nas pessoas','Portuguˆs','9728830033');
INSERT INTO "livro" VALUES(3,'Inform tica e Competˆncias Tecnol¢gicas para a
Sociedade daInforma‡Æo','Portuguˆs','9728830041');
INSERT INTO "livro" VALUES(4,'Readings in Information Society
','Inglˆs','9728830149');
INSERT INTO "livro" VALUES(5,'Sociedade da Informa‡Æo: balan‡o e implica‡äes
','Portuguˆs','9728830181');
INSERT INTO "livro" VALUES(6,'O local e-government: a governa‡Æo digitalna
autarquia','Portuguˆs','9728589417');
INSERT INTO "livro" VALUES(7,'Inform tica e Competˆncias Tecnol¢gicas para a
Sociedade daInforma‡Æo 2ed','Portuguˆs','9728830300');
INSERT INTO "livro" VALUES(8,'Neg¢cio Electr¢nico - conceitose perspectivasde
desenvolvimento','Portuguˆs','972858962X');
INSERT INTO "livro" VALUES(9,'GestÆo da Informa‡Æo na Biblioteca Escolar
','Portuguˆs','9789899533004');
INSERT INTO "livro" VALUES(10,'A virtual environment to share
knowledge','Inglˆs','9783639129861');
INSERT INTO "livro" VALUES(11,'Ciˆncia da Informa‡Æo: contributos para o seu
estudo','Portuguˆs','9789896430900');
INSERT INTO "livro" VALUES(12,'Repensar a Sociedadeda Informa‡Æo e do
Conhecimento no In¡cio do S‚culo XXI','Portuguˆs','9789726186953');
CREATE TABLE autor(ida integer primary key, nome text, nacionalidadetext);
INSERT INTO "autor" VALUES(1,'Luis Borges Gouveia','Portuguˆs');
INSERT INTO "autor" VALUES(2,'JoÆo Ranito','Portuguˆs');
INSERT INTO "autor" VALUES(3,'Nuno MagalhÆesRibeiro','Portuguˆs');
INSERT INTO "autor" VALUES(4,'Paulo Rurato','Portuguˆs');
INSERT INTO "autor" VALUES(5,'Sofia Gaio','Portuguˆs');
INSERT INTO "autor" VALUES(6,'Rui Moreira','Portuguˆs');
INSERT INTO "autor" VALUES(7,'Margarida BairrÆo','Portuguˆs');
INSERT INTO "autor" VALUES(8,'Judite Gon‡alves de Freitas','Portuguˆs');
INSERT INTO "autor" VALUES(9,'Ant¢nio Borges Regedor','Portuguˆs');
INSERT INTO "autor" VALUES(10,'Jos‚ Dias Coelho','Portuguˆs');
CREATE TABLE editora(ide integer primary key, nome text);
INSERT INTO "editora" VALUES(1,'SPI - Principia');
INSERT INTO "editora" VALUES(2,'Edi‡äes UniversidadeFernando Pessoa');
INSERT INTO "editora" VALUES(3,'Edi‡äes GestKnowing');
INSERT INTO "editora" VALUES(4,'VDM - Verlag Dr. Muller');
INSERT INTO "editora" VALUES(5,'S¡labo');
CREATE TABLE escrito(esc integer primary key autoincrement,idl integer, ida
integer);
INSERT INTO "escrito" VALUES(1,1,1);
INSERT INTO "escrito" VALUES(2,1,2);
INSERT INTO "escrito" VALUES(3,2,1);
INSERT INTO "escrito" VALUES(4,3,3);
INSERT INTO "escrito" VALUES(5,3,1);
INSERT INTO "escrito" VALUES(6,3,4);
INSERT INTO "escrito" VALUES(7,4,1);
INSERT INTO "escrito" VALUES(8,4,5);
INSERT INTO "escrito" VALUES(9,5,1);
INSERT INTO "escrito" VALUES(10,5,5);
INSERT INTO "escrito" VALUES(11,6,1);
INSERT INTO "escrito" VALUES(12,7,3);
INSERT INTO "escrito" VALUES(13,7,1);
INSERT INTO "escrito" VALUES(14,7,4);
INSERT INTO "escrito" VALUES(15,7,6);
INSERT INTO "escrito" VALUES(16,8,1);
INSERT INTO "escrito" VALUES(17,9,7);
INSERT INTO "escrito" VALUES(18,9,1);
INSERT INTO "escrito" VALUES(19,10,1);
INSERT INTO "escrito" VALUES(20,11,8);
INSERT INTO "escrito" VALUES(21,11,1);
INSERT INTO "escrito" VALUES(22,11,9);
INSERT INTO "escrito" VALUES(23,12,10);
INSERT INTO "escrito" VALUES(24,12,1);
CREATE TABLE publicado(pubinteger primary key autoincrement,idl integer, ide
integer);
INSERT INTO "publicado"VALUES(1,1,1);
INSERT INTO "publicado"VALUES(2,2,2);
INSERT INTO "publicado"VALUES(3,3,2);
INSERT INTO "publicado"VALUES(4,4,2);
INSERT INTO "publicado"VALUES(5,5,2);
INSERT INTO "publicado"VALUES(6,6,1);
INSERT INTO "publicado"VALUES(7,7,2);
INSERT INTO "publicado"VALUES(8,8,1);
INSERT INTO "publicado"VALUES(9,9,3);
INSERT INTO "publicado"VALUES(10,10,4);
INSERT INTO "publicado"VALUES(11,11,2);
INSERT INTO "publicado"VALUES(12,12,5);
CREATE TABLE compra(cmp integer primary key autoincrement,idl integer, valor
real, data date);
INSERT INTO "compra" VALUES(1,1,15.0,'jan 12 2004');
INSERT INTO "compra" VALUES(2,2,12.0,'set 11 2003');
INSERT INTO "compra" VALUES(3,3,10.0,'out 20 2003');
INSERT INTO "compra" VALUES(4,4,7.0,'apr 20 2004');
INSERT INTO "compra" VALUES(5,5,14.0,'jun 15 2004');
INSERT INTO "compra" VALUES(6,6,15.0,'dez 12 2004');
INSERT INTO "compra" VALUES(7,7,10.0,'out 26 2003');
INSERT INTO "compra" VALUES(8,8,15.0,'dez 10 2006');
INSERT INTO "compra" VALUES(9,9,15.0,'mar 10 2007');
INSERT INTO "compra" VALUES(10,10,75.0,'fev 5 2009');
INSERT INTO "compra" VALUES(11,11,10.0,'jun 18 2012');
INSERT INTO "compra" VALUES(12,12,24.0,'set 10 2012');
DELETE FROM sqlite_sequence;
INSERT INTO "sqlite_sequence"VALUES('escrito',24);
INSERT INTO "sqlite_sequence"VALUES('publicado',12);
INSERT INTO "sqlite_sequence"VALUES('compra',12);
COMMIT;
29. Alguns exercícios com base no
comando Select
• Quantas compras estão registadas?
– select count(*) from compra;
• Qual o valor total dos livros comprados?
– select sum(valor) from compra;
• Qual o valor mínimo de compra registado?
– select min(valor) from compra;
• Qual o valor máximo de compra registado?
– select max(valor) from compra;
• Diferença entre o maior e o menor valor de compra?
– select max(valor)-min(valor) from compra;
• Valor médio das compras registadas?
– select sum(valor)/count(*) from compra;
…ou (o resultado é igual, mas exige o uso de menos funções
– select avg(valor) from compra;
30. Mais alguns exercícios…
• Listar os títulos adquiridos por ordem crescente de valor?
– select titulo, valor, data from compra, livro where
compra.idl=livro.idl order by valor;
– …e por ordem decrescente?
select titulo, valor, data from compra, livro where
compra.idl=livro.idl order by valor desc;
– …e ordenados por data mais recente, primeiro?
select titulo, valor, data from compra, livro where
compra.idl=livro.idl order by data desc;
…saiu estranho o output? Tentar colocando antes do comando
SQL, o comando .width 30 10 10
– …e listar os titulos cujo valor de compra é de menos de 14 euros
select titulo, valor, data from compra, livro where
compra.idl=livro.idl and valor < 14 order by data desc;
31. Mais alguns exercícios…
• Listar os títulos existentes, indicando o número de anos de
antiguidade
– select titulo, valor, date(‘now’)-data from compra, livro where
compra.idl=livro.idl order by data desc;
– …e o número médio de anos das compras efetuadas?
Select avg(date)’now’)-data) from compra, livro where
compra.idl=livro.idl;
• Listar por ordem mais recente, os títulos de todas as
compras realizadas de valor maior que 14 euros e cuja
antiguidade seja menor ou igual a 5 anos
– Select titulo, valor from compra, livro where compra.idl=livro
and valor > 14 and (date(‘now’)-data) <= 5 order by data desc
32. Mais alguns exercícios…
• Listar, para todos os autores, os respetivos títulos e editoras em que
publicaram
– select autor.nome, titulo, editora.nome from livro, autor, editora, escrito,
publicado where escrito.idl=livro.idl and escrito.ida=autor.ida and
publicado.idl=livro.idl and publicado.ide=editora.ide order by autor.nome;
• Listar, para todos os autores, o número de livros que publicaram e que
estão na base de dados
– select autor.nome, count(*) from autor, escrito where escrito.ida=autor.ida
group by escrito.ida order by autor.nome;
– …ordenada pelo número de publicações…
select autor.nome, count(*) from autor, escrito where escrito.ida=autor.ida
group by escrito.ida order by count(*);
• Listar, para todos os livros, o número de autores da obra
– select titulo, count(*) from livro, autor, escrito where autor.ida=escrito.idl and
livro.idl=escrito.idl group by livro.idl order by titulo;
– …ordenar as obras pelo número crescente de autores
select titulo, count(*) from livro, autor, escrito where autor.ida=escrito.idl and
livro.idl=escrito.idl group by livro.idl order by count(*);
33. Desafio: tarefa 4
(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 distintas
• 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