diff --git a/database.sql b/database.sql new file mode 100644 index 0000000..ab3de02 --- /dev/null +++ b/database.sql @@ -0,0 +1,157 @@ +```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); + + ``` \ No newline at end of file diff --git a/ficha1.sql b/ficha1.sql new file mode 100644 index 0000000..61f0e90 --- /dev/null +++ b/ficha1.sql @@ -0,0 +1,234 @@ +-- 2.1 Altere a coluna estado_civil da tabela pacientes para definir ‘S’ como valor +-- padrão +ALTER TABLE pacientes modify estado_civil CHAR(1) DEFAULT 'S'; + +-- 2.2-Remova o valor padrão que introduziu na alínea anterior. +ALTER TABLE pacientes modify estado_civil CHAR(1); + +-- 2.3-Altere a tabela dos seguros para remover a coluna com o estado ativo. +ALTER TABLE seguros +DROP COLUMN ativo; + +-- 2.4-Adicione à tabela pacientes uma coluna para introduzir o Número de +-- Identificação de Segurança Social (NISS). +ALTER TABLE pacientes add NISS VARCHAR(20); + +-- 2.5-Remova a coluna Número de Identificação de Segurança Social (NISS) da tabela +-- pacientes. +ALTER TABLE pacientes +DROP COLUMN NISS; + +-- 4.1-Liste todos os médicos que trabalham no Hospital Portucalense +SELECT DISTINCT + * +FROM + medicos m + INNER JOIN funcionarios f +WHERE + f.dta_fim IS NULL; + +-- 4.2-Liste o nome, o sexo e a data de nascimento dos pacientes do Hospital +-- Portucalense. +SELECT + nome, + sexo, + dta_nascimento +FROM + pacientes; + +-- 4.3-Liste as diferentes localidades dos pacientes do Hospital. +desc pacientes; + +SELECT DISTINCT + localidade +FROM + pacientes; + +-- 4.4- Quais os procedimentos que têm um custo superior a 15€ +desc procedimentos; + +SELECT + * +FROM + procedimentos +WHERE + preco > '15'; + +-- 4.5-Liste as consultas onde foram efetuados procedimentos; +desc consultas; + +desc examinacoes; + +SELECT + * +FROM + consultas c + LEFT JOIN examinacoes e ON e.nr_episodio = c.nr_episodio; + +-- 4.6-Liste as consultas que ainda não foram faturadas; +desc consultas; + +SELECT + * +FROM + consultas +WHERE + dta_pagamento IS NULL; + +-- 4.7-Quais as pacientes do sexo feminino casadas? +desc pacientes; + +SELECT + * +FROM + pacientes +WHERE + estado_civil = 'c'; + +-- 4.8-Liste os pacientes que não possuem seguro de saúde. +desc pacientes; + +desc seguros; + +SELECT + * +FROM + pacientes p + LEFT JOIN seguros s ON s.nr_apolice = p.nr_apolice; + +-- 4.9-Quais são as seguradoras que possuem parceria com o hospital que não estão a +-- cobrir o seguro de saúde de nenhum paciente? +desc seguradoras; + +desc seguros; + +desc pacientes; + +SELECT + * +FROM + seguros s + RIGHT JOIN seguradoras seg ON seg.id_seguradora = s.id_seguradora + RIGHT JOIN pacientes p ON p.nr_apolice = s.nr_apolice +WHERE + seg.id_seguradora IS NULL; + +-- 4.10-Qual é o nome dos medicamentos que não terminam em ‘ol’ nem em ‘na’? +SELECT + nome +FROM + medicamentos +WHERE + nome NOT LIKE "%ol" + AND nome NOT LIKE "%na"; + +-- 4.11-Qual o nome dos procedimentos que possuem um custo entre 20 e 30€? +desc procedimentos; + +SELECT + desc_proc +FROM + procedimentos +WHERE + preco > 20 + AND preco < 30; + +-- 4.12-Liste as localidades dos pacientes que possuem exatamente 5 caracteres. +desc pacientes; + +SELECT DISTINCT + localidade +FROM + pacientes +WHERE + length (localidade) = 5; + +-- 4.13-Quais as especialidades que possuem ‘neuro’ no nome? +desc especialidades; + +SELECT + * +FROM + especialidades +WHERE + des_especialidade LIKE "%neuro%"; + +-- 4.14-Quais as especialidades que terminam em ‘logia’? +desc especialidades; + +SELECT + * +FROM + especialidades +WHERE + des_especialidade LIKE "%logia"; + +-- 4.15-Liste os telefones dos pacientes que começam por 253 +desc pacientes; + +desc telefones_pacientes; + +SELECT + nr_telefone +FROM + telefones_pacientes +WHERE + nr_telefone LIKE "253%"; + +-- 4.16-Liste os administrativos que se chamam ‘João’ ou ‘Pedro’. +desc administrativos; + +SELECT + * +FROM + administrativos a + LEFT JOIN funcionarios f ON a.nr_mec = f.nr_mec +WHERE + f.nome LIKE "%João%" + OR f.nome LIKE "%Pedro%"; + +-- 4.17-Liste as prescrições por ordem crescente de validade, isto é, da mais antiga +-- para a mais recente. +desc prescricoes; + +SELECT + * +FROM + prescricoes +ORDER BY + data_validade asc; + +-- 4.18-Retorne para cada estado de agendamento externo (0 – hospital e 1 – externo) +-- o número total de agendamentos. +desc agendamentos; + +SELECT + externo, + COUNT(*) AS total +FROM + agendamentos +GROUP BY + externo; + +-- 4.19-Indique o número total de pacientes para os sexos feminino e masculino. +desc pacientes; + +SELECT + sexo, + COUNT(sexo) AS total +FROM + pacientes +WHERE + sexo <> 'I' +GROUP BY + sexo; + +-- 4.20-Liste os procedimentos que possuem um valor acima da média por ordem +-- decrescente de preço. + +desc procedimentos; + +select * +from procedimentos p +where p.preco > (select avg(preco) from procedimentos); + diff --git a/povoamento.sql b/povoamento.sql new file mode 100644 index 0000000..71d25d3 --- /dev/null +++ b/povoamento.sql @@ -0,0 +1,231 @@ +USE biblioteca_fc; + +-- DELETE FROM Funcionario; +-- DELETE FROM Genero; +-- DELETE FROM Livro; +-- DELETE FROM LivroInfo; +-- DELETE FROM LivroInfoGenero; +-- DELETE FROM Multa; +-- DELETE FROM Requisicao; +-- DELETE FROM Reserva; +-- DELETE FROM Utilizador; + +-- LivroInfos + +INSERT INTO `biblioteca_fc`.`Livro` ( `ISBN`, `autor`, `editora`, `titulo`, `localizacao`, `paginas`, `dta_publicacao`) VALUES + ('9781574590784', 'Pamela Jones', 'Russell-Warner', 'Cross-group 24hour standardization', '155', 465, '2017-12-05'), + ('9781015871595', 'Alicia Holland', 'Jackson-Hicks', 'User-centric mission-critical Local Area Network', '782', 464, '2015-06-07'), + ('9781613543634', 'Kenneth Benjamin', 'Berry, Harmon and Valenzuela', 'Enterprise-wide impactful support', '639', 169, '2017-11-04'), + ('9780575988583', 'Jennifer Dunn', 'Johnson PLC', 'Networked motivating workforce', '929', 446, '2022-08-01'), + ('9780578693569', 'Paul Miller', 'Fisher-Miller', 'Devolved dedicated architecture', '616', 97, '2015-11-17'), + ('9781382372343', 'Ronald Edwards', 'Bentley-Weber', 'Robust discrete hierarchy', '837', 224, '2022-03-29'), + ('9780816782819', 'Brian Parker', 'Mcknight-Gibson', 'Monitored optimal collaboration', '566', 111, '2020-05-13'), + ('9781177554350', 'Daniel Ryan', 'Martin Inc', 'Synergized bi-directional architecture', '340', 162, '2017-07-23'), + ('9780483782914', 'Matthew Burns', 'Thomas, Walters and Summers', 'Monitored multi-state process improvement', '249', 380, '2022-10-19'), + ('9780596398057', 'Jose Mcdonald', 'Allen, Stephenson and Galloway', 'Expanded coherent archive', '141', 304, '2022-01-09'); + + +-- Livros + +INSERT INTO `biblioteca_fc`.`Exemplar` (`condicao`, `disponibilidade`, `Livro`) VALUES + ('S', 'D', '9781574590784'), + ('A', 'D', '9781015871595'), + ('B', 'D', '9781613543634'), + ('C', 'D', '9780575988583'), + ('D', 'D', '9780578693569'), + ('I', 'D', '9781382372343'), + ('S', 'D', '9780816782819'), + ('A', 'D', '9781177554350'), + ('B', 'D', '9780483782914'), + ('C', 'D', '9780596398057'), + ('D', 'D', '9781574590784'), + ('I', 'D', '9781015871595'), + ('S', 'D', '9781613543634'), + ('A', 'D', '9780575988583'), + ('B', 'D', '9780578693569'), + ('C', 'D', '9781382372343'), + ('D', 'D', '9780816782819'), + ('I', 'D', '9781177554350'), + ('S', 'D', '9780483782914'), + ('A', 'D', '9780596398057'), + ('B', 'D', '9781574590784'), + ('C', 'D', '9781015871595'), + ('D', 'D', '9781613543634'), + ('I', 'D', '9780575988583'), + ('S', 'D', '9780578693569'); + +-- Utilizadores (já feito pelo python) + + + +-- Livro Género +INSERT INTO `biblioteca_fc`.`Genero` (descricao) VALUES + ('Romance'), + ('Ficção científica'), + ('Fantasia'), + ('Suspense'), + ('Mistério'), + ('Aventura'), + ('Horror'), + ('História'), + ('Biografia'), + ('Autobiografia'), + ('Poesia'), + ('Drama'), + ('Comédia'), + ('Fábula'), + ('Ficcção'); + + +-- Funcionário + +INSERT INTO `biblioteca_fc`.`Funcionario` (`contacto_emergencia`, `telefone`, `cc`, `email`, `dta_nascimento`, `nome`, `dta_fim_servico`, `dta_inicio_servico`, `codigo_postal`, `morada`, `cidade`) VALUES + ('912345678', '987654321', '12345678', 'funcionario1@example.com', '1990-01-01', 'José Silva', NULL, '2022-01-01', '1234-567', 'Rua Principal, 1', 'Lisboa'), + ('923456789', '876543210', '23456789', 'funcionario2@example.com', '1985-02-02', 'Ana Santos', NULL, '2021-12-01', '2345-678', 'Avenida Central, 2', 'Porto'), + ('934567890', '765432109', '34567890', 'funcionario3@example.com', '1992-03-03', 'Pedro Costa', NULL, '2022-03-15', '3456-789', 'Travessa Secundária, 3', 'Braga'), + ('945678901', '654321098', '45678901', 'funcionario4@example.com', '1988-04-04', 'Marta Rodrigues', NULL, '2022-02-28', '4567-890', 'Praça Central, 4', 'Coimbra'), + ('956789012', '543210987', '56789012', 'funcionario5@example.com', '1995-05-05', 'Ricardo Ferreira', '2023-05-15', '2022-01-01', '5678-901', 'Rua Principal, 5', 'Faro'), -- 5 + ('967890123', '432109876', '67890123', 'funcionario6@example.com', '1993-06-06', 'Sofia Gonçalves', NULL, '2022-04-30', '6789-012', 'Avenida Central, 6', 'Lisboa'), + ('978901234', '321098765', '78901234', 'funcionario7@example.com', '1987-07-07', 'Carlos Almeida', NULL, '2021-11-15', '7890-123', 'Travessa Secundária, 7', 'Porto'), + ('989012345', '210987654', '89012345', 'funcionario8@example.com', '1994-08-08', 'Inês Sousa', NULL, '2022-06-30', '8901-234', 'Praça Central, 8', 'Braga'), + ('990123456', '109876543', '90123456', 'funcionario9@example.com', '1989-09-09', 'João Lopes', '2023-05-31', '2022-01-01', '9012-345', 'Rua Principal, 9', 'Coimbra'), -- 9 + ('901234567', '098765432', '01234567', 'funcionario10@example.com', '1991-10-10', 'Mariana Oliveira', NULL, '2022-05-31', '0123-456', 'Avenida Central, 10', 'Faro'); + + +-- Requisição + +INSERT INTO `biblioteca_fc`.`Requisicao` (`estado`, `data`, `Utilizador`, `Funcionario`, `Exemplar`) VALUES -- Falta aqui rever as foreign keys + -- Em aberto + ('A', '2023-05-01', 1, 1, 1), + ('A', '2023-05-02', 2, 2, 2), + ('A', '2023-05-03', 3, 3, 3), + ('A', '2023-04-04', 4, 4, 4), + ('A', '2023-04-05', 5, 2, 5), + ('A', '2023-04-06', 6, 6, 6), + ('A', '2023-03-07', 7, 7, 7), + ('A', '2023-03-08', 8, 8, 8), + ('A', '2023-03-09', 9, 2, 9), + ('A', '2023-03-10', 10, 10, 10), + -- Concluídos + ('C', '2021-05-11', 11, 1, 11), + ('C', '2021-05-12', 12, 5, 12), + ('C', '2021-05-13', 13, 3, 13), + ('C', '2022-05-14', 14, 4, 14), + ('C', '2022-05-15', 15, 5, 15), + ('C', '2022-05-16', 16, 6, 16), + ('C', '2022-05-17', 17, 7, 17), + ('C', '2022-05-18', 8, 8, 18), + ('C', '2022-05-19', 8, 9, 19), + ('C', '2022-05-20', 8, 10, 20), + ('C', '2022-05-21', 1, 1, 21), + ('C', '2022-01-22', 2, 1, 3), + ('C', '2022-01-23', 3, 1, 3), + ('C', '2022-01-24', 4, 1, 3), + ('C', '2022-01-25', 5, 1, 3), + ('C', '2021-06-11', 11, 1, 11), + ('C', '2021-06-12', 12, 5, 12), + ('C', '2021-06-13', 13, 3, 13), + ('C', '2022-06-14', 14, 4, 14), + ('C', '2022-07-15', 15, 5, 15), + ('C', '2022-07-16', 16, 6, 16), + ('C', '2022-07-17', 17, 7, 17), + ('C', '2022-07-18', 8, 8, 18), + ('C', '2022-07-19', 8, 9, 19), + ('C', '2022-07-20', 8, 10, 20), + ('C', '2022-07-21', 1, 1, 21), + ('C', '2022-07-22', 2, 1, 5), + ('C', '2022-07-23', 3, 1, 5), + ('C', '2022-08-24', 4, 1, 5), + ('C', '2021-08-11', 11, 1, 11), + ('C', '2021-08-12', 12, 5, 12), + ('C', '2021-08-13', 13, 3, 13), + ('C', '2022-08-14', 14, 4, 14), + ('C', '2022-08-15', 15, 5, 15), + ('C', '2022-08-16', 16, 6, 16), + ('C', '2022-08-17', 17, 7, 17), + ('C', '2022-08-18', 8, 8, 18), + ('C', '2022-08-19', 8, 9, 19), + ('C', '2022-08-20', 8, 10, 20), + ('C', '2022-08-21', 1, 1, 21), + ('C', '2022-08-22', 2, 1, 3), + ('C', '2022-08-23', 3, 1, 5), + ('C', '2022-08-24', 4, 1, 5), + ('C', '2022-08-25', 5, 1, 6), + ('C', '2021-08-11', 11, 1, 11), + ('C', '2021-06-12', 12, 5, 12), + ('C', '2021-09-13', 13, 3, 13), + ('C', '2022-09-14', 14, 4, 14), + ('C', '2021-09-15', 15, 5, 15), + ('C', '2021-09-16', 16, 6, 16), + ('C', '2020-09-17', 17, 7, 17), + ('C', '2020-09-18', 8, 8, 18), + ('C', '2020-09-19', 8, 9, 19), + ('C', '2020-09-20', 8, 10, 20), + ('C', '2020-09-21', 1, 1, 21), + ('C', '2020-09-22', 2, 1, 6), + ('C', '2020-09-23', 3, 1, 6), + ('C', '2020-09-24', 4, 1, 6), + ('C', '2022-10-20', 8, 10, 20), + ('C', '2022-10-21', 1, 1, 21), + ('C', '2022-10-22', 2, 1, 9), + ('C', '2022-10-23', 3, 1, 9), + ('C', '2022-10-24', 4, 1, 9), + ('C', '2022-10-25', 5, 1, 9), + ('C', '2021-10-11', 11, 1, 11), + ('C', '2021-11-12', 12, 5, 12), + ('C', '2021-11-13', 13, 3, 13), + ('C', '2022-11-14', 14, 4, 14), + ('C', '2021-11-15', 15, 5, 15), + ('C', '2021-12-16', 16, 6, 16), + ('C', '2020-12-17', 17, 7, 17), + ('C', '2020-12-18', 8, 8, 18), + ('C', '2020-12-19', 8, 9, 19), + ('C', '2020-12-20', 8, 10, 20), + ('C', '2020-12-21', 1, 1, 21), + ('C', '2020-12-22', 2, 1, 3), + ('C', '2020-12-23', 3, 1, 3), + ('C', '2020-12-24', 4, 1, 3), + ('C', '2022-12-25', 5, 1, 3); +-- Multa + +INSERT INTO `biblioteca_fc`.`Multa` (`estado`, `montante`, `tipo`, `Requisicao`) VALUES + ('N', 10.00, 'A', 1), + ('N', 25.00, 'D', 1), + ('P', 5.75, 'D', 2), + ('N', 10.00, 'A', 4), + ('P', 1.25, 'D', 9), + ('N', 10.00, 'A', 6), + ('N', 10.00, 'A', 7), + ('N', 10.00, 'A', 8), + ('P', 10.00, 'A', 9), + ('P', 10.00, 'A', 10), + ('P', 10.00, 'A', 5), + ('N', 10.00, 'A', 3); + +-- Reserva + +INSERT INTO `biblioteca_fc`.`Reserva` (`estado`, `data`, `Utilizador`, `Livro`) VALUES -- Falta aqui rever as foreign keys + ('C', '2023-05-01', 1, 9780578693569), + ('C', '2023-04-02', 2, 9780575988583), + ('R', '2023-04-03', 3, 9780596398057), + ('R', '2023-05-04', 4, 9780483782914); + + +-- LivroInfoGenero + +INSERT INTO `biblioteca_fc`.`LivroGenero` (`Livro`, `Genero`) VALUES + (9781574590784,1), + (9781574590784,2), + (9781574590784,3), + (9781015871595,4), + (9781015871595,6), + (9781613543634,1), + (9780575988583,10), + (9780578693569,11), + (9781382372343,15), + (9780816782819,14), + (9780816782819,9), + (9780816782819,2), + (9780816782819,5), + (9781177554350,2), + (9780596398057,13); \ No newline at end of file