Álgebra Relacional Considere as Relações Funcionários (F) e Dependentes (D), com o seguinte esquema simplificado: Funcionários (numf, nomef) Dependentes (numf, nomed, par) Numf referencia Funcionários (numf) Onde, numf: número do funcionário, nomef: nome do funcionário, nomed: nome do dependente e par: parentesco, que pode ser um dentre: filho, filha, esposo, esposa, etc. Observe que em Dependente, numf é uma chave estrangeira que referencia a chave primária de Funcionários. Abaixo é mostrada uma possível instância dessas relações. Funcionários Numf Nomef 01 Antonio Silva 02 José Morais 03 Maria Pereira 04 Ana Silva Dependentes Numf Nomed Par 01 Alice Filha 02 Alice Esposa 02 Clara Filha 03 José Filho Pede-se 1) Crie as duas tabelas no banco de dados 2) Insira as linhas acima nas respectivas tabelas 3) Escreva a expressão da álgebra relacional para obter a junção natural F x D e mostre a relação resultante da junção natural. 4) O funcionário 4 aparece na junção natural? Explique. Obtenha as expressões da álgebra relacional que correspondem às seguintes consultas. 5) Quais os nomes e parentescos de todos os dependentes? 6) Quais os funcionários (números de ) possuem dependentes filhas? 7) Quais funcionários não possuem dependentes? 8) Dê os nomes dos funcionários que possuem algum dependente. 9) Dê o nome de cada funcionário que possui uma dependente chamada Alice?
10) Quais funcionários (número) não tem Alice como dependente (isto é, nenhuma dependente chamada Alice)? 11) Escreva o comando select correspondente para cada expressão da álgebra relacional, execute-o na base de dados e transcreva os resultados de cada comando select. Analise se o resultado está correto de acordo com o que foi pedido em cada consulta. 1) Create table Funcionarios (numf number(2) not null, Nomef varchar2(20) not null, Constraint func_pk primary key (numf)); Create table Dependentes (numf number(2) not null, Nomed varchar2(15) not null, Par varchar2(10) not null, Constraint dep_pk primary key (numf, nomed), Constraint func_dep_fk foreign key (Numf) references Funcionarios (numf) ); 2) Insert into funcionarios values ('01','Antonio Silva'); Insert into funcionarios values ('02','José Morais'); Insert into funcionarios values ('03','Maria Pereira'); Insert into funcionarios values ('04','Ana Silva'); Insert into dependentes values ('01','Alice','Filha'); Insert into dependentes values ('02','Alice','Esposa'); Insert into dependentes values ('02','Clara','Filha'); Insert into dependentes values ('03','José','Filho');
3) a) Funcionarios x Dependentes ou funcionarios.numf = dependentes.numf (Funcionarios X Dependentes) b) Funcionarios x Dependentes Numf Nomef Nomed Par 01 Antonio Silva Alice Filha 02 José Morais Alice Esposa 02 José Morais Clara Filha 03 Maria Pereira José Filho 4) O funcionário 04 não aparece na relação resultante porque ele não tem dependentes. 5 Quais os nomes e parentescos de todos os dependentes? П nomed, par (Dependentes) 6 Quais os funcionários (números de ) possuem dependentes filhas? П numf ( par = Filha (Dependentes)) П funcionarios. numf, funcionários.nomef ( par = Filha and funcionários.numf=dependentes.numf (Dependentes x Funcionarios)) Select funcionarios. numf, funcionarios.nomef From Dependentes, Funcionarios Where par = Filha and funcionários.numf=dependentes.numf;
7 Quais funcionários não possuem dependentes? П numf (Funcionários) П numf (Dependentes) 8 Dê os nomes dos funcionários que possuem algum dependente. П nomef (Funcionários x Dependentes) ou П nomef ( funcionarios.numf = dependentes.numf (Funcionários x Dependentes)) 9 Dê o nome de cada funcionário que possui uma dependente chamada Alice? П nomef (Funcionários x ( nomed= Alice (Dependentes)) ou П nomef ( funcionarios.numf = dependentes.numf ^ nomed= Alice (Funcionarios X Dependentes)) 10 Quais funcionários (número) não tem Alice como dependente (isto é, nenhuma dependente chamada Alice)? П numf (Dependentes) - П numf ( nomed= Alice (Dependentes)) 11 ------ 3) Select * From funcionarios, dependentes Where funcionarios.numf = dependentes.numf; NOMEF NOMED PAR ---------- -------------------- ---------- --------------- ---------- 1 Antonio Silva 1 Alice Filha 2 José Morais 2 Alice Esposa 2 José Morais 2 Clara Filha 3 Maria Pereira 3 José Filho 5) Select nomed, par From dependentes;
NOMED PAR --------------- ---------- Alice Filha Alice Esposa Clara Filha José Filho 6) Select numf from dependents Where par = 'Filha'; ---------- 1 2 7) select numf from funcionarios minus select numf from dependentes; ---------- 4 8) П nomef (Funcionários x Dependentes) ou П nomef ( funcionarios.numf = dependentes.numf (Funcionários x Dependentes)) Select nomef From funcionarios, dependentes Where funcionarios.numf = dependentes.numf; NOMEF -------------------- Antonio Silva José Morais José Morais Maria Pereira
9 П nomef (Funcionários x ( nomed= Alice (Dependentes)) ou П nomef ( funcionarios.numf = dependentes.numf ^ nomed= Alice (Funcionarios X Dependentes)) Select nomef From funcionarios, dependentes Where funcionarios.numf = dependentes.numf And nomed= Alice ; NOMEF -------------------- Antonio Silva José Morais 10 П numf (Dependente) - П numf (б nomed= Alice (Dependentes)) Select numf From funcionarios Minus Select numf From dependentes Where nomed= Alice ; --------- 3 4 12) Adicione a coluna Endereço com 30 posições na tabela Funcionários Alter table Funcionarios add Endereço varchar(30);
Não pode ser obrigatória, pois já existem linhas inseridas. Ela só pode se tornar obrigatória após ser informado valor nesta nova coluna para todas as linhas já existentes. 13) Informe um endereço diferente para cada funcionário já existente Update funcionarios set Endereço = R D. Pedro II, 34 Nova Odessa where numf = 1; Update funcionarios set Endereço = R Sete, 34 Sumaré where numf = 2; Update funcionarios set Endereço = Av Rebouças, 87 Sumaré where numf = 3; Update funcionarios set Endereço = Av Cillo, 598 SBO where numf = 4; 14) Modifique a coluna Endereço tornando-a obrigatória Alter table Funcionarios modify Endereço not null; 15) Adicione a coluna Cidade com 20 posições na tabela Funcionários Alter table Funcionarios add Cidade varchar(20); Demonstrando: SQL> desc funcionarios Nome Nulo? Tipo ----------------------------------------- -------- -------------- NOT NULL NUMBER(2) NOMEF NOT NULL VARCHAR2(20) ENDEREÇO NOT NULL VARCHAR2(30) CIDADE VARCHAR2(20) 16) Remova a coluna Cidade da tabela Funcionários Alter table Funcionarios Drop column Cidade; Demonstrando
SQL> desc funcionarios Nome Nulo? Tipo ----------------------------------------- -------- ------------ NOT NULL NUMBER(2) NOMEF NOT NULL VARCHAR2(20) ENDEREÇO NOT NULL VARCHAR2(30) 17) Apague os dependentes do Funcionário José Morais Delete Dependentes where numf = 2; 18) Remova a chave estrangeira de Dependentes. Alter table Dependentes Drop constraint func_dep_fk; 19) Crie novamente a chave estrangeira de Dependentes Alter table Dependentes Add Constraint func_dep_fk foreign key (Numf) references Funcionarios (numf);