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

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

on

  • 1,662 views

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

Statistics

Views

Total Views
1,662
Views on SlideShare
1,051
Embed Views
611

Actions

Likes
2
Downloads
2
Comments
0

21 Embeds 611

http://lmbg.blogspot.pt 454
http://lmbg.blogspot.com 84
http://lmbg.blogspot.com.br 41
http://lmbg.blogspot.co.uk 4
http://lmbg.blogspot.it 3
http://www.blogger.com 3
http://lmbg.blogspot.ru 3
http://lmbg.blogspot.mx 3
http://lmbg.blogspot.fr 2
http://lmbg.blogspot.nl 2
http://lmbg.blogspot.in 2
http://lmbg.blogspot.com.au 1
http://lmbg.blogspot.com.es 1
http://lmbg.blogspot.ro 1
http://lmbg.blogspot.sg 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://translate.googleusercontent.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

CC Attribution-NonCommercial-NoDerivs LicenseCC Attribution-NonCommercial-NoDerivs LicenseCC Attribution-NonCommercial-NoDerivs License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • 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
  • 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
  • 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
  • A escolha do executável correto
  • Depois de extrair o ficheiro…• Aspeto do icone do executável SQLite• Aspeto da janela da linha de comando
  • A linha decomando(.help)
  • 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
  • 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)
  • 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/)
  • 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
  • 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)
  • 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;
  • 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)
  • 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
  • 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)
  • 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);
  • 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)
  • 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’);
  • 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’);
  • 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);
  • 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’);
  • Obter o esquema da base de dados• Obter o esquema da base de dados biblio, utilizando o comando .schema
  • 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;
  • 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;
  • 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;
  • 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
  • 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(*);
  • 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