You are on page 1of 5

SQL

Exerccios Reviso
Pretende-se desenvolver uma base de dados com o nome TrofaLimpa, utilizando a linguagem SQL, que
permita efectuar a gesto dos funcionrios da empresa TrofaLimpa. Os funcionrios esto organizados por
seces e cada seco pode ter mais do que um funcionrio mas, cada funcionrio apenas pode pertencer a
uma seco.
Na criao da base de dados registe todos os comandos SQL efectuados e tenha em ateno as indicaes
das seguintes alneas:
1. Os dados na base de dados ficaro organizados logicamente de acordo com o diagrama E-R seguinte:

2. Os dados na base de dados vo ficar organizados nas seguintes tabelas:

3. Crie as tabelas anteriores atribuindo aos campos os tipos de dados e clusulas que considera mais
adequadas. No se esquea de criar as ligaes entre as tabelas tal como esto representadas
diagramas E-R anterior.
4. Registe na base de dados os seguintes dados:

1. No se esquea de criar as chaves externas (CodSeco e CodEmp) e de estabelecer os


relacionamentos entre as tabelas Empregado <-> Seco/Empregado e entre Seo <-> Seco
garantindo a integridade referencial.
create database castlimpo;
create table Empregado (
CodEmp int not null auto_increment,
Nome varchar(30),
primary key (CodEmp)
);
create table Seco (
Codseco int not null auto_increment,
Designasec varchar(26),
primary key (Codseco)
);
create table Seco_Empregado (
Codemp int not null,
Codseco int not null,
primary key (Codemp,Codseco),
FOREIGN KEY (Codemp) REFERENCES Empregado (Codemp)on update cascade on delete cascade,
FOREIGN KEY (Codseco) REFERENCES seco (Codseco)on update cascade on delete cascade
)
INSERT INTO empregado(Nome) VALUES ('Joaquim');
INSERT INTO empregado(Nome) VALUES ('Rosa');
INSERT INTO empregado(Nome) VALUES ('Maria');
INSERT INTO empregado(Nome) VALUES ('Agostinho');
INSERT INTO seco(Designasec) VALUES (Informtica);
INSERT INTO seco(Designasec) VALUES (Manuteno);
INSERT INTO seco(Designasec) VALUES (Contabilidade);
INSERT INTO seco(Designasec) VALUES (Financeira);
INSERT INTO seco_empregado (Codemp,Codseco) VALUES (1,1);
INSERT INTO seco_empregado (Codemp,Codseco) VALUES (2,2);
INSERT INTO seco_empregado (Codemp,Codseco) VALUES (3,3);
INSERT INTO seco_empregado (Codemp,Codseco) VALUES (4,4);
2. Acrescente na tabela Empregado o campo DataNasc, com tipo de dado Date e de preenchimento
obrigatrio.
ALTER TABLE empregado ADD datanasc date not null;
3. Insira no campo DataNasc, da tabela Empregado os seguintes dados:
DataNasc
1988-12-1
1987-11-11
1978-12-12
1978-2-3

UPDATE empregado SET datanasc=1988-12-1 WHERE codemp=1;


UPDATE empregado SET datanasc=1987-11-11 WHERE codemp=2;
UPDATE empregado SET datanasc=1978-12-12 WHERE codemp=3;

UPDATE empregado SET datanasc=1978-2-3 WHERE codemp=4;


4. Altere o nome do campo Nome para NomeEmp.
ALTER TABLE empregado CHANGE nome nomeemp varchar(30);
5. Efetue as alteraes necessrias no campo CodSeco de forma que passe a fazer o incremento
automtico dos cdigos aquando da insero de novos registos.
ALTER TABLE seco MODIFY codseco int auto_increment;
6. Acrescente na tabela Seco/Empregado o campo DataHoraIncio com o tipo de dados adequado de
forma que apresente a data e hora do sistema aquando da insero do registo.
ALTER TABLE seco_empregado ADD datahoraincio timestamp;

7. Insira no campo DataHoraIncio nos quatro registos existentes na tabela Seco/Empregado a data
hora de 2013-2-1 13:30:30.
UPDATE seco_empregado SET datahoraincio = 2013-2-1 13:30:30;
8. Acrescente o campo NumEmp, na tabela Seco, do tipo inteiro e de forma que seja preenchido por
defeito com o valor 13 e aceite apenas valores superiores ou iguais a 6.
ALTER TABLE seco ADD numemp int default 13 check (numemp>=6);
9. Insira no campo NumEmp, da tabela Seco, os dados a seguir apresentados:
NumEmp
8
13
6
8

UPDATE seco SET numemp = 8;


UPDATE seco SET numemp = 13;
UPDATE seco SET numemp = 6;
UPDATE seco SET numemp = 8;
10. Defina como chave externa o campo CodCondutor, da tabela Viaturas, estando ligado ao campo
CodCond, da tabela Condutores.
11. Crie o ndice DataOrd a partir do campo DataNasc, da tabela Empregado.
CREATE INDEX dataord ON empregado (datanasc);
12. Liste todos os dados da tabela Empregado.
SELECT * FROM empregado;
13. Liste todos os dados da tabela Empregado, ordenados pelo campo Datanasc.
SELECT * FROM empregado ORDER BY datanasc;

14. Crie o ndice NEmpOrd a partir do campo NumEmp, da tabela Seco.


CREATE INDEX nempord ON seco(numemp);
15. Liste os dados dos campos CodSeco e DesignaSec, da tabela Seco, com valores em CodSeco
superiores a 2.
SELECT codseco, designasec FROM seco WHERE codseco>2;
16. Elimine o ndice DataOrd da tabela Empregado.
ALTER TABLE empregado DROP INDEX dataord;
17. Acrescente o campo SalEmp, na tabela Empregado, do tipo decimal e de forma que seja preenchido
por defeito com o valor 600 e aceite apenas valores superiores ou iguais a 500.
ALTER TABLE empregado ADD salemp decimal DEFAULT 600 CHECK (salemp>=500);
18. Insira no campo SalEmp, da tabela Empregado, os dados a seguir apresentados:
SalEmp
750
900
600
650

INSERT INTO empregado (salemp) values (750);


INSERT INTO empregado (salemp) values (900);
INSERT INTO empregado (salemp) values (600);
INSERT INTO empregado (salemp) values (650);

1. Crie a View VEmp para apresentar o cdigo e nome dos empregados, cujo salrio esteja
compreendido entre 599 e 899, os dados so apresentados por ordem decrescente do valor
do salrio.
CREATE VIEW VEmp (Cdigo,Nome) AS SELECT codemp,nomeemp FROM empregado WHERE
salemp>599 AND salemp<899 ORDER BY salemp DESC
2. Crie a view VSalM para apresentar a mdia dos salrios recebidos pelos empregados.
CREATE VIEW VSalM (mdia) AS SELECT AVG(salemp) FROM empregado;
3. Crie a view VSecMin para apresentar o cdigo e designao da seco com menor nmero de
empregados.
CREATE VIEW VSecMin (Cdigo,Designao) AS SELECT codseco,designasec FROM seco WHERE
numemp=(SELECT MIN(numemp) FROM seco);
4. Crie a view VEmpMax para apresentar o cdigo e nome dos empregados cujo salrio seja
igual ao salrio mximo recebido.

CREATE VIEW VEmpMax (Cdigo,Nome) AS SELECT codemp,nomeemp FROM empregado WHERE


salemp=(SELECT MAX(salemp) FROM empregado);
5. Crie a view VSAnual para apresentar o cdigo e salrio total recebido pelo empregado,
considerando que recebe subsdio de frias e de natal, os dados so apresentados por ordem
crescente do cdigo.
CREATE VIEW VSAnual (Cdigo,Salrio_total) AS SELECT codemp,salemp*14 FROM empregado
ORDER BY codemp ASC;
6. Visualize o contedo da view VSAnual.
SELECT * FROM vsanual;
7. Crie a view VSEmp para apresentar uma lista com os nomes dos empregados que pertencem
seco Informtica com o cdigo 1.
CREATE VIEW VSEmp (Nomes_empregados) AS SELECT (nomeemp) FROM
empregado,seco_empregado WHERE seco_empregado.codseco=1 and
seco_empregado.codseco=empregado.codemp
8. Apague a view VSEmp.
DROP VIEW vsemp;

You might also like