Objectivos: introdução a SQL, uso da consola MySQL, sqlite3, e sqlitebrowser
Material de apoio: SQL ("slides")
O MySQL está instalado nos computadores de laboratório.
Para se ligar ao servidor de MySQL através de uma consola de comandos execute:
$ mysql -uguest
Deverá obter em resposta algo similar a:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 27
Server version: 8.0.15 MySQL Community Server - GPL
...
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
A tabela seguinte resume alguns dos principais comandos que pode executar na consola. Experimente por exemplo os comandos help, e show databases;.
Comando | Significado |
---|---|
help | Mostra lista de comandos disponíveis. |
help comando | Mostra ajuda relativa a comando. |
quit | Termina a consola. |
source comandos.sql | Carrega comandos do ficheiro comandos.sql. |
show databases; | Mostra lista de BDs existentes. |
use NomeDeBD ; | Torna NomeDeBD a BD actual. Comandos subsequentes terão NomeDeBD como contexto. |
show tables; | Mostra as tabelas da BD actual. |
desc NomeDeTabela ; | Lista a descrição do esquema da tabela com nome NomeDeTabela. |
Para além dos comandos acima, pode ainda executar as instruções típicas de manipulação de esquema (ex. CREATE TABLE) ou dados (ex. INSERT, SELECT, UPDATE, e DELETE). Se estas forem complexas ou quiser executar várias instruções de uma só vez, será preferível colocar esseas intruções num ficheiro e carregá-los com o comando source descrito previamente.
Descarregue o seguinte ficheiro da BD biblioteca: bd_bib.sql e carregue-o usando o comando source bd_bib.sql.
mysql> source bd_bib.sql;
Poderá depois verificar que tabelas compõem a BD, obter descrição do esquema ou consultar o conteúdo de uma tabela, por exemplo:
mysql> show tables;
+----------------------+
| Tables_in_biblioteca |
+----------------------+
| AUTORES |
| CÓPIA |
| ESTANTE |
| LIVRO |
| PRATELEIRA |
| SECÇÃO |
| UTENTE |
+----------------------+
9 rows in set (0.00 sec)
mysql> desc LIVRO;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| ISBN | bigint(20) | NO | PRI | NULL | |
| Título | varchar(64) | NO | | NULL | |
| Editora | varchar(32) | NO | | NULL | |
| Ano | year(4) | NO | | NULL | |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
mysql> select * from LIVRO;
+---------------+-----------------------------------------+-------------------+------+
| ISBN | Título | Editora | Ano |
+---------------+-----------------------------------------+-------------------+------+
| 9780131103627 | The C Programming Language, 2nd edition | Prentice Hall | 1988 |
| 9780321356680 | Effective Java | Pearson Education | 2008 |
| 9789720049759 | A Mensagem | Porto Editora | 2017 |
| 9789722526289 | Sonetos | WOOK 11-17 | 2013 |
| 9789722709620 | Os Lusíadas | INCM | 1999 |
| 9789724138695 | Astérix o Gaulês | Edições Asa | 2004 |
| 9789724138947 | A Volta à Gália de Astérix | Edições Asa | 2005 |
+---------------+-----------------------------------------+-------------------+------+
7 rows in set (0.00 sec)
Nota: em qualquer altura pode executar novamente source bd_bib.sql para repôr o estado inicial da BD.
O diagrama abaixo sumariza o esquema relacional da BD. Consulte bd_bib.sql para mais detalhes.
Insira um novo utente com os seguintes dados:
Consulte agora a tabela UTENTE para ler os dados da Mariana Silva, inserida no passo anterior. Use uma cláusula WHERE na instrução SELECT que tenha em conta o nº de utente da Mariana Silva na cláusula WHERE.
Suponha agora a utente Mariana Silva deseja requisitar uma cópia de 'Os Lusíadas'. Proceda nos seguintes passos:
Suponha que agora cópia nº 1 de 'Os Lusíadas' foi devolvida por um utente. Qual é o utente em causa? Actualize a tabela CÓPIA para registar a devolução.
A estante 'E12' está muito mau estado e vai ser retirada da biblioteca. Todos as cópias de livros nessa estante deverão ficar afectos à estante 'E13', mantendo-se o número da prateleira. Actualize a BD em conformidade nos seguintes passos:
Usando consultas à BD, obtenha os ISBNs de livros:
Na BD de biblioteca será agora necessário representar funcionários da própria biblioteca.
Para esse efeito crie a tabela FUNCIONÁRIO em bd_bib.sql. A tabela deverá ter os mesmos atributos e restrições que tabela UTENTE, e ainda os seguintes atributos:
Insira de seguida 6 registos em FUNCIONÁRIO usando dados à sua escolha, por forma a que haja 2 supervisores de todos os outros funcionários (i.e., 2 supervisionados por supervisor). Use uma única instrução INSERT para o efeito.
No final, remova o tabela e os dados associados a esta usando uma instrução DROP TABLE.
Considere agora que a biblioteca tem também disponíveis revistas para leitura na própria biblioteca.
Cria uma tabela REVISTA com os seguintes atributos, todos não opcionais (NOT NULL):
De seguida crie uma tabela EDIÇÃO_DE_REVISTA que para registar edições de revistas com os seguintes atributos não-opcionais (NOT NULL):
A chave primária de REVISTA_EDIÇÃO deverá ser formada pelo par (NumR,NumEd).
Efectue as seguintes operações sobre a BD, empregando operadores e funções SQL.
Para resolver os exercícios poderá ser útil a consulta da secção "Functions and Operators" do manual de referência MySQL.
Faça consultas à BD para obter:
(Antes e depois de cada actualização pedida a seguir faça consultas à tabela em questão para verificar o efeito pretendido. Se errar pode retornar ao estado inicial da BD com source bd_bib.sql.)
Actualize a BD, alterando:
os emails de utentes para conterem apenas letras maiúsculas ("upper-case"), usando a função UPPER;
actualizando a arrumação de todas as cópias em estantes com código começado por 'E1' (usando LIKE) para a estante 'E99' e ainda incrementando o número da prateleira.
Edite o ficheiro bd_bib.sql para definir os seguintes valores de omissão usando o modificador DEFAULT:
Insira de seguida um novo registo em cada uma das tabelas omitindo valores para os atributos em causa.
Novamente em bd_bib.sql adicione o modificador AUTO_INCREMENT a UTENTE.Num. No mesmo ficheiro edite as inserções em UTENTE por forma a omitir Num e verifique que os utentes ficam com numeração consecutiva recarregando a base de dados.
Usando o comando ALTER TABLE faça as seguintes alterações ao esquema da BD, verificando posteriormente os efeitos nas tabelas envolvidas (com consultas e desc TABELA):
Usando ON UPDATE CASCADE configure o esquema da BD por forma a que a actualização do ISBN de um livro seja propagada às tabelas AUTORES e CÓPIA.
De seguida actualize o ISBN de um livro e observe os efeitos em AUTORES e CÓPIA.
Usando ORDER BY e/ou LIMIT e/ou DISTINCT consulte:
Execute consultas agregadas para obter:
Execute consultas sobre múltiplas tabelas, sem usar consultas encadeadas ou operadores de junção ("joins"), para obter a:
Execute consultas encadeadas, sem usar operadores de junção ("joins"), para obter:
os nomes de utentes e correspondentes nº total de cópias emprestadas, usando uma consulta com o seguinte esqueleto.
SELECT
U.Nome,
(SELECT ... FROM CÓPIA WHERE ...) As NumCópias
FROM UTENTE U;
Usando consultas encadeadas, proceda às seguintes alterações à BD com uma única instrução UPDATE ou DELETE e usando os títulos de livros e nomes de autores ou utentes directamente quando necessário (sem recorrer a ISBNs ou nº de utente). Antes e depois das alterações, consulte o estado da tabela afectada para verificar a correção da operação.
Nesta questão use o operador JOIN para efectuar consultas, depois averigue se é possível empregar antes NATURAL JOIN pelo menos em parte da consulta.
Efectue consultas com operadores de junção para obter:
a relação entre o código da secções da biblioteca (tabela SECÇÃO) e o nº total de cópias de livros associadas a prateleiras nessa secção. O resultado esperado é:
+---------+----------+
| Código | COUNT(*) |
+---------+----------+
| BD | 6 |
| L | 9 |
| T | 3 |
+---------+----------+
Use uma junção externa (OUTER JOIN) entre PRATELEIRA e CÓPIA para descobrir que prateleiras se encontram vazias, i.e., não terem cópias de livros associadas.
Usando a instrução CREATE VIEW defina as seguintes vistas SQL ("views"):
ARRUMAÇÃO(Título, NumCópia, Estante, Prateleira) para representar a arrumação de cópias de livros em termos do título de livro, nº de cópia, e a estante e prateleira de arrumação, de forma ordenada por título de livro e nº de cópia. Precisa de considerar as tabelas LIVRO e CÓPIA para a definição da vista. Espera-se o seguinte resultado para SELECT * FROM ARRUMAÇÃO:
+-----------------------------------------+-----------+------------+---------+
| Título | NumCópia | Prateleira | Estante |
+-----------------------------------------+-----------+------------+---------+
| A Mensagem | 1 | E13 | 2 |
| A Mensagem | 2 | E13 | 2 |
| A Mensagem | 3 | E13 | 2 |
| A Volta à Gália de Astérix | 1 | E14 | 2 |
| A Volta à Gália de Astérix | 2 | E14 | 2 |
| Astérix o Gaulês | 1 | E14 | 1 |
| Astérix o Gaulês | 2 | E14 | 1 |
| Astérix o Gaulês | 3 | E14 | 1 |
| Astérix o Gaulês | 4 | E14 | 1 |
| Effective Java | 1 | E99 | 3 |
| Os Lusíadas | 1 | E12 | 1 |
| Os Lusíadas | 2 | E12 | 1 |
| Os Lusíadas | 3 | E12 | 2 |
| Os Lusíadas | 4 | E12 | 2 |
| Sonetos | 1 | E13 | 1 |
| Sonetos | 2 | E13 | 2 |
| The C Programming Language, 2nd edition | 1 | E99 | 3 |
| The C Programming Language, 2nd edition | 2 | E99 | 3 |
+-----------------------------------------+-----------+------------+---------+
LIVROS_POR_SECÇÃO(SCódigo, SDesc, Total) para representar por cada secção da biblioteca (em termos do seu código e descrição na tabela SECÇÃO) o nº total de cópias associadas a prateleiras dessa secção, de forma ordenada por código de secção; precisa de considerar as tabelas SECÇÃO, ESTANTE e CÓPIA. Espera-se o seguinte resultado de SELECT * FROM LIVROS_POR_SECÇÃO:
+----------+------------------+-------+
| SCódigo | SDesc | Total |
+----------+------------------+-------+
| BD | Banda Desenhada | 6 |
| L | Literatura | 9 |
| T | Livros Técnicos | 3 |
+----------+------------------+-------+
``