157 lines
3.7 KiB
MySQL
157 lines
3.7 KiB
MySQL
|
```sql
|
||
|
USE biblioteca_fc;
|
||
|
|
||
|
|
||
|
DESC Funcionario;
|
||
|
DESC Genero;
|
||
|
DESC Livro;
|
||
|
DESC LivroInfo;
|
||
|
DESC LivroInfoGenero;
|
||
|
DESC Multa;
|
||
|
DESC Requisicao;
|
||
|
DESC Reserva;
|
||
|
DESC Utilizador;
|
||
|
|
||
|
SELECT * FROM Funcionario;
|
||
|
SELECT * FROM Genero;
|
||
|
SELECT * FROM Livro;
|
||
|
SELECT * FROM Exemplar;
|
||
|
SELECT * FROM LivroGenero;
|
||
|
SELECT * FROM Multa;
|
||
|
SELECT * FROM Requisicao;
|
||
|
SELECT * FROM Reserva;
|
||
|
SELECT * FROM Utilizador;
|
||
|
|
||
|
SHOW TABLES;
|
||
|
|
||
|
-- Obter a lista de funcionários atuais
|
||
|
|
||
|
SELECT * FROM Funcionario
|
||
|
WHERE dta_fim_servico IS NULL;
|
||
|
|
||
|
-- Obter os livros que estão atualmente emprestados
|
||
|
|
||
|
SELECT * FROM Livro
|
||
|
WHERE disponibilidade = 'I';
|
||
|
|
||
|
-- Obter as reservas feitas
|
||
|
|
||
|
SELECT * FROM Reserva;
|
||
|
|
||
|
-- Obter multas aplicadas de um dado cliente
|
||
|
|
||
|
DELIMITER //
|
||
|
CREATE PROCEDURE multasCliente(id int)
|
||
|
BEGIN
|
||
|
SELECT * FROM Multa m INNER JOIN Requisicao r ON m.Requisicao=r.Utilizador
|
||
|
WHERE r.Utilizador=id;
|
||
|
END
|
||
|
// DELIMITER ;
|
||
|
|
||
|
-- CALL multasCliente(2);
|
||
|
|
||
|
-- Obter o histórico de requisições de um determinado utilizador
|
||
|
|
||
|
DELIMITER //
|
||
|
CREATE PROCEDURE requisicoesCliente(id int)
|
||
|
BEGIN
|
||
|
SELECT * FROM Requisicao
|
||
|
WHERE Utilizador=id
|
||
|
ORDER BY `data` DESC;
|
||
|
END
|
||
|
// DELIMITER ;
|
||
|
|
||
|
-- CALL requisicoesCliente(2);
|
||
|
|
||
|
|
||
|
-- Saber quais os géneros mais requisitados.
|
||
|
|
||
|
SELECT g.descricao,COUNT(g.descricao) AS nr_ocorrencias FROM Genero g
|
||
|
INNER JOIN LivroGenero lg ON g.id=lg.Genero
|
||
|
INNER JOIN Livro l ON l.ISBN=lg.Livro
|
||
|
INNER JOIN Exemplar e ON e.Livro=l.ISBN
|
||
|
INNER JOIN Requisicao r ON r.Exemplar=e.id
|
||
|
GROUP BY g.descricao
|
||
|
ORDER BY nr_ocorrencias DESC;
|
||
|
|
||
|
-- Se um livro for devolvido numa condição inferior à emprestada, deve ser aplicada uma multa
|
||
|
|
||
|
DELIMITER //
|
||
|
CREATE PROCEDURE multaDano(idRequisicao int,montante decimal(8,2))
|
||
|
BEGIN
|
||
|
INSERT INTO Multa(`montante`, `tipo`, `Requisicao`) VALUES
|
||
|
(montante, 'D', idRequisicao);
|
||
|
END
|
||
|
// DELIMITER ;
|
||
|
|
||
|
-- CALL requisicoesCliente(1, 5.5);
|
||
|
|
||
|
-- Realizar a reserva de um livro
|
||
|
|
||
|
DELIMITER //
|
||
|
CREATE PROCEDURE reservaLivro(idUser int,idLivro int)
|
||
|
BEGIN
|
||
|
INSERT INTO Reserva(`data`,`Utilizador`, `Livro`) VALUES
|
||
|
(CURDATE(), idUser, idLivro);
|
||
|
END
|
||
|
// DELIMITER ;
|
||
|
|
||
|
-- Registo de uma requisicao
|
||
|
|
||
|
DELIMITER //
|
||
|
CREATE PROCEDURE registaRequisicao(idUser int,idFuncionario int, idExemplar int)
|
||
|
BEGIN
|
||
|
INSERT INTO Requisicao(`data`,`Utilizador`, `Funcionario`,`Exemplar`) VALUES
|
||
|
(CURDATE(), idUser, idFuncionario, idExemplar);
|
||
|
END
|
||
|
// DELIMITER ;
|
||
|
|
||
|
-- CALL registaRequisicao(1,1,1);
|
||
|
|
||
|
|
||
|
-- Utilizadores mais ativos da biblioteca
|
||
|
|
||
|
SELECT u.nome, COUNT(r.Utilizador) AS `Número de Requisições`
|
||
|
FROM Requisicao r INNER JOIN Utilizador u ON u.id=r.Utilizador
|
||
|
GROUP BY r.Utilizador
|
||
|
ORDER BY `Número de Requisições` DESC;
|
||
|
|
||
|
|
||
|
-- Funcionários mais ativos da biblioteca
|
||
|
|
||
|
SELECT f.nome, COUNT(r.Funcionario) AS `Número de Requisições Registadas`
|
||
|
FROM Requisicao r INNER JOIN Funcionario f ON f.id=r.Funcionario
|
||
|
GROUP BY r.Funcionario
|
||
|
ORDER BY `Número de Requisições Registadas` DESC;
|
||
|
|
||
|
-- Lista de livro mais populares da biblioteca
|
||
|
|
||
|
SELECT TOTAL.titulo AS `Título`, TOTAL.Exemplares + TOTAL.Reservas AS Popularidade FROM
|
||
|
(
|
||
|
SELECT l.titulo, COUNT(req.Exemplar) AS Exemplares, COUNT(res.Livro) AS Reservas
|
||
|
FROM Requisicao req
|
||
|
INNER JOIN Exemplar e ON req.Exemplar = e.id
|
||
|
INNER JOIN Livro l ON l.ISBN = e.Livro
|
||
|
LEFT JOIN Reserva res ON res.Livro = l.ISBN
|
||
|
GROUP BY e.Livro
|
||
|
) AS TOTAL ORDER BY Popularidade DESC;
|
||
|
|
||
|
|
||
|
-- Entrega de um Livro (O estado do livro é atualizado por um trigger)
|
||
|
|
||
|
DELIMITER //
|
||
|
CREATE PROCEDURE registaEntrega(idUser int,idFuncionario int, idExemplar int)
|
||
|
BEGIN
|
||
|
UPDATE Requisicao r
|
||
|
SET r.estado='C'
|
||
|
WHERE r.Utilizador=idUser
|
||
|
AND r.Funcionario=idFuncionario
|
||
|
AND r.Exemplar=idExemplar;
|
||
|
END
|
||
|
// DELIMITER ;
|
||
|
|
||
|
SHOW INDEXES FROM Livro;
|
||
|
|
||
|
-- CALL registaEntrega(1,1,1);
|
||
|
|
||
|
```
|