Arquivos Mensais: outubro \25\UTC 2017

Banco de Dados I – Aula 13A

RELACIONANDO SQL COM ALGEBRA RELACIONAL

SCRIPT A SER EXECUTADA NO ORACLE:

create tablespace ar datafile '/u01/app/oracle/oradata/XE/ar.dbf' size 10m autoextend on next 5m maxsize 50m online permanent extent management local autoallocate segment space management auto;

create user ar identified by ar default tablespace ar temporary tablespace temp;

grant create session, connect, resource to ar;

alter user ar quota unlimited on ar;

connect ar/ar;

CREATE TABLE R (
A NUMBER(1),
B NUMBER(1)
);

CREATE TABLE S (
A NUMBER(1),
B NUMBER(1)
);

CREATE TABLE T (
B NUMBER(1),
C NUMBER(1),
D NUMBER(1)
);

INSERT INTO R (A, B) VALUES (1, 2);
INSERT INTO R (A, B) VALUES (3, 4);

INSERT INTO S (A, B) VALUES (3, 4);
INSERT INTO S (A, B) VALUES (5, 6);
INSERT INTO S (A, B) VALUES (5, 8);

INSERT INTO T (B, C, D) VALUES (2, 2, 6);
INSERT INTO T (B, C, D) VALUES (4, 7, 8);
INSERT INTO T (B, C, D) VALUES (3, 2, 1);

COMMIT;

NOTAÇÃO DA ALGEBRA RELACIONAL

– Letras do final do alfabeto para denotar relações (R, S, T etc) – Letras do inicio do alfabeto para denotar atributos (A, B, C etc) – Letra grega  Θ (téta) é  usada para denotar um dos seis operadores de comparação:

NOTAÇÕES EM SQL

– Letras do final do alfabeto para denotar TABELAS (R, S, T etc) – Letras do inicio do alfabeto para denotar CAMPOS (A, B, C etc) – Será utilizado seis operadores de comparação (=, >, =, <=, )

UNIÃO EM AR

R ∪ S: é uma relação que contém as tuplas que estão em R, em S ou em ambas; se uma tupla está presente em R e em S, ela só aparece uma vez na união. Esta operação primitiva também requer como operandos tabelas união-compatíveis. Produz como resultado uma tabela que contém todas as linhas da primeira tabela seguidas de todas as linhas da segunda tabela. A tabela resultante possui a mesma quantidade de colunas que as tabelas originais, e tem um número de linhas que é no máximo igual à soma das linhas das tabelas fornecidas como operandos, já que as linhas que são comuns a ambas as tabelas aparecem uma única vez no resultado.

UNIÃO EM AR E SQL

R ∪ S é a relação que contém as tuplas que estão em ambas R e S.

SQL> SELECT * FROM R
2  UNION
3  SELECT * FROM S

INTERSECÇÃO EM AR E SQL

R ∩ S:é a relação que contém as tuplas que estão em ambas R e S.

SQL> SELECT * FROM R
  2  INTERSECT
  3  SELECT * FROM S

DIFERENÇA EM AR E SQL

R – S :contém as tuplas que estão em R porém não estão em S. Observe que R – S é diferente de S – R

SQL> SELECT * FROM R
2  MINUS
3  SELECT * FROM S

EXEMPLO PARA ESSAS OPERAÇÕES EM AR E SQL

ScreenHunter_385 Oct. 25 14.38

SQL> SELECT * FROM R;

SQL> SELECT * FROM S;

ScreenHunter_386 Oct. 25 14.39

SQL> SELECT * FROM R
  2    UNION
  3    SELECT * FROM S;

ScreenHunter_387 Oct. 25 14.40

SQL> SELECT * FROM R
  2    INTERSECT 
  3    SELECT * FROM S;

ScreenHunter_389 Oct. 25 14.41

SQL> SELECT * FROM R
  2    MINUS
  3    SELECT * FROM S;

PROJEÇÃO EM AR E SQL

ScreenHunter_390 Oct. 25 14.43

SQL> SELECT * FROM R;

SQL> SELECT * FROM S;

SQL> SELECT DISTINCT A
  2    FROM S;

Em AR:

π NmFunc (funcionário)

Em SQL:

SQL> SELECT NMFUNC
  2    FROM   FUNCIONARIO;

EXEMPLO DE SELEÇÃO

ScreenHunter_391 Oct. 25 14.45

SQL> SELECT * FROM R;

SQL> SELECT * FROM S;

SQL> SELECT *
  2    FROM S 
  3    WHERE B >= 6;

EXEMPLO DE SELEÇÃO (OU RESTRIÇÃO) E PROJEÇÃO EM AR E SQL

ScreenHunter_392 Oct. 25 14.46

SQL> SELECT * FROM R;

SQL> SELECT * FROM S;

SQL> SELECT B
  2    FROM S 
  3    WHERE B >= 6;

Em AR:

σ Sexo = ‘M’ (funcionário)

Em SQL:

SQL> SELECT *
  2    FROM FUNCIONARIO
  3    WHERE SEXO = 'M';

Em AR:

π NmFunc, DtAdm ( σ Sexo = ‘F’ (funcionário))

Em SQL:

SQL> SELECT NMFUNC, DTADM
2    FROM FUNCIONARIO
3    WHERE SEXO = 'F';

PRODUTO CARTESIANO EM AR E SQL

ScreenHunter_290 Oct. 30 01.21

Em AR:

Ex.:  π  NmFunc, DtAdm, VrSalário (  σ funcionário.CdCargo = cargo.CdCargo                                                                                                                                              (funcionário  x cargo))

Em SQL:

SQL> SELECT NNFUNC, DTADM, VRSALARIO
2    FROM   FUNCIONARIO,CARGO
3    WHERE  FUNCIONARIO.CDCARGO = CARGO.CDCARGO

Em AR:

Ex.:  π  NmFunc, DtAdm, VrSalário (  σ funcionário.CdCargo = cargo.CdCargo ∧ Sexo = ‘M’                                                                                                                           (funcionário  x cargo))

Em SQL:

SQL> SELECT NNFUNC, DTADM, VRSALARIO
2    FROM   FUNCIONARIO,CARGO
3    WHERE  FUNCIONARIO.CDCARGO = CARGO.CDCARGO
4           AND SEXO = 'M';

JUNÇÃO EM AR E SQL

ScreenHunter_291 Oct. 30 01.28

Em SQL:

SQL> SELECT *
2    FROM   R,T
3    WHERE  R.B >= T.D;

JUNÇÃO NATURAL EM AR E SQL

Exemplo: a junção das tabelas R e T acima, sobre as colunas R.B e T.B seria expressa por:

ScreenHunter_292 Oct. 30 01.31

Em SQL:

SQL> SELECT *
2    FROM   R
3      NATURAL JOIN T;

Exercícios – Parte 1 EM SQL

Considere as tabelas:

funcionario (NrMatric, NmFunc, DtAdm, Sexo, CdCargo, CdDepto)

cargo (CdCargo,  NmCargo, VrSalario)

depto (CdDepto, NmDepto, Ramal)

Resolva os seguintes problemas:

1 – Todos os funcionários do departamento ‘D1’.

2 – O nome e a matrícula de todos os funcionários do departamento ‘D1’.

3 – A matrícula e o nome do respectivo departamento de todos os funcionários.

4 – O nome dos funcionários que ganham mais de $500.

5 – O ramal do funcionário ‘ANA SILVEIRA’.

6 – Os nomes de todos os funcionários com cargo de ‘MECANICO’.

7 – Os nomes de todos os funcionários que trabalham no mesmo departamento que ‘JOSE NOGUEIRA’.

8 – Os nomes dos departamentos que possuem tanto funcionários como funcionárias.

Exercícios – Parte 2 EM SQL

Considere as Relações F e D que representam os CEs Funcionários e Dependentes, respectivamente, com o seguinte esquema simplificado: F(fumf, nomef) e D(numf, nomef, par), onde numf: número do funcionário, nomef: nome do funcionário, nomed: nome do dependnete e par: parentesco, que pode ser um dentre: “filho”, “filha”, “esposa/o” etc. Observe que em D, numf é a chave estrangeira que referencia a chave primária numf de F. Abaixo é mostrada uma possível instância dessas relações:

ScreenHunter_293 Oct. 30 01.37

Vamos obter agora a junção natural F | x | D (ela vai usar a coluna numf para junção)

ScreenHunter_294 Oct. 30 01.38

Observe que a junção natural apresenta para cada funcionário que possui dependentes, os dados do funcionário e dos seus dependentes. Como o funcionário 04 não possui dependentes, ele não aparece no resultado da junção. Vamos agora obter expressões da álgebra relacional que respondem as seguintes consultas:

1 – Quais os nomes e parentescos de todos os dependentes?

2 – Quais os funcionários(numero de) possuem dependentes filhas?

3 – Quais funcionários não possuem dependentes?

4 – De os nomes dos funcionários que possuem algum dependente.

5 – Dê o nome de cada funcionário que possui uma dependente chamada Alice

6 – Quais funcionários possuem mais de um dependente?

Anúncios

Banco de Dados I – Aula 12A

SOBRE O PL/SQL

O PL/SQL (Procedural Language/SQL) é uma extensão do SQL com recursos de design de linguagem de programação, sendo uma extensão de linguagem procedural da Oracle;

Incorpora muitos recursos avançados feitos em linguagem de programação projetadas durante as décadas de 70 e 80;

É uma tecnologia empregada pelo Oracle Server e por algumas ferramentas Oracle;

SCRIPT PARA SER EXECUTADO VIA LINHA DE COMANDO NO SQLPLUS

Salvar em arquivo texto dentro do linux e executar via sqlplus

create tablespace banco1 datafile '/u01/app/oracle/oradata/XE/banco1.dbf' size 10m autoextend on next 5m maxsize 50m online permanent extent management local autoallocate segment space management auto;

create user banco1 identified by banco1 default tablespace banco1 temporary tablespace temp;

grant create session, connect, resource to banco1;

alter user banco1 quota unlimited on banco1;

connect banco1/banco1;

CREATE TABLE DEPTO (
  CDDEPTO CHAR(02) PRIMARY KEY,
  NMDEPTO VARCHAR(30),
  RAMAL NUMBER(3)
);

CREATE TABLE CARGO (
  CDCARGO CHAR(02) PRIMARY KEY,
  NMCARGO VARCHAR(30),
  VRSALARIO NUMBER(8,2)
);

CREATE TABLE FUNCIONARIO (
  NRMATRIC NUMBER(04) PRIMARY KEY,
  NMFUNC   VARCHAR(30),
  DTADM    DATE,
  SEXO     CHAR(01),
  CDCARGO  CHAR(02),
  CDDEPTO  CHAR(02),
  CONSTRAINT FK_FUNC_CDCARGO FOREIGN KEY(CDCARGO) REFERENCES CARGO(CDCARGO),
  CONSTRAINT FK_FUNC_CDDEPTO FOREIGN KEY(CDDEPTO) REFERENCES DEPTO(CDDEPTO)
);

INSERT INTO CARGO (CDCARGO, NMCARGO, VRSALARIO) VALUES ('C1','COZINHEIRA',350);
INSERT INTO CARGO (CDCARGO, NMCARGO, VRSALARIO) VALUES ('C3','AUX ESCRITORIO',450);
INSERT INTO CARGO (CDCARGO, NMCARGO, VRSALARIO) VALUES ('C7','VIGIA',450);
INSERT INTO CARGO (CDCARGO, NMCARGO, VRSALARIO) VALUES ('C2','MECANICO',750);
INSERT INTO CARGO (CDCARGO, NMCARGO, VRSALARIO) VALUES ('C5','GERENTE',2300);
INSERT INTO CARGO (CDCARGO, NMCARGO, VRSALARIO) VALUES ('C4','ESCRITURARIO',600);
INSERT INTO CARGO (CDCARGO, NMCARGO, VRSALARIO) VALUES ('C8','PROGRAMADOR',NULL);
INSERT INTO CARGO (CDCARGO, NMCARGO, VRSALARIO) VALUES ('C9','ANALISTA_DE_SISTEMAS',2100);

COMMIT;

INSERT INTO DEPTO (CDDEPTO, NMDEPTO, RAMAL) VALUES ('D1','ADMINISTRACAO',221);
INSERT INTO DEPTO (CDDEPTO, NMDEPTO, RAMAL) VALUES ('D2','OFICINA',235);
INSERT INTO DEPTO (CDDEPTO, NMDEPTO, RAMAL) VALUES ('D3','SERVICOS GERAIS',243);
INSERT INTO DEPTO (CDDEPTO, NMDEPTO, RAMAL) VALUES ('D4','VENDAS',258);
COMMIT;

INSERT INTO FUNCIONARIO (NRMATRIC, NMFUNC, DTADM, SEXO, CDCARGO, CDDEPTO) VALUES (1001,'JOAO SAMPAIO','10-AUG-93','M','C2','D2');
INSERT INTO FUNCIONARIO (NRMATRIC, NMFUNC, DTADM, SEXO, CDCARGO, CDDEPTO) VALUES (1004,'LUCIO TORRES','02-MAR-94','M','C2','D2');
INSERT INTO FUNCIONARIO (NRMATRIC, NMFUNC, DTADM, SEXO, CDCARGO, CDDEPTO) VALUES (1034,'ROBERTO PEREIRA','23-MAY-92','M','C3','D1');
INSERT INTO FUNCIONARIO (NRMATRIC, NMFUNC, DTADM, SEXO, CDCARGO, CDDEPTO) VALUES (1021,'JOSE NOGUEIRA','10-NOV-94','M','C3','D1');
INSERT INTO FUNCIONARIO (NRMATRIC, NMFUNC, DTADM, SEXO, CDCARGO, CDDEPTO) VALUES (1029,'RUTH DE SOUZA','05-JAN-93','F','C1','D3');
INSERT INTO FUNCIONARIO (NRMATRIC, NMFUNC, DTADM, SEXO, CDCARGO, CDDEPTO) VALUES (1095,'MARIA DA SILVA','03-SEP-92','F','C4','D1');
INSERT INTO FUNCIONARIO (NRMATRIC, NMFUNC, DTADM, SEXO, CDCARGO, CDDEPTO) VALUES (1023,'LUIZ DE ALMEIDA','12-JAN-93','M','C2','D2');
INSERT INTO FUNCIONARIO (NRMATRIC, NMFUNC, DTADM, SEXO, CDCARGO, CDDEPTO) VALUES (1042,'PEDRO PINHEIRO','29-JUL-94','M','C4','D1');
INSERT INTO FUNCIONARIO (NRMATRIC, NMFUNC, DTADM, SEXO, CDCARGO, CDDEPTO) VALUES (1048,'ANA SILVEIRA','01-JUN-93','F','C5','D1');
INSERT INTO FUNCIONARIO (NRMATRIC, NMFUNC, DTADM, SEXO, CDCARGO, CDDEPTO) VALUES (1015,'PAULO RODRIGUES','17-AUG-92','M','C2','D2');
COMMIT;

INSTRUÇÃO SELECT BÁSICA

SELECT [DISTINCT] {*, coluna [apelido],…}
FROM tabela;

Uma cláusula SELECT especifica as colunas a serem exibidas;

Uma cláusula FROM especifica a tabela que contém as colunas listadas na cláusula SELECT

Na sintaxe:

SELECT –> é a lista de uma ou mais colunas

DISTINCT –> suprime os itens duplicados

* –> selectiona todas as colunas

coluna –> seleciona a coluna nomeada

apelido –> fornece cabeçalhos diferentes às   colunas selecionadas

FROM –> tabela especifica a tabela contend   as colunas

CRIANDO INSTRUÇÕES SQL

Instruções SQL sem distinção entre maiusculas / minusculas;

Instruções SQL podem estar em uma ou mais linhas;

Palavras-chave não podem ser abreviadas ou divididas entre as linhas;

Normalmente, as cláusulas são colocadas em linhas separadas;

Guias e indentações são usadas para aperfeiçoar a legibilidade;

SELECIONANDO COLUNAS

SQL> SELECT *
  2  FROM DEPTO;

SQL> SELECT CDDEPTO, NMDEPTO, RAMAL
  2  FROM DEPTO;

SQL> SELECT CDDEPTO, NMDEPTO
  2  FROM DEPTO;

AJUSTANDO CABEÇALHO DAS COLUNAS

SQL> COL "CDDEPTO" FORMAT "A15";

SQL> SELECT *
  2  FROM DEPTO;

A15 –>quantidade de caracteres a ser apresentado

DEFAULTS DE CABEÇALHOS DE COLUNA

Justificativa default

Esquerda: dados de caractere e data

Direita: Dados numéricos

Exibição default: Letra maiúscula

SQL> SELECT cddepto, nmdepto
  2  FROM DEPTO; 

Obs –> mesmo digitando os campos selecionandos em minúsculo, será exibido em maiúsculo

EXPRESSÕES ARITMÉTICAS

Criar expressões com dados NUMBER e DATE usando operadores aritméticos.

OPERADOR DESCRIÇÃO
+ Adicionar
Subtrair
* Multiplicar
/ Dividir

USANDO OPERADORES ARITMÉTICOS

SQL> SELECT CDCARGO, NMCARGO,
   2  VRSALARIO,
   3  VRSALARIO + 1000
   4  FROM CARGO;

PRECEDENCIA DE OPERADORES

A multiplicação e a divisão têm prioridade sobre a adição e a substração;

Os operadores com a mesma prioridade são avaliados da esquerda para a direita;

Os parênteses são usados para forçar a avaliação priorizada e para esclarecer as instruções;

Exemplo 1:

SQL> SELECT CDCARGO, NMCARGO,
   2  VRSALARIO,
   3  12 * VRSALARIO + 100
   4  FROM CARGO;

Exemplo 2:

SQL> SELECT CDCARGO, NMCARGO,
   2  VRSALARIO,
   3  12 * (VRSALARIO + 100)
   4  FROM CARGO;

DEFININDO UM VALOR NULO

Um valor nulo não está disponível, não é atribuído, é desconhecido ou não é aplicável;

Um valor nulo não é o mesmo que um zero ou um espaço em branco;

SQL> SQL> SELECT CDCARGO, NMCARGO, VRSALARIO
   2  FROM CARGO;

VALORES NULOS NAS EXPRESSÕES ARITMÉTICAS

Se qualquer valor da coluna em uma expressão aritmética for nulo, o resultado será nulo;

SQL> SELECT CDCARGO, NMCARGO, 
  2  VRSALARIO + 100
  3  FROM CARGO;

DEFININDO UM APELIDO (ALIAS) PARA COLUNA

Renomeia um cabeçalho de coluna;

É útil para cálculos;

Segue imediatamente o nome da coluna;

Palavra-chave “as” é opcional entre o nome da coluna e o apelido;

Necessita de aspas duplas caso contenha espaço ou caracteres especiais ou faça a distinção entre maiúscula e minúscula;

USANDO UM APELIDO DE COLUNA

SQL> SELECT CDCARGO AS CODIGO_DO_CARGO, 
   2 NMCARGO AS "Nome do Cargo", 
   3 VRSALARIO VALOR$SALARIO
   4 FROM CARGO;

Observação: Os caracteres especiais # e $ são permitidos serem utilizados em alias sem utilização das aspas duplas;

OPERADOR DE CONCATENAÇÃO

Concatena colunas ou strings de caractere a outras colunas;

É representado por duas barras verticais “||” (pipe);

Cria uma coluna resultante que é uma expressão de caracteres

USANDO UM OPERADOR DE CONCATENAÇÃO

SQL> SELECT CDCARGO || NMCARGO 
   2	AS codigo_nome 
   3  	FROM CARGO;

STRING LITERAIS DE CARACTERES

Uma literal é um caractere, um número ou uma data incluída na lista SELECT;

Valores literais de caractere e data devem estar entre aspas simples;

Cada string de caractere é gerada um vez para linha retornada;

LINHAS DUPLICADAS

A exibição das consultas é de todas as linhas, incluindo linhas duplicadas:

SQL> SELECT CDCARGO
   2  FROM FUNCIONARIO;

ELIMINANDO LINHAS DUPLICADAS

Elimine as linhas duplicadas usando a palavra chave DISTINC na cláusula SELECT:

SQL> SELECT DISTINCT CDCARGO
   2  FROM FUNCIONARIO;

O DISTINCT atua sobre a linha do select, não sendo possível ter 2 DISTINCTS na mesma SELECT

LIMITANDO LINHAS SELECIONADAS

Restringe as linhas retornadas usando a cláusula WHERE:

A cláusula WHERE pode comparer valores em colunas, valores literais, expressões aritméticas ou funções. É formada por tres elementos:

– Nome da coluna;
– Operadores de comparação;
– Nome da coluna, constant ou lista de valores;

USANDO A CLÁUSULA WHERE

SQL> SELECT NRMATRIC, NMFUNC
   2  FROM FUNCIONARIO
   3  WHERE CDCARGO = 'C2';

STRINGS DE CARACTERES E DATAS

As strings de caractere e valores de dados aparecem entre aspas simples;

Os valores de caractere fazem distinção entre maiusculas e minúculas e o valores de data diferenciam formatos;

O format de data default é DD-MON-YY.

Exemplo:

SQL> SELECT NRMATRIC, NMFUNC, DTADM
   2 FROM FUNCIONARIO
   3 WHERE SEXO = 'F' 
   4 AND DTADM = '01-JUN-93';

OPERADORES DE COMPARAÇÃO

OPERADOR SIGNIFICADO
= Igual
> Maior do que
>= Maior do que ou igual a
< Menor
<= Menor ou igual a
Diferente de

UTILIZAÇÃO DOS OPERADORES DE COMPARAÇÃO

Use os operadores de comparação em condições que comparam uma expressão a outra.

Eles são usados na cláusula WHERE seguindo os exemplos:

WHERE hiredate = '01-JAN-95'

WHERE SAL >= 500

WHERE ENAME = 'SMITH'

OUTROS OPERADORES DE COMPARAÇÃO

OPERADOR SIGNIFICADO
BETWEEN … AND… Entre dois valores (inclusive)
IN (list) Vincula qualquer um de uma lista de valores
LIKE Vincula um padrão de caracteres
IS NULL É um valor nulo

USANDO O OPERADOR BETWEEN

Use o operador BETWEEN apra exibir linhas baseadas em uma faixa de valores

SQL>SELECT NMCARGO, VRSALARIO
  2 FROM CARGO
  3 WHERE VRSALARIO BETWEEN 450 AND 750;

USANDO O OPERADOR IN

Use o operador IN para testar os valores de uma lista

SQL>SQL> SELECT NMFUNC, CDCARGO, CDDEPTO
  2 FROM FUNCIONARIO
  3 WHERE CDCARGO IN ('C1','C3','C4');

USANDO O OPERADOR LIKE

Use o operador LIKE para executar pesquisas curinga com valores de string válidas;

As condições de pesquisa podem conter caracteres literais ou números;

– % denota zero ou muitos caracteres;

– _ (underline) denota um caractere;

Voce pode combiner caracteres de vinculação de padrão;

SQL> SELECT NMFUNC, CDCARGO, CDDEPTO
   2 FROM FUNCIONARIO
   3 WHERE NMFUNC LIKE 'JO%';
SQL> SELECT NMFUNC, CDCARGO, CDDEPTO
   2 FROM FUNCIONARIO
   3 WHERE NMFUNC LIKE '%RO%'
SQL> SELECT NMFUNC, CDCARGO, CDDEPTO
   2 FROM FUNCIONARIO
   3 WHERE NMFUNC LIKE '_O%'

USANDO A OPÇÃO ESCAPE

Quando for necessário ter uma correspondencia exata para os caracteres ‘%’ e ‘_’, use a opção ESCAPE

SQL> SELECT CDCARGO, NMCARGO
   2 FROM CARGO
   3 WHERE NMCARGO LIKE '%@_%' ESCAPE '@';

USANDO O OPERADOR IS NULL

O operador IS NULL testa valores que são nulos. Um valor nulo significa que o valor não está disponível, não-atribuído, desconhecido ou não aplicável. Assim, não é possível testar com “=” porque um valor nulo não pode ser igual ou desigual a qualquer valor.

SQL> SELECT CDCARGO, NMCARGO, VRSALARIO
   2 FROM CARGO
   3 WHERE VRSALARIO IS NULL;

OPERADORES LÓGICOS

OPERADOR SIGNIFICADO
AND Retorna TRUE se as condições de componmentes forem TRUE
OR Retorna TRUE se cada condição de componente for TRUE
NOT Retorna TRUE se a condição seguinte for FALSE

Um operador lógico combina o resultado de duas condições de componente para produzir um único resultado com base neles ou inverter o resultado para a condição única. Três operadores lógicos estão disponíveis no SQL: AND, OR e NOT

USANDO O OPERADOR AND

AND exige que ambas as conduições sejam TRUE;

SQL> SELECT CDCARGO, NMCARGO, VRSALARIO
   2   FROM CARGO
   3   WHERE CDCARGO = 'C5'
   4   AND VRSALARIO >= 2000;

TABELA VERDADE AND

AND TRUE FALSE NULL
TRUE TRUE FALSE NULL
FALSE FALSE FALSE FALSE
NULL NULL FALSE NULL

USANDO O OPERADOR OR

OR exige que cada condição seja TRUE;

SQL> SELECT CDCARGO, NMCARGO, VRSALARIO
   2 FROM CARGO
   3 WHERE CDCARGO = 'C5'
   4 OR VRSALARIO >= 2000;

TABELA VERDADE OR

OR TRUE FALSE NULL
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE NULL
NULL TRUE NULL NULL

USANDO O OPERADOR NOT

NOT nega o operador usado na operação

O operador NOT pode ser utilizado também com outros operadores SQL, como BETWEEN e LIKE;

SQL> SELECT CDCARGO, NMCARGO, VRSALARIO
   2 FROM CARGO
   3 WHERE VRSALARIO IS NOT NULL;

TABELA VERDADE NOT

NOT TRUE FALSE NULL
TRUE FALSE TRUE NULL

EXEMPLO DO OPERADOR NOT

... WHERE CDDEPTO NOT IN ('D1','D3');

... WHERE VRSALARIO NOT BETWEEN 50 AND 500;

... WHERE NMCARGO NOT LIKE 'VIG%';

... WHERE RAMAL IS NOT NULL;

REGRAS DE PRECEDÊNCIA

ORDEM DE AVALIAÇÃO OPERADOR
1 Todos os operadores de comparação
2 NOT
3 AND
4 OR

Sobreponha regras de precedência usando parênteses

REGRAS DE PRECEDÊNCIA

SQL> SELECT CDCARGO, NMCARGO, VRSALARIO
   2 FROM CARGO
   3 WHERE CDCARGO = 'C1'
   4 OR  CDCARGO = 'C7'
   5 AND VRSALARIO >= 350

A ordem de execução usando regras de precedencia é:

A primeira condição é que o CDCARGO seja igual a ‘C7’ e o VRSALARIO SEJA >= 350

A segunda condição é que o cargo CDCARGO seja igual a ‘C1’;

CLÁUSULA ORDER BY

ORDER BY Classifica as linhas de 2 formas:

–ASC: ordem crescente, default (do menor para o maior);

–DESC: ordem decrescente (do maior para o menor);

SQL> SELECT CDCARGO, NMCARGO, VRSALARIO
   2 FROM CARGO
   3 ORDER BY NMCARGO;
SQL> SELECT CDCARGO, NMCARGO, VRSALARIO
   2  FROM CARGO
   3  ORDER BY CDCARGO ASC;
SQL> SELECT CDCARGO, NMCARGO, VRSALARIO
   2 FROM CARGO
   3 ORDER BY VRSALARIO DESC;

CLASSIFICANDO POR APELIDO DE COLUNA

SQL> SELECT NMCARGO, VRSALARIO,
   2 VRSALARIO * 12 AS SAL_ANUAL
   3 FROM CARGO
   4 ORDER BY SAL_ANUAL

CLASSIFICANDO POR POSIÇÃO DE COLUNA

SQL> SELECT NMCARGO, VR_SALARIO,
   2 VRSALARIO * 12 AS SAL_ANUAL
   3 FROM CARGO
   4 ORDER BY 2

CLASSIFICANDO POR VÁRIAS COLUNAS

SQL> SELECT NMFUNC, SEXO, DTADM
   2 FROM FUNCIONARIO
   3 ORDER BY NMFUNC,DTADM DESC;

CONECTANDO DO SHELL DO LINUX PARA O SQL/PLUS

Como SYSDBA

[oracle@oracle ~]$ sqlplus / as sysdba

Como usuário comum

[oracle@oracle ~]$ sqlplus banco1/banco1

CONSULTANDO TABELAS DO SCHEMA NO SQL/PLUS

SQL> SELECT TABLE_NAME
   2 FROM USER_TABLES;

CONSULTANDO A ESTRUTURA DE UMA TABELA NO SQL/PLUS

SQL> DESC FUNCIONARIO;

SAINDO DO SQL/PLUS

SQL> exit;

 

 

Banco de Dados I – Aula 11A

INTRODUÇÃO À ÁLGEBRA RELACIONAL – RESUMO

  • Como o nome indica, a álgebra relacional (AR) é uma álgebra de expressões envolvendo relações. A partir de uma ou mais relações da BD tomadas como operandos, outras relações podem ser progressivamente construídas através de operadores especiais, sendo resultado da consulta sobre a BD.
  • Uma consulta é, portanto, uma expressão da consulta sobre a BD.
  • Alguns operadores básicos foram propostos por CODD. Se lembrarmos de que relações são conjuntos matemáticos (de tuplas) esses operadores essencialmente manipulam conjuntos e estão em quatro categorias:
    • Operadores convencionais sobre conjuntos: união, subtração, interseção e produto cartesiano;
    • Operadores que removem parte de uma relação; um operador que elimina linhas (seleção) e um operador que elimina colunas, ou seja, atributos (projeção)
    • Operadores que combinam linhas de duas relações de acordo com condições booleanas diversas (essas operações selecionam subconjuntos do produto cartesiano das duas relações);
    • Um operador especial p (Rô) permite renomear o esquema de uma relação, essencialmente para permitir expressar de forma não ambígua operações envolvendo auto-relacionamentos;

Notação

– Letras do final do alfabeto para denotar relações (R, S, T etc)

– Letras do inicio do alfabeto para denotar atributos (A, B, C etc)

– Letra grega ScreenHunter_253 Oct. 19 20.13 (téta) é  usada para denotar um dos seis operadores de comparação:

UNIÃO

ScreenHunter_254 Oct. 19 20.24: é uma relação que contém as tuplas que estão em R, em S ou em ambas; se uma tupla está presente em R e em S, ela só aparece uma vez na união.

Esta operação primitiva também requer como operandos tabelas união-compatíveis. Produz como resultado uma tabela que contém todas as linhas da primeira tabela seguidas de todas as linhas da segunda tabela. A tabela resultante possui a mesma quantidade de colunas que as tabelas originais, e tem um número de linhas que é no máximo igual à soma das linhas das tabelas fornecidas como operandos, já que as linhas que são comuns a ambas as tabelas aparecem uma única vez no resultado.

ScreenHunter_255 Oct. 19 20.26

INTERSECÇÃO

ScreenHunter_256 Oct. 19 20.27 : é a relação que contém as tuplas que estão em ambas R e S.

Esta é uma operação adicional que produz como resultado uma tabela que contém, sem repetições, todos os elementos que são comuns às duas tabelas fornecidas como operandos. As tabelas devem ser união-compatíveis.

ScreenHunter_257 Oct. 19 20.28

O mesmo efeito pode ser obtido fazendo-se uma combinação de diferenças entre conjuntos

ScreenHunter_258 Oct. 19 20.29

ou com uniões e diferenças

ScreenHunter_259 Oct. 19 20.30

Diferença

ScreenHunter_260 Oct. 19 20.31: contém as tuplas que estão em R porém não estão em S. Observe que R – S é diferente de S – R

É uma operação primitiva que requer como operandos duas tabelas união-compatíveis, ou seja, estruturalmente idênticas. O resultado é uma tabela que possui todas as linhas que existem na primeira tabela e não existem na segunda.

ScreenHunter_261 Oct. 19 20.32

EXEMPLO PARA ESSAS OPERAÇÕES

ScreenHunter_263 Oct. 19 21.38.jpg

PROJEÇÃO

Projeção: ScreenHunter_264 Oct. 19 21.40   constrói uma nova relação a partir de R contendo apenas os atributos  . Observe que tuplas duplicadas devem ser eliminadas ao se fazer a projeção. Exemplo:

ScreenHunter_265 Oct. 19 21.40.jpg

Geralmente indicada na literatura por ScreenHunter_266 Oct. 19 21.42.jpg  (a letra grega pi) produz um conjunto onde há um elemento para cada elemento do conjunto de entrada, sendo que a estrutura dos membros do conjunto resultante é definida nos argumentos da operação.

Pode ser entendida como uma operação que filtra as colunas de uma tabela. Por operar sobre apenas um conjunto de entrada, a projeção é classificada como uma  operação unária.

Ex.: ScreenHunter_266 Oct. 19 21.42  NmFunc (funcionário)

Essa expressão produz um conjunto contendo um elemento para cada funcionário, e cada elemento contém apenas a informação referente a NmFunc da relação funcionário original

ScreenHunter_267 Oct. 19 21.43

Agora estamos interessados em identificar todos os funcionários de sexo masculino existentes no banco de dados. É uma situação que não podemos resolver com projeções apenas, uma vez que deveremos descartar elementos do conjunto inicial. Para casos desse tipo existe uma operação relacional chamada Seleção.

 

SELEÇÃO (OU RESTRIÇÃO)

Seleção: seja uma expressão booleana C do tipo R.A ScreenHunter_253 Oct. 19 20.13C, onde C é uma constante do tipo de A que queremos comparar com o atributo A de uma linha de R. Então,

ScreenHunter_268 Oct. 19 21.45 c(R) é uma relação que inclui unicamente as linhas de R para as quais C é verdadeiro.

Exemplo:

ScreenHunter_269 Oct. 19 21.46

Expressões booleanas mais complexas envolvendo “ands” ou “ors” de operandos do tipo R.A  c podem ser avaliadas através de operações de união e interseção, mas, para simplificar a notação, vamos admitir em C expressões booleanas arbitrariamente complexas.

Se quisermos, podemos compor quaisquer operações, por exemplo:

ScreenHunter_270 Oct. 19 22.01

Indicada por   ScreenHunter_268 Oct. 19 21.45  (a letra grega sigma), é uma operação que para um conjunto inicial fornecido como argumento, produz um subconjunto estruturalmente idêntico, mas apenas com os elementos do conjunto original que atendem a uma determinada condição (também chamada de predicado). A seleção pode ser entendida como uma operação que filtra as linhas de uma tabela, e é também uma operação unária, já que opera sobre um único conjunto de dados.

Ex.:  ScreenHunter_268 Oct. 19 21.45 Sexo = ‘M’ (funcionário)

Produz o conjunto dos elementos de funcionário que atendem ao predicado [Sexo = ‘M’], ou seja, representa um subconjunto dos funcionários para o qual essa condição é avaliada como verdadeira.

ScreenHunter_271 Oct. 19 22.03.jpg

No caso de querermos descobrir o nome completo e a data de admissão de todos os funcionários do sexo feminino existentes na empresa, será necessário combinar uma projeção com uma seleção. Isso porque se decidirmos projetar as colunas desejadas diretamente a partir da relação funcionário, estaremos considerando também os elementos do sexo masculino, o que não queremos.

Como a projeção não permite descartar linhas, apenas colunas, deveremos fornecer a essa operação o subconjunto resultante de uma filtragem (seleção) da relação de funcionários original, como mostram as duas figuras a seguir, que representam as relações e as operações de duas maneiras diferentes.

ScreenHunter_272 Oct. 19 22.04.jpg

 

ScreenHunter_273 Oct. 19 22.05

Assim, a expressão que atende nossos objetivos nesse caso é

ScreenHunter_266 Oct. 19 21.42 NmFunc, DtAdm ( ScreenHunter_268 Oct. 19 21.45 Sexo = ‘F’ (funcionário))

cabendo observar que devido ao aninhamento das operações está implícito que primeiro será executada a seleção e depois a projeção, sendo que nesse exemplo não poderíamos inverter essa ordem.

Você poderia explicar porquê?

Por esse motivo, dizemos que a álgebra relacional é uma linguagem procedural, já que requer alguma definição quanto à ordem em que as operações serão realizadas. Linguagens em que apenas  mencionamos o resultado desejado, sem fazer menção alguma à forma como isso deve ser feito são chamadas de linguagens não-procedurais.

Suponha agora que precisamos obter o nome completo, a data de admissão e o salário de cada funcionário cadastrado.

Para essa consulta temos um fato novo, que é a referência a colunas de mais de uma tabela, uma vez que o nome e a data de admissão fazem parte da relação funcionário, enquanto que o salário existe apenas em cargos.

Isso é problemático, pois as duas operações que conhecemos até o momento são unárias, e temos necessidade de combinar os dados de mais de uma relação. Para situações como essa existe uma operação chamada Produto Cartesiano.

Produto Cartesiano

Produto Cartesiano: R x S : é uma relação obtida concatenando-se cada linha de R com cada linha de S, isto é, os atributos do produto cartesiano são os atributos de R, seguidos pelos atributos de S (se houver coincidência nos nomes de alguns atributos de R e S, a forma conveniente de distingui-los deve ser usada, como por exemplo R.C e S.C). Se R possui n atributos e K linhas e S possui m atributos e 1 linha então R x S possui n + m atributos e k x l linhas.

Exemplo de Produto Cartesiano

ScreenHunter_274 Oct. 19 22.08A notação geralmente adotada (na forma ‘conjunto1 x conjunto2’) para representar essa operação binária indica bem a sua natureza: o resultado do produto cartesiano de duas tabelas é uma terceira tabela contendo todas as combinações possíveis entre os elementos das tabelas originais.

Essa tabela resultante possuirá um número de colunas que é igual à soma das quantidades de colunas das duas tabelas iniciais, e um número de linhas igual ao produto do número de suas linhas.

Portanto, se fizermos o produto cartesiano de uma tabela A que possua 4 colunas e 10 linhas com uma tabela B onde existem 3 colunas e 7 linhas, a tabela resultante terá 4+3= 7 colunas e 10*7= 70 linhas. Assim, cada linha dessa tabela corresponderá à concatenação de uma linha da primeira tabela com uma linha da segunda.

O produto cartesiano não é muito usado como um fim em si mesmo, ou seja, dificilmente estaremos interessados em saber quais são todas as combinações possíveis entre as linhas de duas tabelas, pois a utilidade prática desse tipo de conhecimento é muito discutível.

Entretanto, é a única forma primitiva de que dispomos para fundir informações de duas tabelas heterogêneas para posterior processamento.

Nesse caso, tipicamente será necessário executar uma Seleção sobre o resultado do Produto Cartesiano, de maneira a descartar as combinações inválidas entre as linhas das tabelas originais.

Ex.: ScreenHunter_266 Oct. 19 21.42 NmFunc, DtAdm, VrSalário  ScreenHunter_268 Oct. 19 21.45(funcionário.CdCargo = cargo.CdCargo (funcionário x cargo))

Observe que primeiro é produzido o produto cartesiano correspondente a todas as combinações possíveis entre funcionários e cargos.

Essa relação vai conter linhas onde um funcionário estará associado a cargos que não são o seu, e devemos então aplicar um filtro (uma seleção) para gerar um subconjunto apenas com as combinações logicamente válidas (aquelas em que a chave estrangeira CdCargo de funcionário tem valor igual á chave primária CdCargo de cargo).

Como temos nesse subconjunto duas colunas com o mesmo nome (CdCargo que veio de funcionário e CdCargo proveniente de cargo), sempre que precisarmos mencionar uma delas será necessário especificar exatamente a qual das duas colunas estamos nos referindo, senão teremos uma situação ambígua, formalmente inaceitável.

Dizemos, nesse caso, que é necessário qualificar a coluna, e isso é feito escrevendo o nome da relação original antes do nome da coluna, separando-os por um ponto, ou seja, <nome-da-relação>.<nome-da-coluna>. É por esse motivo que escrevemos o predicado da seleção como sendo funcionário.CdCargo = cargo.CdCargo. Finalmente, a projeção é realizada a partir desse subconjunto, fornecendo os dados inicialmente desejados.

ScreenHunter_275 Oct. 19 22.11.jpg

ScreenHunter_276 Oct. 19 22.12.jpg

ScreenHunter_277 Oct. 19 22.13

ScreenHunter_278 Oct. 19 22.13.jpg

Caso desejemos obter uma variação ligeiramente diferente dessa consulta, acrescentando a restrição de que precisamos dos dados apenas dos funcionários do sexo masculino, teríamos a seguinte expressão algébrica:

ScreenHunter_279 Oct. 19 22.14.jpg

onde o símbolo “^” presente no predicado representa o conectivo lógico “E”. Portanto, com apenas 3 operações relacionais básicas foi possível extrair do banco de dados de exemplo várias informações importantes, representativas de uma grande parcela das consultas que um sistema gerenciador de bancos de dados deve processar.

As consultas realizadas foram:

  1. obter o nome completo de todos os funcionários;
  2. identificar todos os funcionários do sexo masculino;
  3. obter o nome completo e a data de admissão de todos os funcionários do sexo feminino;
  4. obter o nome completo, a data de admissão e o salário de todos os funcionários;
  5. descobrir o nome completo, a data de admissão e o salário de todos os funcionários do sexo masculino.

JUNÇÃO

Junção ScreenHunter_253 Oct. 19 20.13: nesta operação comparamos duas colunas do mesmo tipo de R e S, por exemplo R.A   S.B. Se a comparação der verdadeira, selecionamos a linha correspondente do produto cartesiano RxS. A junção ScreenHunter_253 Oct. 19 20.13é denotada por:

R | X | S

R.A ScreenHunter_253 Oct. 19 20.13S.B

A junção ScreenHunter_253 Oct. 19 20.13de duas relações é, portanto, um subconjunto do seu produto cartesiano e pode ser expressa pela identidade:

R | X | S = ScreenHunter_268 Oct. 19 21.45 (R.A ScreenHunter_253 Oct. 19 20.13S.B) (R X S)

R.A ScreenHunter_253 Oct. 19 20.13S.B

Exemplo: vamos utilizar outra relação para exemplificar a junção ScreenHunter_253 Oct. 19 20.13 Seja a relação T com esquema T(B,C,D) e uma instancia de T abaixo:

ScreenHunter_280 Oct. 19 22.18.jpg

ScreenHunter_281 Oct. 19 22.19

Para isso, temos a seguinte explicação:

Produto cartesiano entre R  X  T

ScreenHunter_282 Oct. 19 22.20

Posteriormente, comparamos as linhas de R.B que sejam >= a TD, tendo o resultado apresentado.

É uma operação que produz uma combinação entre as linhas de uma tabela com as linhas correspondentes de outra tabela, sendo em princípio correspondente a uma seleção pelos atributos de relacionamento sobre um produto cartesiano dessas tabelas:

ScreenHunter_283 Oct. 19 22.21

A operação de junção foi criada justamente porque esse tipo de combinação de tabelas é de uso muito comum, facilitando com isso a escrita de expressões.

A tabela resultante de uma junção tem todas as colunas da primeira tabela e todas da segunda tabela.

Isso faz com que os valores dos campos utilizados como critério para a correspondência entre as linhas apareça duplicado, já que um vem da primeira tabela e outro da segunda.

Existe uma variação da junção, chamada junção natural, que fornece o mesmo resultado, mas sem essa repetição de valores: uma das colunas correspondentes aos atributos de relacionamento é descartada.

JUNÇÃO NATURAL

Junção natural: quando ScreenHunter_253 Oct. 19 20.13é o operador de igualdade, o resultado do produto cartesiano terá duas colunas idênticas, R.A e S.B. Nesse caso é conveniente projetar fora uma dessas colunas e o resultado final é chamado de junção natural de R com S. Se as colunas sobre as quais fizermos a junção tiverem o mesmo nome em R e S, então se pode simplificar a notação escrevendo apenas:

R | X | S

Para indicar esta operação, ficando implícitas as colunas sobre as quais é feita a comparação. Exemplo: a junção das tabelas R e T acima, sobre as colunas R.B e T.B seria expressa por:

ScreenHunter_284 Oct. 19 22.23

Obs: A comparação é feita sobre o produto cartesiano.

 

RESUMO

ScreenHunter_285 Oct. 19 22.24

Exercícios – Parte 1

Com base nas tabelas Funcionário, Cargo e Depto apresentadas neste material, elaborar as expressões da álgebra relacional que obtenham:

ScreenHunter_286 Oct. 19 22.25

Exemplo de Dados:

ScreenHunter_287 Oct. 19 22.26

1 – Todos os funcionários do departamento ‘D1’.

2 – O nome e a matrícula de todos os funcionários do departamento ‘D1’.

3 – A matrícula e o nome do respectivo departamento de todos os funcionários.

4 – O nome dos funcionários que ganham mais de $500.

5 – O ramal do funcionário ‘ANA SILVEIRA’.

6 – Os nomes de todos os funcionários com cargo de ‘MECANICO’.

7 – Os nomes de todos os funcionários que trabalham no mesmo departamento que ‘JOSE NOGUEIRA’.

8 – Os nomes dos departamentos que possuem tanto funcionários como funcionárias.

 

Exercício – Parte 2

Considere as Relações F e D que representam os CEs Funcionários e Dependentes, respectivamente, com o seguinte esquema simplificado: F(fumf, nomef) e D(numf, nomef, par), onde numf: número do funcionário, nomef: nome do funcionário, nomed: nome do dependnete e par: parentesco, que pode ser um dentre: “filho”, “filha”, “esposa/o” etc. Observe que em D, numf é a chave estrangeira que referencia a chave primária numf de F. Abaixo é mostrada uma possível instância dessas relações:

ScreenHunter_288 Oct. 19 22.28

Vamos obter agora a junção natural F | x | D (ela vai usar a coluna numf para junção)

ScreenHunter_289 Oct. 19 22.29

Observe que a junção natural apresenta para cada funcionário que possui dependentes, os dados do funcionário e dos seus dependentes. Como o funcionário 04 não possui dependentes, ele não aparece no resultado da junção. Vamos agora obter expressões da álgebra relacional que respondem as seguintes consultas:

1.Quais os nomes e parentescos de todos os dependentes?

2.Quais os funcionários(numero de) possuem dependentes filhas?

3.Quais funcionários não possuem dependentes?

4.De os nomes dos funcionários que possuem algum dependente.

5.Dê o nome de cada funcionário que possui uma dependente chamada Alice

6.Quais funcionários possuem mais de um dependente?

Referência Bibliográfica

  • GUIMARÃES, Célio Cardoso.  FUNDAMENTOS DE BANCOS DE DADOS: modelagem, projeto e linguagem SQL. 1. ed. Campinas: Universidade de Campinas. 2003.

 

 

Vídeo

 

 

Banco de Dados I – Aula 10E

Crie no Microsoft Access para cada exercício um banco de dados dos exercícios resolvidos

Formas Normais – Formulário de manutenção técnica 

1FN (ITENS DE REPETICAO, OU MULTIVALORADOS TRANSFORMAR EM OUTRA TABELA)

EMPRESA (COD_EMP, RAZAO, ENDERECO, CIDADE, UF, CEP, FONE)

FUNCIONARIO (COD_FUN, NOME, …)

SITUACAO_SERV (TIPO)

FUNCIONARIO_CLI (RG_FUN_CLI, NOME_FUN_CLI, COD_EMP)

OBS (FUNCIONARIO_CLI. COD_EMP à CLIENTE.COD_EMP)

ACAO_SERV (TIPO, RG_FUN_CLI)

OBS (ACAO_SERV.TIPO à SITUACAO_SERV.TIPO)

OBS (ACAO_SERV.RG_FUN_CLI à FUNCIONARIO_CLI.RG_FUN_CLI)

CLIENTE (COD_EMP_CLI, RAZAO, ENDERECO, BAIRRO, COMPLEMENTO, CIDADE, UF, CEP)

TELEFONE_CLI (COD_EMP_CLI, TELEFONE)

OBS (TELEFONE_CLI.COD_EMP_CLI à CLIENTE.COD_EMP_CLI)

SOLUCAO (COD_SOL, DESC_SOL)

SERVICO (COD_SERV, DESC_SERV)

ATENDIMENTO (NR_ORDEM, DATA_ABERTURA, HORA_ABERTURA, DATA_PREVISTA, HORA_PREVISTA, DATA_SOL, HORA_SOL, COD_EMP_CLI, COD_EMP, COD_FUN)

OBS (ATENDIMENTO.COD_EMP_CLI à CLIENTE.COD_EMP_CLI)

OBS (ATENDIMENTO.COD_EMP à EMPRESA.COD_EMP)

OBS (ATENDIMENTO.COD_FUN à FUNCIONARIO.COD_FUN)

SOL_PRESTADA (NR_ORDEM, COD_SOL)

OBS (SOL_PRESTADA.NR_ORDEM à ATENDIMENTO.NR_ORDEM)

OBS (SOL_PRESTADA.COD_SOL à SOLUCAO.COD_SOL)

SERV_PRESTADO (NR_ORDEM, COD_SERV)

OBS (SERV_PRESTADO.NR_ORDEM à ATENDIMENTO.NR_ORDEM)

OBS (SERV_PRESTADO.COD_SERV à SERVICO.COD_SERV)

 

Banco de Dados I – Aula 10D

Crie no Microsoft Access para cada exercício um banco de dados dos exercícios resolvidos

 

Formas Normais – Pedido de Compras 

PEDIDO (NR_PEDIDO, DATA, DEPTO_ORIGEM, FUNC_SOLICITANTE, DEPTO_DESTINO, FUNC_RESPONSAVEL, TOTAL_QTD)

 ITEM_PEDIDO (NR_PEDIDO, ITEM, MATERIAL, QUANTIDADE)

 

2NF (DEPENDENCIA PARCIAL DOS CAMPOS NÃO CHAVE, TRANSFORMAR EM OUTRA TABELA)

PEDIDO (NR_PEDIDO, DATA, DEPTO_ORIGEM, FUNC_SOLICITANTE, DEPTO_DESTINO, FUNC_RESPONSAVEL, TOTAL_QTD)

ITEM_PEDIDO (NR_PEDIDO, ITEM, MATERIAL, QUANTIDADE)

OBS: ITEM_PEDIDO.COD_MATERIAL à MATERIAL.COD_MATERIAL)

 

3FN (ANALISAR OS CAMPOS NÃO CHAVES SE SÃO DEPENDENTES DE OUTROS CAMPOS NÃO CHAVE. CASO SIM, TRANSFORMAR EM OUTRA TABELA)

PEDIDO (NR_PEDIDO, DATA, COD_DEPTO_ORIGEM, COD_FUNC_SOL, COD_DEPTO_DESTINO, COD_FUNC_RESP)

OBS: PEDIDO.COD_DEPTO_ORIGEM à DEPARTAMENTO.COD_DEPTO)

OBS: PEDIDO.COD_FUNC_SOL à FUNCIONARIO.COD_FUNC)

OBS: PEDIDO.COD_DEPTO_DESTINO à DEPARTAMENTO.COD_DEPTO)

OBS: PEDIDO.COD_FUNC_RESP à FUNCIONARIO.COD_FUNC)

DEPARTAMENTO (COD_DEPTO, DEPARTAMENTO)

 FUNCIONARIO (COD_FUNC, FUNCIONARIO)

 ITEM_PEDIDO (NR_PEDIDO, ITEM, COD_MATERIAL, QUANTIDADE)

OBS: ITEM_PEDIDO.COD_MATERIAL à MATERIAL.COD_MATERIAL)

 MATERIAL (COD_MATERIAL, MATERIAL)

Video

 

learningdatabase.com.br

Tecnologias em Banco de Dados Relacionais, Modelagem de dados dimencionais, tecnologias SQL Servere e Oracle

Aprendendo Programação

Algorítmos, C, C++,Pascal, Python, R

WikiDBA

by Virendra Yaduvanshi - Microsoft SQL Server Database Architect | Consultant | Blogger | Specialist | DBA | Speaker

Blog - Fabiano Neves Amorim

SELECT * FROM [Coisas Da Minha Cabeça] WHERE dbo.fn_TempoParaPost() < dbo.fn_TempoLivre()

Tércio Costa, Oracle Developer, OCE SQL, ACE Associate

Guia de estudos para certificação ORACLE SQL(1Z0-047, 1Z0-051, 1Z0-061 e 1Z0-071) e PL/SQL(1Z0-144, 1Z0-146 e 1Z0-148)

Strate SQL

Data Adventures with an Architect