• Save
Exemplo e caso prático do uso de base de dados
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Exemplo e caso prático do uso de base de dados

  • 1,868 views
Uploaded on

Exemplo e caso prático do uso de bases de dados relacionais ...

Exemplo e caso prático do uso de bases de dados relacionais
O comando Select e o SQLite
Luis Borges Gouveia
V1.2 - Janeiro de 2013

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,868
On Slideshare
1,200
From Embeds
668
Number of Embeds
22

Actions

Shares
Downloads
2
Comments
0
Likes
2

Embeds 668

http://lmbg.blogspot.pt 495
http://lmbg.blogspot.com 98
http://lmbg.blogspot.com.br 42
http://lmbg.blogspot.co.uk 4
http://www.blogger.com 3
http://lmbg.blogspot.ru 3
http://lmbg.blogspot.mx 3
http://lmbg.blogspot.it 3
http://lmbg.blogspot.fr 2
http://lmbg.blogspot.nl 2
http://lmbg.blogspot.in 2
http://lmbg.blogspot.sg 1
http://lmbg.blogspot.com.au 1
http://translate.googleusercontent.com 1
http://lmbg.blogspot.com.es 1
http://lmbg.blogspot.ro 1
http://lmbg.blogspot.cz 1
http://www.lmbg.blogspot.pt 1
https://twitter.com 1
http://digg.com 1
http://lmbg.blogspot.co.il 1
http://lmbg.blogspot.com.ar 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Um exemplo do uso de bases de dados relacionais SQLite e a exploração do comando Select Luis Borges Gouveia V1.2, Janeiro de 2013
  • 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: 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
  • 4. A escolha do executável correto
  • 5. Depois de extrair o ficheiro…• Aspeto do icone do executável SQLite• Aspeto da janela da linha de comando
  • 6. A linha decomando(.help)
  • 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. 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)
  • 9. 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/)
  • 10. 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 editores mais evoluídos é possível e até desejável – Seleccionar e copiar o texto e, na janela de comando, colar
  • 11. 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)
  • 12. 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;
  • 13. 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 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)
  • 14. 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
  • 15. Esquema relacional do contexto• Livro (idl, titulo, lingua, isbn)• Autor (ida, nome, nacionalidade)• Editora (ide, nome)• Escrito (idl, ida)• Publicado (idl, ide)• Compra (cmp, idl, valor, data)
  • 16. 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);
  • 17. 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)
  • 18. 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’);
  • 19. 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’);• 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’);
  • 20. 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);
  • 21. 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);• 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’);
  • 22. Obter o esquema da base de dados• Obter o esquema da base de dados biblio, utilizando o comando .schema
  • 23. PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; CREATE TABLE livro(idl integer 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ä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 Obter uma cópia da base dados 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);• De forma a poder replicar a estrutura e conteúdos INSERT INTO "livro" VALUES(12,Repensar a Sociedade da Informa‡Æo e do Conhecimento no In¡cio do S‚culo XXI,Portuguˆs,9789726186953); CREATE TABLE autor(ida integer primary key, nome text, nacionalidade text); 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); da base de dados é possível obter a sequência de 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); comandos SQL, atráves de .dump 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 Universidade Fernando Pessoa); INSERT INTO "editora" VALUES(3,Edi‡äes GestKnowing); INSERT INTO "editora" VALUES(4,VDM - Verlag Dr. Muller); – Para obter a listagem num ficheiro de texto, 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); deve ser redirecionado o output, com base no 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); comando .output nome_do_ficheiro, antes do 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); uso do comando .dump (após o comando, deve 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); redirecionar novamente o output para o ecran, 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(pub integer primary key autoincrement, idl integer, ide utilizando .output stdout) 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); – O exemplo do dump da base de dados biblio.db, 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); ao lado… 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;
  • 24. 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;
  • 25. 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;
  • 26. 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
  • 27. 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(*);
  • 28. 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