Escolar Documentos
Profissional Documentos
Cultura Documentos
Ementa
Evoluo histrica dos sistemas de informao e dos bancos de dados. Arquitetura de um sistema de banco de dados. Prtica em modelagem de dados relacional. Exerccios sobre modelagem de dados. Introduo linguagem SQL. Linguagens para Definio de Dados e Linguagens para Manipulao de Dados. Exerccios sobre criao de tabelas para banco de dados relacionais. Manipulao de dados. Consultas. Integridade de dados. Processamento de transaes. Estudos de caso.
Bibliografia
Livro Texto: 1. Introduo a Sistemas de Banco de Dados; Date, C. J.; Ed. Campus; 8 edio; 2004; 15 exemplares. 2. Sistemas de Banco de Dados; Korth, , Henry F.; Ed. Campus; 5 edio; 2006; 15 exemplares. 3. Projeto e Modelagem de Banco de Dados; Lightstone, Teorey; Ed. Campus; 1 edio; 2006; 10 exemplares. Complementar: 4. Oracle Database 11g PL/SQL: Programao; McLaughlin, Michel; Ed. Novatec; 1 edio; 2009; 10 exemplares. 5. Oracle 10g PL/SQL; Oliveira, Celso H. Poderoso de; Ed. Novatec; 1 edio; 2005; 10 exemplares. 6. Oracle 10g Database: Guia do DBA; Serson, Serson Roberto Rubinstein; Ed. Novatec; 1 edio; 2004; 10 exemplares. 7. Oracle 10g: Ideal Para Quem Deseja Iniciar o Aprendizado do Oracle; Ramalho, Jos A.; Ed. Thomson; ; 1 edio; 2005; 10 exemplares. 8. Gerenciando Banco de Dados: A Abordagem Entidade-Relacionamento Entidade para Projeto Lgico; Chen, Peter; Makron Books; 1 edio; 1990; 7 exemplares.
A Importncia de um Banco de Dados Definio de Banco de Dados Sistema Gerenciador de Banco de Dados Sistema de Banco de Dados Estrutura Geral de um Sistema de Banco de Dados
O banco de dados o corao de qualquer empresa, , pois atravs dele, funcionam diversos softwares de ERP, CRM, Contabilizao, Financeiro e etc, onde diariamente so armazenadas e consultadas diversas informaes preciosas, que sero de total importncia para a empresa.
Processador de Consultas
Gerenciador de arquivos
Arquivo de dados
Dicionrio de dados
Disco de armazenamento
Oracle 11g
10
Instalao e Servios
No Windows, possvel realizar a instalao default, sem alterar as configuraes padres. Mas fique atento para anotar a senha inicial que solicitada ao usurio SYSTEM (Administrador). Se voc possui um computador com 512Mb de memria (o ideal 1Gb) e processador acima de 2GHertz, 2GHertz pode instalar a verso completa do Oracle 11g. . O disco de instalao tem cerca de 600Mb. Para mquinas mais antigas, recomenda-se recomenda o uso do Oracle 11g Express Edition. . A configurao mnima 256Mb e 1GHertz. O instalador tem cerca de 250Mb.
Obs.: Somente a verso 11g Express Edition gratuita para uso comercial (limitado a 1 base de dados de 4Gb).
11
Instalao e Servios
(cont.)
Afim de carregar o Oracle somente quando realmente desejar utiliz-lo, coloque os 3 servios listados a seguir para serem iniciados manualmente.
ORACLESERVICE - o principal servio. Efetivamente, esse o SGBD e consome bastante recursos do sistema. TNSLISTERNER responsvel por fazer a comunicao entre as chamadas (consultas) ao B.D. e o servio do SGBD. ISQLPLUS o servio que disponibiliza o programa iSQLPlus para realizar a conexo ao Oracle atravs de browser (11g).
Para localizar os servios, que na instalao so colocados para iniciar automaticamente, procure em:
INICIAR / CONFIGURAES / PAINEL DE CONTROLE / FERRAMENTAS ADMINISTRATIVAS / SERVIOS
12
iSQLPlus
http://<servidor>:<porta>/isqlplus http://ANDROMEDA:5560/isqlplus
13
(cont.)
Criando um usurio chamado wagner cuja senha unilins: CREATE USER wagner IDENTIFIED BY unilins; Concedendo privilgio de Administrador (DBA) ao usurio: GRANT DBA TO wagner; Conectando-se se com o novo usurio: CONN WAGNER/UNILINS@ORCL; Para verificar o usurio atual: SHOW USER;
Obs.: Por questo de segurana, no recomendado atribuir o privilgio de DBA para usurios comuns do sistemas.
15
ESQUEMA (SCHEMA)
No Oracle, para cada usurio criado um esquema (schema). Os objetos criados por cada usurio ficam armazenados em seus respectivos esquemas, como se fossem pastas na estrutura de arquivos. Para acessar objetos de outros usurios, necessrio indicar o nome do esquema, seguido pelo nome do objeto.
SCHEMA.OBJECT
Por exemplo, para acessar a tabela PRODUTO pertencente ao esquema (usurio) WAGNER necessrio referenciar:
WAGNER.PRODUTO
16
Linguagem SQL
Structured Query Language (SQL) Mdulos da Linguagem SQL Linguagem de Definio de Dados (DDL)
CREATE TABLE ALTER TABLE DROP TABLE
18
O mdulo DDL responsvel pela definio do esquema (estrutura) do banco de dados (ex. criao das tabelas). Instrues DDL so do tipo auto-commit. O mdulo DML responsvel pela manipulao dos dados do banco, atravs de consultas, incluso, alterao e excluso. Instrues DML precisam ser confirmadas atravs de commit.
Obs.: A ling. SQL no case sensitive, ou seja, no faz diferenciao entre escrever os comandos em maisculo ou minsculo.
20
Instrues DDL
As instrues DDL manipulam a estrutura do banco de dados. Comandos DDL no podem ser desfeitos. Por isso, necessrio usar esses comando com cautela e ateno, pois descuidos podem implicar na perda de informaes importantes do sistema. Em geral, os comandos DDL so bastante utilizados na criao inicial do banco de dados. Posteriormente, somente ajustes e/ou alteraes na estrutura do sistema implicaro em usar esses comandos. Alguns comandos DDL sero vistos a seguir.
21
ALTER TABLE
Altera definies de uma tabela, adicionando, alterando ou removendo atributos e restries
DROP TABLE
Remove uma tabela, quando suas definies no so mais necessrias
22
Descrio
Armazena uma cadeia de caracteres de comprimento varivel. O valor mximo de n so 4000 bytes. O Oracle s guarda o que o utilizador introduzir no preenchendo o que falta para o limite n. Se usarmos BYTE n traduz o nmero de bytes; Armazena uma cadeia de caracteres de comprimento varivel em formato UNICODE. O valor n representa o nmero mximo de caracteres. Um caracter pode ocupar 2 bytes se usarmos AL16UTF16 encoding ou 3 bytes para UTF8 encoding. O valor mximo so 4000 bytes. O Oracle s guarda o que o utilizador introduzir no preenchendo o que falta para o limite n; Caracteres de comprimento fixo n. O valor por omisso 1 sendo o valor mximo 2000. A base de dados ocupa sempre n caracteres pois preenche o que falta com espaos em branco; Nmero em virgula flutuante com 38 digitos significativos de preciso; Nmero inteiro com 'n' digitos de preciso. Mximo de 38; Nmero com n digitos sendo d casas dcimais ( direita da virgula); Data desde 1 Jan de 4712 AC at 31 de Dez de 9999 DC. Tambm armazenada a hora, minuto e segundo. O calendrio interno da base de dados tem em conta as alteraes de calendrio impostas ao longo do tempo, por exemplo a passagem do calendrio Juliano para Gregoriano em 1582-10-05, 1582 onde foram eliminados 10 dias; Datas desde 1 Jan de 1970 com hora, minuto, segundo e centsima de segundo. Num casos armazenada a referncia para o fuso horrio e noutro usado o fuso horrio local; . Armazena at 4Gb em formato binrio Binary Large Object. Character Large Object. . Armazena at 4Gb de texto
NVARCHAR2(n)
CHAR(n [byte|char]) NUMBER NUMBER(n) NUMBER(n,d) DATE TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE BLOB CLOB
23
(cont.)
Cadeia de caracteres com comprimento mximo de 100 caracteres mas pode ter menos. Cadeia de caracteres de comprimento fixo 80. Se o valor introduzido tiver 10 caracteres, o espao que sobra preenchido com brancos.
Notas: Os tipos VARCHAR2 e NUMBER so nativos apenas em ORACLE. Por isso, usaremos VARCHAR, INTEGER e DECIMAL. Dessa forma, nosso scripts estaro dentro do padro SQL Ansi e funcionaro para qualquer SGBD. Isso no ocasionar nenhuma mudana ao Oracle, pois ele ir substituir automaticamente esses campos por seus respectivos tipos nativos.
VARCHAR(n) INTEGER DECIMAL(n,d)
VARCHAR2(n) NUMBER NUMBER(n,d)
24
25
(cont.)
(cont.)
Definio de Restries
CHECK
Permite criar validaes para um campo Ex.: sexo char(1), check(sexo in('M','F'))
DEFAULT
Atribuir valor padro, se o campo no for preenchido Ex.: uf char(2) default 'SP'
UNIQUE
No permite valores duplicados para um campo Ex.: cpf varchar(18) unique
PRIMARY KEY
Chave primria, garante valor nico para o campo Ex.: Numa escola, cada aluno tem um nmero de matrcula nico.
FOREIGN KEY
Chave estrangeira, garante integridade com a tabela de origem do campo Ex.: Numa venda, verifica se o cdigo do cliente informado valido.
UPDATE
Permite a alterao de dados
DELETE
Permite a excluso de registros na tabela
SELECT
Permite a criao de consultas nos dados gravados na tabela
Obs.: SGBDs transacionais (que trabalham com transaes) necessitam que as instrues DML sejam confirmadas com o comando COMMIT ou canceladas com ROLLBACK.
30
Sintaxe: INSERT INTO <tabela> (<campo1>, <campo2>, <campo3>) VALUES (<valor1>, <valor2>, <valor3>);
Obs.: A indicao dos campos opcional se os valores de todos os campos forem indicados na mesma seqncia em que foram criados na tabela.
Sintaxe: UPDATE <tabela> SET <campo1> = <valor1> [, <campo2> = <valor2> ] WHERE <condio>;
Obs.: Apesar de ser opcional, a instruo WHERE s no ser usada se o objetivo for alterar todos os registros contidos na tabela.
obs.: no recomendado manipular os dados atravs de campos alfanumricos. O ideal seria utilizar a chave primria para fazer isso. UPDATE produto SET preco = 1.20 WHERE cod_prod = 1;
Obs1: Apesar de ser opcional, a clusula WHERE s no ser usada se o objetivo for apagar todos os registros contidos na tabela. Obs2: Num sistema comercial raramente realizada uma excluso fsica com a instruo DELETE. Normalmente se altera um atributo de status do registro.
Transao
Uma transao:
uma sequncia de comandos que forma uma unidade lgica de processamento no banco de dados. um conjunto de operaes que leva o banco de dados de um estado consistente para outro estado consistente. Requer que todas as operaes sejam executadas de forma indivisvel.
Exemplos:
Transferncia Bancria Saque em Terminal de Cash Compra com Pagamento no Carto de Crdito Compra de Passagem Area
1.
UPDATE tb_saldo SET saldo = saldo 100 WHERE num_conta = 123; UPDATE tb_saldo SET saldo = saldo + 100 WHERE num_conta = 456; COMMIT;
2.
3.
Caso ocorra um erro (como uma queda de energia) antes da execuo do COMMIT, automaticamente, o comando ROLLBACK executado e aborta toda a transao.
39
COMMIT e ROLLBACK
Ao executar uma instruo DML, as informaes so armazenadas inicialmente numa rea temporria. O comando COMMIT serve para confirmar a gravao dos dados na rea definitiva. ROLLBACK serve para cancelar a execuo da ltima sequncia de comandos DML (transao). Caso nenhum dos 2 comandos seja executado e a aplicao seja finalizada, o comando ROLLBACK realizado (exceto se o aplicativo estiver configurado para fazer COMMIT automtico) Comandos DDL executam implicitamente o COMMIT.
40
Exemplos de Consultas
1. Consultar a descrio e o preo dos Produtos
SELECT descricao, preco FROM produto;
Exemplos de Consultas
(cont.)
Exerccios
1. Alterar a estrutura da tabela de produtos adicionando o campo estoque com valor padro zero. 2. Atualizar a quantidade em estoque de todos os produtos para 100 unidades. 3. Cadastrar o produto 'Gravador de DVD', com preo de R$ 120,00 e estoque igual a 15 unidades. 4. Atualizar o estoque de 'Gravador de DVD' de 15 para 14 unidades. 5. Atualizar o preo do 'Gravador de DVD' aumentando seu valor em 10%. 6. Atualizar o preo de 'Gravador de DVD' para R$ 110,00 e a quantidade em estoque para 50. 7. Atualizar o preo dos produtos que custem at 500 reais abaixando os preos em 5%. 8. Excluir o registro de 'Gravador de DVD'. 9. Remover o campo estoque da tabela de produtos. 10. Apagar a tabela de produtos.
44
Exerccios
1. 2. 3. 4. 5. 6. 7. 8. 9. Criar uma tabela de clientes com os campos: cod_cli, nome, endereo, cidade e telefone. Cadastrar 5 clientes. Alterar o telefone do cliente 'Wagner' para '(14) 3533-3200'. 3533 Listar todos os clientes cadastrados. Listar todos os clientes classificados alfabeticamente pelo nome. Listar todos os clientes classificados decrescentemente pelo nome. Listar todos os clientes classificados pelo cdigo Listar todos os clientes ordenados pela cidade Listar todos os clientes ordenados primeiro pela cidade, depois pelo nome.
Exerccios
1. 2. 3. 4. 5. 6. 7. 8. 9.
(cont.)
Apresentar os clientes que residam em 'Lins' ou 'Marlia'. Apresentar os dados do cliente 'Wagner'. Apresentar os dados dos clientes cujo nome comece por 'Wa'. Apresentar os clientes cujo nome termine com 'r'. Apresentar os clientes que contenham a slaba 'ne' no nome. Adicionar o campo data_nasc do tipo date na tabela de cliente. Preencher os aniversrios dos clientes. Apresentar os clientes que nasceram antes de 1990. Apresentar os clientes nascidos em dezembro, ordenados pela data de nascimento.
46
47
- converte para maiscula - converte para minscula - letras iniciais em maiscula - concatena strings - retorna o tamanho da string - remove espaos em branco - substitui partes da string - recorta partes da string
48
UPPER
Converte uma string para maiscula. _____________
SELECT UPPER('Unilins') FROM dual; Resp.: UNILINS
_____________
SELECT UPPER(nome) FROM cliente; Resp.: JOSE MARIO MARIADELIA RICARDO
Nota: A tabela DUAL contm apenas uma coluna e uma linha e criada automaticamente pelo Oracle.
49
LOWER
Converte uma string para minscula. _____________
SELECT LOWER('Unilins') FROM dual; Resp.: unilins
_____________
SELECT LOWER(nome) FROM cliente; Resp.: jose mario mariadelia ricardo
50
INITCAP
Retorna o primeiro caractere de cada palavra em maisculo e os demais caracteres em minsculo. _____________
SELECT INITCAP('wagner DIZERO') FROM dual; Resp.: Wagner Dizero
_____________
SELECT INITCAP(nome) FROM cliente; Resp.: Jose Mario Mariadelia Ricardo
51
CONCAT ( || )
Concate duas strings em uma nica. _____________
SELECT CONCAT('Wagner', 'DIZERO') FROM dual; SELECT 'Wagner' || 'Dizero' FROM dual; Resp.: Wagner Dizero
_____________
SELECT nome || '-' ' || cidade FROM cliente; Resp.: Jose Mario Lins Mariadelia Cafelndia Ricardo - Ponga
52
LENGTH
Retorna o comprimento da string medido em caracteres. _____________
SELECT LENGTH('Wagner') FROM dual; Resp.: 6
_____________
SELECT nome, LENGTH(nome) FROM cliente; Resp.: Jose Mario 10 Mariadelia 10 Ricardo 7
53
_____________
SELECT TRIM(' Wagner ') FROM dual;
Resp.:
Wagner
_____________
SELECT TRIM(nome) FROM cliente;
Resp.:
54
REPLACE
Troca uma substring por outra a cada ocorrncia na string principal.
_____________
SELECT REPLACE('1,20', ',', '.') FROM dual;
Resp.:
1.20
_____________
SELECT nome, REPLACE(telefone,'-','.') REPLACE(telefone,' FROM cliente;
Resp.:
SUBSTR
Retorna uma substring.
_____________
SELECT SUBSTR('Unilins',0,3) FROM dual;
Resp.:
Uni
_____________
SELECT SUBSTR('Unilins',3,4) FROM dual;
Resp.:
ilin
_____________
SELECT SUBSTR('Unilins',-4,4) SUBSTR('Unilins', FROM dual;
Resp.:
lins
56
Funes Numricas
ABS CEIL FLOOR MOD POWER ROUND SQRT TRUNC - valor absoluto - arredonda para cima - arredonda para baixo - resto da diviso - potncia - arredonda - raiz quadrada - trunca o valor
57
ABS
Retorna o valor absoluto.
_____________
Select ABS(-5) 5) From Dual;
Resp.: 5
CEIL
Arredonda para o prximo valor inteiro.
_____________
Select CEIL(1.7) From Dual;
Resp.: 2
58
FLOOR
Arredonda o valor para baixo.
_____________
Select FLOOR(1.7) From Dual;
Resp.: 1
MOD
Retorna o resto de uma diviso.
_____________
Select MOD(11,4) From Dual;
Resp.: 3
59
POWER
Retorna x elevado a y, onde x o primeiro parmetro e y o segundo.
_____________
Select POWER(5,3) From Dual;
Resp.: 125
ROUND
Arredonda para o valor mais prximo.
_____________
Select ROUND(1.666,2) From Dual;
Resp.: 1,67
60
SQRT
Retorna a raiz quadrada.
_____________
Select SQRT(2) From Dual;
Resp.:
1.41421356
TRUNC
Retorna o valor truncado.
_____________
Select TRUNC(1.999,1) From Dual;
Resp.: 1.9
61
- data atual do servidor - converte para data - converte para string - extrai o ano, ms ou dia - ltimo dia do ms - soma meses numa data
62
SYSDATE
Retorna a data/hora atual do servidor.
_____________
SELECT SYSDATE FROM dual;
Resp.:
03/02/12
_____________
SELECT SYSDATE+7 FROM dual;
Resp.:
10/02/12
_____________
SELECT SYSDATE-1 1 FROM dual;
Resp.:
02/02/12
63
TO_DATE
_____________
SELECT TO_DATE('Fevereiro 03, 2006', 'Month DD, YYYY') FROM dual;
Resp.:
03/02/12
64
TO_CHAR
Converte uma data para string. Podem ser usados diferentes formatos
_____________
SELECT TO_CHAR(SYSDATE,'DD/MM/YY HH:MI:SS') FROM dual;
Resp.:
03/02/12 - 03:01:30
EXTRACT
Extrai de um campo data apenas o ano, ms, dia, hora, minuto ou segundo
_____________
SELECT EXTRACT(DAY FROM SYSDATE) FROM dual
Resp.:
_____________
SELECT nome, EXTRACT(YEAR FROM data_admissao) FROM Funcionario;
Resp.:
66
LAST_DAY
_____________
SELECT LAST_DAY('01/03/2012') FROM dual;
Resp.:
31/03/2012
67
ADD_MONTHS
_____________
SELECT ADD_MONTHS('01/03/2012',2) FROM dual;
Resp.: 01/05/2012
68
Consultas em 2 tabelas
69
Diagrama de Classes
1..1
Representao da Cardinalidade
UML
DEPARTAMENTO 0..N
1..1
FUNCIONARIO
Peter Chen
DEPARTAMENTO
FUNCIONARIO
Oracle
DEPARTAMENTO
FUNCIONARIO
Microsoft
DEPARTAMENTO
FUNCIONARIO
CREATE TABLE funcionario ( cod_func integer not null, cod_depto integer, nome varchar(40), salario numeric(8,2), cargo varchar(30), data_admissao date, PRIMARY KEY(cod_func), FOREIGN KEY(cod_depto) REFERENCES departamento(cod_depto) );
Dependncia de Dados da FK
Quando se cria uma chave estrangeira, o SGBD no permite que um registro pai seja apagado se este tiver filhos, pois isso geraria registros rfos. Por exemplo, no permitido apagar um departamento que tenha funcionrios cadastrados, pois esses funcionrios perderiam o vnculo com seu respectivo departamento. Por isso, preciso primeiro apagar todos os filhos (funcionrios) para depois poder apagar o registro pai (departamento).
Dependncia de Dados da FK
(cont.)
Uma alternativa definir que os registros filhos devem ser apagados em cascata. Mas ateno: por questes de segurana, esse recurso dever ser usado com cautela.
CREATE TABLE funcionario ( cod_func integer not null, cod_depto integer, nome varchar(40), salario numeric(8,2), cargo varchar(30), data_admissao date, PRIMARY KEY(cod_func), FOREIGN KEY(cod_depto) REFERENCES departamento(cod_depto) ON DELETE CASCADE );
Estrutura da Tabelas
DEPARTAMENTO nome Marketing Produo Informtica Vendas
cod_depto 1 2 3 4
cod_func 1 2 3 4 5 6
...
Cadastrar o funcionrio 'Luiz', no cargo de 'gerente', com salrio de R$ 4.500,00, no depto 1, admitido em 15 de agosto de 2009. Cadastrar o funcionrio Paulo, com cargo de 'representante comercial' no departamento de 'Vendas', com salrio de R$ 1.999,99 admitido em 22/01/2012. Cadastrar o funcionrio Bruno no departamento 20
(ERRO: violao de chave estrangeira)
Consultas em 2 tabelas
1. Apresentar o nome de cada funcionrio e o respectivo departamento em que trabalha.
SELECT funcionario.nome, departamento.nome FROM funcionario, departamento WHERE funcionario.cod_depto = departamento.cod_depto; ou SELECT funcionario.nome, departamento.nome FROM funcionario INNER JOIN departamento ON funcionario.cod_depto = departamento.cod_depto; ou SELECT F.nome, D.nome FROM nuncionario F INNER JOIN departamento D ON F.cod_depto = D.cod_depto;
78
Consultas em 2 tabelas
2. Apresentar os funcionrios do departamento de 'Vendas'.
SELECT F.nome, D.nome FROM funcionario F INNER JOIN departamento D ON F.cod_depto = D.cod_depto WHERE D.nome = 'Vendas';
79
Consultas em 2 tabelas
(cont.)
Exerccios
1. Apresentar o departamento e o ramal do funcionrio 'Luiz'. 2. Apresentar o nome e o departamento dos funcionrio com cargo de gerente. 3. Apresentar o nome, cargo e departamento dos funcionrios admitidos a partir de 15/01/2011. 4. Apresentar o nome, cargo e departamento dos funcionrios admitidos entre 2007 e 2010. 5. Apresentar o nome, cargo e departamento dos funcionrios admitidos no ano atual. 6. Apresentar o nome, cargo e salrio dos funcionrios com salrio acima de R$ 5.000,00. 7. Apresentar o nome, cargo, salrio e depto dos funcionrios admitidos em 2010 e 2012.
81
82
(cont.)
Como a tabela de produtos j existe, teremos que modificar sua estrutura, sem perder os dados j cadastrados:
ALTER TABLE produto ADD cod_cat integer; ALTER TABLE produto ADD FOREIGN KEY(cod_cat) REFERENCES categoria;
83
(cont.)
Agora que j acertamos as tabelas, precisaremos ajustar os cadastros. Os novos produtos j podero ser cadastrados utilizando a respectiva categoria. Contudo, preciso acertar os registros dos produtos j cadastrados.
INSERT INTO categoria(cod_cat,descricao) VALUES(1, 'Informtica'); INSERT INTO categoria(cod_cat,descricao) VALUES(2, 'Material de Escritrio'); INSERT INTO categoria(cod_cat,descricao) VALUES(3, 'Eletroeletrnico'); COMMIT;
84
(cont.)
Supondo j termos anteriormente cadastrado impressora, agora iremos atualizar seu cadastro para a categoria 'informtica'.
UPDATE produto SET cod_cat = (SELECT cod_cat FROM categoria WHERE descricao = 'Informtica') WHERE descricao = 'Impressora'; COMMIT;
85
(cont.)
possvel, tambm, atualizar diversos produtos de uma nica vez. Por exemplo, caderno, lpis e caneta so classificados como 'material de escritrio'.
UPDATE produto SET cod_cat = 2 WHERE descricao IN ('caderno', 'lpis', 'caneta'); COMMIT;
Agora, podemos repetir a operao acima para acertar o cadastro de todos os produtos.
86
(cont.)
A partir de agora que j acertamos a tabela de produtos, os prximos cadastros j podem ser feitos informando a categoria do produto.
INSERT INTO produto(cod_prod,cod_cat,descricao,preco) VALUES(25, 3, 'Filmadora', 1200.00); COMMIT;
87
Exerccios
1. 2. 3. 4. 5. Apresentar a descrio do produto, preo do produto e descrio da categoria de todos os produtos cadastrados. Apresentar a descrio do produto, preo e categoria dos produtos que custem at R$ 50,00. Apresentar a descrio e preo dos produtos que sejam da categoria 'Informtica'. Apresentar a categoria a qual pertence o produto 'Impressora'. Elaborar uma consulta para apresentar os produtos que pertenam as categorias material de escritrio ou informtica e que custem entre 80 e 100 reais. Apresentar os produtos que no sejam da categoria eletroeletrnico. Apresentar o cdigo, a descrio, o preo e a categoria de todos os produtos ordenados pelo preo.
88
6. 7.
Tipos de juno
89
INNER JOIN
Realiza a juno de 2 tabelas retornando apenas os registros que tenham vnculo nas 2 tabelas. Exemplo: SELECT f.nome, d.nome FROM funcionario f INNER JOIN departamento d ON f.cod_depto = d.cod_depto;
Obs.: Se houver algum departamento sem funcionrios ou algum funcionrio que no esteja vinculado a um departamento, no ser exibido.
90
LEFT JOIN
Realiza a juno de 2 tabelas retornando todos os registros da tabela a esquerda, mesmo daqueles sem ligao.
INSERT INTO funcionario(cod_func,cod_depto,nome,salario cod_func ) VALUES(10, null, , 'Ivan', 5000); SELECT f.nome, d.nome FROM funcionario f LEFT JOIN departamento d ON f.cod_depto = d.cod_depto; Por exemplo, para gerar a folha de pagamento, deve-se deve localizar todos os funcionrios, mesmo aqueles que no estejam vinculados a nenhum setor.
91
RIGHT JOIN
A clusula RIGHT JOIN funciona de forma similar ao LEFT JOIN, porm retorna todos os registros da tabela a direita da clusula FROM.
SELECT f.nome, d.nome FROM funcionario f RIGHT JOIN departamento d ON f.cod_depto = d.cod_depto; Todos os departamento sero apresentados, mesmo aqueles que no tenham nenhum funcionrio vinculado.
O mesmo resultado pode ser obtido utilizando-se utilizando LEFT JOIN e invertendo a ordem das tabelas na clusula FROM.
92
FULL JOIN
A clusula FULL JOIN retorna todos os registros de ambas as tabelas, mesmo os registros que no tenham ligao entre as chaves.
SELECT f.nome, d.nome FROM funcionario f FULL JOIN departamento d ON f.cod_depto = d.cod_depto;
93
INNER JOIN
LEFT JOIN
RIGHT JOIN
FULL JOIN
94
Exerccios
1. Apresentar a descrio, preo e categoria de todos os produtos, independente da categoria a que pertena. 2. Apresentar a descrio, preo e categoria de todos os produtos que custem at R$ 500,00. 3. Apresentar a descrio e o preo de todos os produtos da categoria 'Material de Escritrio'. 4. Apresentar a descrio, preo e categoria de todos os registros cadastrados. 5. Apresentar a descrio e o preo de todos os produtos sem categoria cadastrada.
95
Trabalho
1.
(individual ou em dupla)
Baseado no diagrama de classes abaixo, criar as tabelas com as respectivas chaves primrias e estrangeira.
CLIENTE
cod_cli nome endereco cidade telefone
0..N 1..1
cod_venda data
VENDA
2. 3. 4. 5.
Cadastrar 10 vendas com diferentes datas e para diferentes clientes. Criar uma consulta que apresente o cdigo da venda, a data da venda, o nome do cliente e a cidade do cliente. Incluir no resultado da consulta os telefones dos clientes. Modificar a consulta para que sejam exibidos apenas clientes que residam em 'Lins'.
96
Trabalho
6.
(cont.)
Apresentar a relao de clientes para os quais foram realizadas vendas na data de 10/03/2012. 7. Apresentar a relao de clientes para os quais foram realizadas vendas entre os dias 1 e 15 de maro de 2012. 8. Apresentar a relao de clientes para os quais foram realizadas vendas no ano de 2012. 9. Apresentar a relao de clientes para os quais foram realizadas vendas na data de hoje. 10. Apresentar a relao de clientes que residam em Lins e que foram realizadas vendas na ltima semana. 11. Apresentar a relao de clientes para os quais nenhuma venda foi realizada. 12. Apresentar a relao de clientes para os quais nenhuma venda foi realizada nos ltimos 30 dias.
Diagrama de Classes
DEPARTAMENTO
cod_depto nome ramal
0..N 1..1
FUNCIONARIO
cod_func nome data_admissao cargo salrio
0..N
CATEGORIA
cod_cat descricao
0..N 1..N 0..N 1..1
CLIENTE
cod_cli nome endereco cidade telefone
0..N
1..1
1..1
cod_venda data
VENDA
PRODUTO
cod_prod descricao preco estoque
ITENS
qtde
Relacionamento N para N
Banco de dados relacionais no conseguem mapear diretamente um relacionamento N para N. Ento criada uma nova tabela e so feitos 2 relacionamentos 1 para N. Tabelas geradas atravs de um relacionamento N para N sempre iro possuir chave primria composta. Essa PK composta utiliza as 2 FKs e, eventualmente, tambm outros campos.
CREATE TABLE itens ( cod_ven integer not null, cod_prod integer not null, qtde integer, PRIMARY KEY(cod_ven,cod_prod), FOREIGN KEY(cod_ven) REFERENCES venda, FOREIGN KEY(cod_prod) REFERENCES produto );
101
Qtde 5 2 1 1 8 3 2
Exerccios
1. 2.
Apresentar o ramal telefnico do departamento de 'produo'. Apresentar o nome dos funcionrios que ocupem o cargo de 'gerente'. Apresentar os funcionrios que tenham sido admitidos at a data de '25/10/2004'. Apresentar os funcionrios que tenham sido admitidos entre '01/01/2003' e '31/12/2006'. Apresentar os clientes da cidade de 'Lins'. Apresentar os produtos cuja descrio inicie com 'di'. Apresentar o preo e o estoque atual do produto 'pen drive'. Apresentar os produtos com estoque abaixo de 5 unidades. Apresentar o nmero das vendas realizadas no dia '27/09/2005'. Apresentar o nmero das vendas realizadas no ms de 'agosto de 2006'.
105
3.
4.
5. 6. 7. 8. 9. 10.
11. 12.
Apresentar os dias em que a cliente 'Paula' realizou vendas. Apresentar o nome dos clientes que realizaram vendas no dia '17/02/2004'. Apresentar o nome dos clientes residentes em 'Lins' que realizaram pedidos no dia de hoje. Apresentar o nome e telefone dos clientes que tenham realizado pedidos no ano de '2006'. Apresentar o nome dos funcionrios que realizaram vendas no dia de hoje. Apresentar o nome, cargo e salrio dos funcionrios que trabalham no departamento de 'contabilidade'. Apresentar os funcionrios do departamento de 'informtica' admitidos no ms de 'janeiro de 2006'. Apresentar o nome do departamento e o ramal telefnico no qual trabalha o funcionrio 'Carlos'. Apresentar os produtos com preo entre R$ 1,50 e R$ 3,00 que tenham sido comercializados no dia 12/10/2006'. Apresentar os clientes com sobrenome 'Silva' e que tenham vendas hoje.
106
13.
14.
15.
16.
17.
18.
19.
20.
21.
Apresentar a descrio do produto, preo unitrio e quantidade dos itens solicitados referentes venda de nmero 1. Apresentar a descrio, preo, quantidade e subtotal dos itens da venda de nmero 1. Apresentar os clientes que tenham comprado 'notebook'. Apresentar os clientes que tenham comprado 'caneta', 'caderno' ou 'lapiseira' no ms de 'fevereiro de 2005'. Apresentar os produtos que j foram comprados pelo cliente 'Andr'. Solicitar a descrio de um produto e apresentar o nome de todos os clientes que j tenham comprado o mesmo. Apresentar os clientes que j foram atendidos pela funcionria 'Andrea'. Apresentar o nome dos funcionrios que j atenderam o cliente 'Renan'. Apresentar os produtos vendidos pelo vendedor 'Ricardo'. Apresentar os clientes de 'Cafelndia' que tenha sido vendido 'teclado' em 'novembro de 2006'.
107
22.
23. 24.
25.
26.
27.
28.
29. 30.
Funes de Agrupamento
108
Funes de Agrupamento
A linguagem SQL oferece 5 funes de agregao:
COUNT
Conta a quantidade de registros localizados
SUM
Soma o total dos valores contidos em um campo
MAX
Retorna o maior valor de um campo
MIN
Retorna o menor valor de um campo
AVG
Retorna a mdia dos valores de um campo
109
110
3. Apresentar a soma dos salrios dos funcionrios que trabalham no departamento de 'marketing'.
SELECT SUM(Salario) FROM Funcionario F INNER JOIN Depto D ON F.Cod_Depto = D.Cod_Depto WHERE D.Nome = 'Marketing';
111
GROUP BY
A clusula GROUP BY usada em conjunto com as funes de agregao quando se deseja agrupar o resultado da consulta por um campo.
115
GROUP BY
(cont.)
2. Apresentar o nome de cada departamento e a respectiva despesa com folha de pagamento de cada setor.
SELECT D.Nome, SUM(Salario) FROM funcionario F INNER JOIN depto D ON F.cod_depto = D.cod_depto GROUP BY D.nome;
3. Apresentar o nome de cada departamento e a respectiva quantidade de funcionrios, somatria dos salrios e mdia salarial.
SELECT D.nome, COUNT(*), SUM(F.salario), AVG(F.salario) FROM funcionario F INNER JOIN depto D ON F.cod_depto = D.cod_depto GROUP BY D.nome;
116
HAVING
Depois que os registros so agrupados com GROUP BY, HAVING determina quais registros so exibidos.
semelhante a WHERE, que determina quais registros so selecionados. uma clusula opcional. S pode ser usada em parceria com GROUP BY
HAVING
1. Apresentar o nome de cada departamento com a respectiva quantidade de funcionrios, apenas dos departamentos com mais de 5 funcionrios.
SELECT D.nome, COUNT(*) qtde FROM funcionario F INNER JOIN depto D ON F.cod_depto = D.cod_depto GROUP BY D.nome HAVING COUNT(*) > 5;
2. Apresentar o nome de cada departamento com o respectivo valor gasto com folha de pagamento somente dos departamentos que gastem mais de 10 mil reais.
SELECT D.nome, SUM(F.salario) total FROM funcionario F INNER JOIN depto D ON F.cod_depto = D.cod_depto GROUP BY D.nome HAVING SUM(F.salario) ) > 10000.00;
118
EXERCCIOS:
Elaborar as instrues SQL para realizar as seguintes consultas baseadas em funes de agrupamento.
1. 2. 3. 4. 5.
Apresentar a quantidade de clientes da empresa. Apresentar a quantidade de produtos. Apresentar a quantidade de vendas realizadas. Apresentar a quantidade de clientes residentes em 'Lins'. Apresentar a quantidade de funcionrios com salrio entre R$ 350,00 e R$ 500,00. Apresentar a quantidade de produtos em falta (sem estoque). Apresentar a quantidade de vendas realizadas pelo funcionrio 'Alexandre'. Apresentar o nome do funcionrio e a quantidade de vendas realizadas por cada um. Solicitar o nome de um cliente e apresentar a quantidade de vendas realizadas para ele. Apresentar o nome do depto e a quantidade de funcionrios apenas daqueles que tenham pelo menos 3 funcionrios.
119
6. 7.
8.
9.
10.
11. 12.
Apresentar o montante gasto com folha de pagamento. Apresentar a soma dos salrios de todos os funcionrios com cargo de 'gerente'. Apresentar o total gasto com salrios pelo departamento de 'informtica'. Apresentar o faturamento bruto com a venda de 'notebook'. Apresentar cada produto e o respectivo faturamento bruto. Apresentar o nome de cada departamento e o respectivo valor gasto com folha de pagamento por cada setor. Apresentar o valor total da venda de nmero 1. Apresentar o total de vendas (em reais) realizado pelo funcionrio 'Marcelo'. Solicitar o nome de um cliente e apresentar o total de vendas (em reais) realizado para o mesmo. Apresentar os produtos que tenham tido faturamento bruto superior a R$ 50.000,00.
120
13.
14.
15.
16.
17. 18.
19.
20.
Apresentar o preo do produto mais caro. Apresentar o valor do maior salrio da empresa. Apresentar o valor do maior salrio entre os funcionrios do departamento de 'Marketing'. Apresentar o nome e o salrio do funcionrio mais bem remunerado da empresa. Apresentar o nome do ltimo funcionrio admitido pela empresa. Apresentar a descrio e o preo do produto mais caro. Apresentar o produto com maior estoque disponvel. Apresentar o nome de cada departamento e o valor do maior salrio de cada um. Apresentar o nome e o salrio do funcionrio mais bem remunerado entre aqueles que trabalhem na 'Informtica'. Apresentar o produto com o maior faturamento bruto.
121
24.
25.
26.
27. 28.
29.
30.
Apresentar o preo do produto mais barato. Apresentar o valor do menor salrio da empresa. Apresentar o valor do menor salrio entre os funcionrios do departamento de 'Marketing'. Apresentar o nome e o salrio do funcionrio mais mal remunerado da empresa. Apresentar o nome do primeiro funcionrio admitido pela empresa. Apresentar a descrio e o preo do produto mais barato. Apresentar o nome de cada departamento e o valor do menor salrio de cada um. Apresentar o nome e o salrio do funcionrio mais mal remunerado entre aqueles que trabalhem na 'Informtica'. Apresentar o produto com o menor faturamento bruto. Apresentar o departamento com a menor folha de pagamento.
34.
35.
36. 37.
38.
39. 40.
122
Apresentar o preo mdio dos produtos. Apresentar o valor mdio do salrio da empresa. Apresentar o valor mdio dos salrios dos gerentes. Apresentar a mdia salarial dos funcionrios, excluindo os gerentes. Apresentar o valor mdio de salrio entre os funcionrios do departamento de 'Marketing'. Apresentar o nome e o salrio dos funcionrios acima da mdia salarial da empresa. Apresentar a descrio e o preo dos produtos abaixo da mdia de preos entre os produtos. Apresentar o nome de cada departamento e o valor mdio de salrio de cada um. Apresentar o nome e o salrio do funcionrio que recebem abaixo da mdia entre aqueles que trabalhem na 'Informtica'. Apresentar a mdia de faturamento bruto dos produtos.
123
45.
46.
47.
48.
49.
50.
Unio de consultas
124
125
Exemplo
Por exemplo, possvel apresentar a relao de profissionais da rea da sade fazendo a unio entre as tabelas de mdico e de enfermeiro.
CREATE TABLE tb_medico ( crm varchar(15) not null primary key, nome varchar(40), sexo char(1), check (sexo in('F','M')), especialidade varchar(40) ); CREATE TABLE tb_enfermeiro ( coren varchar(15) not null primary key, nome varchar(40), sexo char(1), check (sexo in('F','M')) );
UNION
1. Apresentar o documento, nome e sexo de todos os mdicos e enfermeiros.
SELECT crm doc, nome, sexo FROM tb_medico UNION ALL SELECT coren, nome, sexo FROM tb_enfermeiro; obs. nesse caso, as instrues UNION e UNION ALL trazem a mesma resposta, pois no h possibilidade de existirem registro duplicados. Assim, deve-se se usar o UNION ALL por questo de desempenho. obs2. note que conseguimos fazer a unio das 2 consultas, contudo, no possvel saber quem mdico e quem enfermeiro. Para resolver isso, podemos criar uma nova coluna.
127
UNION
2. Modificar o exemplo anterior de forma a conseguir diferenciar os tipos de profisso.
SELECT 'medico' tipo, crm doc, nome, sexo FROM tb_medico UNION ALL SELECT 'enfermeiro', coren, coren nome, sexo FROM tb_enfermeiro;
128
UNION
3. Adicionar a coluna especialidade. No caso de enfermeiros, deixar em vazio.
SELECT 'medico' tipo, crm doc, nome, sexo, especialidade FROM tb_medico UNION ALL SELECT 'enfermeiro', coren, coren nome, sexo, NULL FROM tb_enfermeiro;
obs.: note que no possvel usar a clusula UNION se o nmero de campos das consultas for diferente.
129
UNION
4. Apresentar somente os profissionais do sexo masculino.
SELECT 'medico' tipo, crm doc, nome, sexo FROM tb_medico WHERE sexo = 'M' UNION ALL SELECT 'enfermeiro', coren, coren nome, sexo FROM tb_enfermeiro WHERE sexo = 'M';
130
UNION
5. Apresentar os mdicos de ambos os sexos e as enfermeiras (sexo feminino).
SELECT 'medico' tipo, crm doc, nome, sexo FROM tb_medico UNION ALL SELECT 'enfermeiro', coren, coren nome, sexo FROM tb_enfermeiro WHERE sexo = 'F';
131
UNION
6. Apresentar todos os profissionais da sade, exceto os mdicos cardiologistas.
SELECT 'medico' tipo, crm doc, nome, sexo FROM tb_medico WHERE especialidade <> 'Cardiologista' UNION ALL SELECT 'enfermeiro', coren, coren nome, sexo FROM tb_enfermeiro;
132
UNION
7. Apresentar todos mdicos e enfermeiros, mas ordenado pelo nome dos profissionais (independente do tipo)
SELECT 'medico' tipo, crm doc, nome, sexo, especialidade FROM tb_medico UNION ALL SELECT 'enfermeiro', coren, coren nome, sexo, NULL FROM tb_enfermeiro ORDER BY nome;
133
UNION
8. Apresentar a mesma resposta do exerccio anterior, mas ordenado pelo nome primeiro dos mdicos, depois dos enfermeiros.
SELECT 'medico' tipo, crm doc, nome, sexo, especialidade FROM (SELECT * FROM tb_medico ORDER BY nome) UNION ALL SELECT 'enfermeiro', coren, coren nome, sexo, NULL FROM (SELECT * FROM tb_enfermeiro ORDER BY nome);
134
UNION
9. Apresentar os mdicos que sejam 'pediatra' ou do sexo 'feminino'.
, nome, sexo, especialidade SELECT crm, FROM tb_medico WHERE especialidade = 'Pediatra' UNION SELECT crm, , nome, sexo, especialidade FROM tb_medico WHERE sexo = 'F'; obs1.: note que desta vez foi usado o comando UNION (ao invs de UNION ALL), pois caso existam mdicas pediatras devero ser exibidas uma nica vez. obs2.: o exemplo anterior poderia ser resolvido com o operador OR. Contudo, o comando UNION tem melhor desempenho (no pior caso, o mesmo desempenho)
135
UNION
10. Apresentar a relao de clientes e funcionrios.
SELECT 'cliente' tipo, nome FROM cliente UNION ALL SELECT 'funcionario' ' tipo, nome FROM funcionario;
136
UNION
11. Apresentar a relao de clientes, funcionrios e fornecedores.
SELECT 'cliente' tipo, nome FROM cliente UNION ALL SELECT 'funcionario' ' tipo, nome FROM funcionario UNION ALL SELECT 'fornecedor' tipo, nome FROM fornecedor;
137
UNION
12. Apresentar todos os clientes que possuam a palavra 'Lins' no nome, cidade ou endereo.
SELECT nome, endereco, , cidade FROM tb_cliente WHERE UPPER(nome) LIKE '%LINS%' UNION SELECT nome, endereco, , cidade FROM tb_cliente WHERE UPPER(endereco) ) LIKE '%LINS%' UNION SELECT nome, endereco, , cidade FROM tb_cliente WHERE UPPER(cidade) LIKE '%LINS%'; obs.: note que esta consulta funciona de forma similar ao google, pois localiza a palavra 'Lins' em qualquer campo.
138
UNION
13. Apresentar os itens do pedido nmero 1 e apresentar ao final da listagem o valor total do pedido.
select p.descricao, p.preco, p.preco i.qtde, p.preco*i.qtde total from produto p inner join itens i on p.cod_prod=i.cod_prod where i.cod_ped = 1 union all select 'total', null, null, null sum(p.preco*i.qtde) from produto p inner join itens i on cod_prod=i.cod_prod where i.cod_ped = 1 obs.: note que esta consulta funciona de forma similar ao google, pois localiza a palavra 'Lins' em qualquer campo.
139
origem destino
140
tb_voo(id,origem,destino,hr_partida,hr_chegada) tb_voo(id,origem,destino,hr_partida,hr_chegada) tb_voo(id,origem,destino,hr_partida,hr_chegada) tb_voo(id,origem,destino,hr_partida,hr_chegada) tb_voo(id,origem,destino,hr_partida,hr_chegada) tb_voo(id,origem,destino,hr_partida,hr_chegada) tb_voo(id,origem,destino,hr_partida,hr_chegada) tb_voo(id,origem,destino,hr_partida,hr_chegada) tb_voo(id,origem,destino,hr_partida,hr_chegada) tb_voo(id,origem,destino,hr_partida,hr_chegada)
VALUES(1,1,4,'08:45','09:25'); VALUES(2,1,4,'17:45','18:25'); VALUES(3,4,1,'10:00','10:40'); VALUES(4,4,1,'20:45','21:25'); VALUES(5,2,3,'11:15','11:25'); VALUES(6,3,2,'12:45','12:55'); VALUES(7,3,5,'14:05','15:10'); VALUES(8,5,3,'16:45','17:25'); VALUES(9,5,1,'08:45','09:25'); VALUES(10,1,5,'10:10','10:50');
142
Exerccios
1. 2. 3. 4. 5. Apresentar os aeroportos cadastrados. Apresentar o nome de cada aeroporto e a quantidade de voos que partem dele. Apresentar o nome de cada aeroporto e a quantidade de voos que chegam at ele. Apresentar o horrio de partida e de chegada dos voos que partem da cidade de So Paulo com destino ao Rio de Janeiro. Apresentar o nome do aeroporto de origem, o nome da cidade de origem, o nome do aeroporto de destino, o nome da cidade de destino, o horrio de partida e o horrio de chegada de todos os voos. Apresentar aeroporto e cidade de destino, horrio de partida e de chegada de todos os voos cuja origem seja 'Congonhas'. Apresentar aeroporto e cidade de origem, horrio de partida e de chegada de todos os voos cujo destino seja 'Santos Dumont'. Apresentar aeroporto e cidade de origem, horrio de partida e de chegada de todos os voos cuja destino seja o 'Rio de Janeiro'.
143
6. 7. 8.
144
Auto-relacionamento relacionamento
O auto-relacionamento, relacionamento, ou relacionamento recursivo, permite que uma tabela receba uma chave estrangeira dela prpria. Esse tipo de relacionamento permite um alto grau de flexibilidade nos sistemas. Em geral, o tratamento de relacionamento recursivo feito atravs de funes recursivas via linguagem de programao.
145
Auto-relacionamento relacionamento
PEAS id descricao preco N 1
CREATE TABLE tb_peca ( id integer not null, pai integer, descricao varchar(80), preco decimal(8,2), PRIMARY KEY(id), FOREIGN KEY(pai) REFERENCES tb_peca(id) );
146
Auto-relacionamento relacionamento
INSERT INSERT INSERT INSERT INSERT INSERT INSERT COMMIT; INTO INTO INTO INTO INTO INTO INTO tb_peca(id, tb_peca(id, tb_peca(id, tb_peca(id, tb_peca(id, tb_peca(id, tb_peca(id, pai, pai, pai, pai, pai, pai, pai, descricao, descricao, descricao, descricao, descricao, descricao, descricao, preco) preco) preco) preco) preco) preco) preco) VALUES(1, VALUES(2, VALUES(3, VALUES(4, VALUES(5, VALUES(6, VALUES(7, null, 'motor', 5000); 1, 'pisto', 2000); 1, 'vlvulas', 1500); 1, 'bloco', 3000); 4, 'cabeote', 1000); 4, 'cilindro', 1500); 4, 'carter', 1000);
147
SELECT LEVEL, id, descricao, preco FROM tb_peca CONNECT BY PRIOR id = pai START WITH id = 1;
CONNECT BY PRIOR faz a chamada recursiva na consulta START WITH define o registro inicial para a consulta LEVEL apresenta o nvel em que se encontra o registro
148
SELECT SYS_CONNECT_BY_PATH(id,'.') codigo, LEVEL, descricao, preco FROM tb_peca CONNECT BY PRIOR id = pai START WITH id = 1;
149
Exemplos de Recursividade
1 CONTAS id tipo N
CATEGORIAS id descricao N
CARGOS id nome N
1 id titulo acao
MENU N
150
VIEW
(viso)
Uma view uma tabela virtual gerada a partir de uma consulta, na qual as informaes so obtidas diretamente nas tabelas usadas nas consultas. Atualizando-se se os dados das tabelas de origem, automaticamente atualiza-se se a view. Tipos de Viso:
1. 2. 3. 4. 5.
Viso Idntica Viso por Seleo de Linhas Viso por Seleo de Colunas Viso por Seleo de Linhas e Colunas Viso por Juno de Tabelas
151
Tipos de Vises
viso idntica viso por seleo de linhas e colunas
Uma das vantagens da utilizao de view est na facilidade de se manipular dados originados de diferentes tabelas. Outra vantagem se relaciona a segurana, pois possvel 'ocultar' campos ou dados atravs da consulta. Vises geradas sem campos calculados podem ser usadas, inclusive, para fazer insero, alterao e excluso de dados.
153
Criao de Vises
CREATE VIEW
CREATE VIEW <nome_da_visao> AS <expresso_consulta>
Exemplo:
CREATE VIEW view_funcionario AS SELECT nome, cargo FROM funcionario;
View - Exemplo
Viso que possui nome, cargo e data de admisso dos funcionrios, mas que omite o campo salrio.
CREATE VIEW view_funcionario AS SELECT nome, cargo, dt_admissao FROM funcionario;
Para acessar uma view, , usamos o comando SELECT como se fosse uma tabela normal (inclusive via linguagem de programao)
SELECT * FROM view_funcionario; view_funcionario ou SELECT * FROM view_funcionario WHERE cargo='Gerente';
155
View - Exemplo
Tambm podemos restringir linhas de uma tabela ao gerar uma view. . Por exemplo, podemos permitir o acesso aos dados dos funcionrios, excetos aqueles que ocupem cargo de 'diretor'.
CREATE VIEW view_funcionario_filtro AS SELECT * FROM funcionario WHERE cargo <> 'Diretor';
Para acessar:
SELECT * FROM view_funcionario_filtro; view_funcionario_filtro
156
View - Exemplo
Podemos, ainda, criar vises que utilizem dados de mais de uma tabela. Por exemplo, para exibir a relao de funcionrios da empresa, com seus respectivos departamentos.
CREATE VIEW view_func_depto AS SELECT f.nome funcionario, funcionario d.nome departamento FROM funcionario f LEFT JOIN departamento d ON f.cod_depto = d.cod_depto; d.cod_depto
Agora para termos a listagem, trabalhamos como se s existisse uma tabela: view_func_depto SELECT * FROM view_func_depto;
157
View - Exemplo
Consultas com campos calculados tambm podem ser usados para criar uma view. Por exemplo, uma viso que apresentar a quantidade de funcionrio por departamento.
CREATE VIEW view_func_por_depto AS SELECT d.nome, , count(*) qtde FROM funcionario f INNER JOIN departamento d ON f.cod_depto = d.cod_depto GROUP BY d.nome;
View
Em resumo, qualquer consulta que possa ser criada pode ser usada para se criar uma view. O uso das vises permite facilitar o uso das consultas e permite criar restries de segurana.
159
160
2. Dar permisso para o usurio se conectar ao BD: GRANT CONNECT TO cliente_ID; cliente_ID 2. Dar permisso para o usurio poder consultar os dados da tabela produto; GRANT SELECT ON produto TO cliente_ID;
161
Se desejar, possvel dar permisso para atualizar a tabela (precisa conectar novamente como DBA) GRANT UPDATE ON produto TO cliente_ID; Se for permitir as 4 operaes, podemos usar: GRANT SELECT, INSERT, UPDATE, DELETE ON produto TO cliente_ID; cliente_ID ou GRANT ALL ON produto TO cliente_ID;
163
Revogar as permisses do cliente: REVOKE UPDATE, INSERT, DELETE ON produto FROM cliente_ID;
obs.: novamente, o cliente s pode fazer consultas.
164
SYNONYM
Para facilitar o acesso as tabelas criadas em diferentes esquemas, podemos criar sinnimos: CREATE PUBLIC SYNONYM produto_ID FOR SYSTEM.produto; Para testar, vamos conectar novamente com o usurio cliente_ID e fazer uma consulta agora usando o sinnimo criado: CONN cliente_ID / cliente; SELECT * FROM produto_ID; produto_ID
165
166
ROLE
Agora podemos criar diversos usurios com esse perfil:
CREATE USER vend1_ID IDENTIFIED BY senha; CREATE USER vend2_ID IDENTIFIED BY senha; CREATE USER vend3_ID IDENTIFIED BY senha; GRANT vendedor_ID TO vend1_ID, vend2_ID, vend3_ID; Automaticamente, todos os 3 vendedores possuem as mesmas permisses. Caso alguma mudana seja feito ao ROLE vendedor_ID, os usurios desse grupo recebero as modificaes.
167
Colunas Especiais
ROWNUM ROWID
168
169
ROWNUM
obs.: note que para cada linha retornada pela consulta, gerado um nmero nico.
170
ROWNUM
SELECT ROWNUM, cod_prod, cod_prod descricao, preco FROM produto ORDER BY descricao;
obs.: neste caso, a coluna ROWNUM ficar fora de ordem, pois ela gerada antes de executar a clusula ORDER BY. Como resolver? usando subconsulta!!!
SELECT ROWNUM, p.cod_prod, p.cod_prod p.descricao, p.preco FROM (SELECT cod_prod, descricao, descricao preco FROM produto descricao p; ORDER BY descricao)
171
ROWNUM
Mas, qual a utilidade de ROWNUM? Por exemplo, para gerar paginao de registros num sistemas para web. Para exibir os 10 primeiros registros, podemos usar:
SELECT ROWNUM, p.cod_prod, p.cod_prod p.descricao, p.preco FROM (SELECT cod_prod, descricao, descricao preco FROM produto ORDER BY descricao) ) p WHERE ROWNUM <= 10;
172
ROWNUM
Agora vamos listar a segunda pgina, com os registros de 11 a 20.
p.cod_prod p.descricao, p.preco SELECT ROWNUM, p.cod_prod, FROM (SELECT cod_prod, descricao, descricao preco FROM produto ORDER BY descricao) ) p WHERE ROWNUM BETWEEN 11 AND 20;
Resposta: nenhuma linha selecionada!!! Por qu? A clusula WHERE executada antes do ROWNUM!!!
173
ROWNUM
174
ROWNUM
Uma soluo mais elegante seria criar uma viso com a consulta anterior.
CREATE VIEW paginacao_produto AS SELECT ROWNUM limite, p.cod_prod, p.cod_prod p.descricao, p.preco FROM (SELECT cod_prod, descricao, descricao preco FROM produto ORDER BY descricao) ) p;
Para executar:
SELECT * FROM paginacao_produto WHERE limite BETWEEN 11 AND 20; Curiosidade: se fosse em MySQL, MySQL bastaria: SELECT * FROM produto LIMIT 10,10;
175
ROWID
ROWID gerado pelo Oracle ao inserir um novo registro. Pode ser usado para acessar um registro com maior velocidade ou para distinguir registros com dados repetidos.
CREATE TABLE tb_teste ( codigo integer, descricao varchar(40) (40) ); values 'teste'); insert into tb_teste values(1, insert into tb_teste values(1, values 'teste'); commit; Note que os 2 registros tem o mesmo valor de cdigo!
176
ROWID
Para apagar apenas um dos registros criados acima, ser necessrio utilizar a coluna ROWID:
Primeiro descobrimos qual o valor do ROWID do registro:
177
SEQUENCE
Objetos sequence so usados para a gerao automtica de chaves primrias.
CREATE SEQUENCE seq_produto START WITH 1 INCREMENT BY 1; INSERT INTO produto(cod_prod, descricao, preco) VALUES (seq_produto.NEXTVAL, 'iPad 3', 2500);
Se a tabela j possuir registros, deve-se deve criar o sequence com o valor da maior PK j existente. Para cada tabela que se deseja utilizar auto-incremento, auto deve-se se criar um novo sequence.
178
SEQUENCE
(cont.)
Para se saber quais sequences existem no BD, use: SELECT * FROM user_sequences; Para se obter o valor corrente do sequence, use: SELECT nome_sequence.CURRVAL FROM dual; Para alterar o valor de um sequence, use: ALTER SEQUENCE nome_sequence START WITH 100;
179
Sequence - Exemplos
Criar uma sequncia ascendente chamada serial, comeando por 101:
CREATE SEQUENCE serial START WITH 101 INCREMENT BY 1;
Se a funo nextval for chamada duas vezes no mesmo comando a sequncia ser incrementada duas vezes:
SELECT serial.nextval, serial.nextval FROM dual; 103 | 104
Para que a sequncia no seja incrementada duas vezes deve ser utilizada a funo currval na vez seguinte:
SELECT serial.nextval, serial.currval FROM dual; 105 | 105
180
INDEX
Os ndices so utilizados, principalmente, para melhorar o desempenho do banco de dados (embora a utilizao no apropriada possa resultar em uma degradao de desempenho). O ndice do banco de dados segue a mesma filosofia de um ndice de um livro: achar a informao que procura mais rapidamente. O comando CREATE INDEX constri o ndice nome_do_ndice na tabela especificada.
181
INDEX
um recurso usado pelo gerenciador de Banco de Dados para facilitar a busca de linhas dentro de uma tabela. ndice nico
ndice criado a partir da chave primria, no permite a incluso de linhas duplicadas
ndice de Performance
Facilita a busca de linhas na tabela, diminuindo o tempo de resposta.
INDEX Sintaxe:
CREATE [UNIQUE] INDEX <nome_indice> ON <nome_tabela> (<nome_coluna> [ASC / DESC])
Exemplo:
CREATE INDEX IDX_Cliente ON Cliente (Nome ASC)
INDEX
Estudos apontam que 80% das atualizaes de hardware por novos equipamentos seriam desnecessrios, bastando apenas o ajuste adequado do software. ATENO: O uso excessivo de indexao pode tornar o acesso lento!!!
Assim, deve-se se criar ndices apenas para tabelas com grande nmero de registros (alguns milhares, pelo menos) e para campos que sejam frequentemente utilizados em buscas.
DISTINCT
A clusula DISTINCT remove do resultado as linhas duplicadas. A utilizao do DISTINCT obriga a base de dados a executar a query em trs passos:
1. 2. 3. Criar um "result set" com todas as linhas que satisfazem o query como se este no tivesse DISTINCT; Ordenar as linhas resultantes para identificar e eliminar valores repetidos; Mostrar o resultado ao utilizador;
Com DISTINCT, a query fica mais pesada, pois requer o passo 2. Sem ordenao, o utilizador comearia a ver resultados logo que o primeiro conjunto de dados fosse identificado pela base de dados.
DISTINCT Exemplo
Exibir o nome de todos os clientes que tiveram vendas realizadas no ano de 2012. SELECT DISTINCT c.nome, c.telefone FROM cliente c INNER JOIN venda v ON c.cod_cli = v.cod_cli WHERE EXTRACT(YEAR FROM v.data) = 2012; Se a clusula DISTINCT no fosse utilizada, os clientes que tenham realizado mais de uma venda seriam listados em duplicidade.
186
IN
A clusul IN permite filtrar registros entre uma lista de opes. Ele funciona como o operador OR, mas permite, por exemplo, o uso de sub-consulta consulta no momento do filtro. Os clientes que j fizeram alguma venda em 2012.
SELECT c.cod_cli, c.nome, , c.telefone FROM cliente c WHERE c.cod_cli IN(SELECT v.cod_cli FROM venda v WHERE EXTRACT(YEAR FROM v.data)=2012); Apesar de mais prtico que o uso do operador OR, deve-se deve usar esse comando com cautela, pois seu desempenho no dos melhores.
187
EXISTS
O operador EXISTS frequentemente usado com subpesquisas correlatas. Ele testa quando um valor existe. (NOT EXISTS garante que no existe). Se o valor existir ser retornado TRUE, caso contrrio FALSE. A execuo da subconsulta interrompida assim que o primeiro valor for localizado.
SELECT c.cod_cli, c.nome, , c.telefone FROM cliente c WHERE EXISTS (SELECT cod_cli FROM venda v WHERE v.cod_cli = c.cod_cli) ORDER BY c.nome;
cod_venda data
VENDA
1..N
0..N
GRADE
cod_grade numeracao estoque
1..1 0..N
ITENS
qtde
CALADO
cod_calc modelo preco cor
0..N 1..1
CATEGORIA
cod_cat descricao
190
192
cod_venda data
VENDA
1..N
0..N
LOTE
num_lote validade estoque
1..1
ITENS
qtde
1..1
cod_tarja cor
TARJA
0..N
0..N
REMDIO
cod_rem nome preco bula
1..1 0..N
0..N 0..N
1..1 1..1
SIMILAR
cod_sim
LABORATRIO
cod_lab nome
193
Farmcia: Exerccios
1. 2. 3. 4. Apresentar o nome, tarja e laboratrio de todos os remdios. Apresentar os nomes dos remdios de tarja 'preta'. Apresentar a validade e estoque do remdio 'Anador'. Apresentar o nome dos remdios, que tenham estoque disponvel. 5. Apresentar o nome e a quantidade em estoque, independente da validade. 6. Apresentar todos os itens (remdio, validade, quantidade e valor) da venda nmero 1. 7. Apresentar o nome dos clientes com vendas de 'Aspirina'. 8. Apresentar os clientes que tenham com venda de 'Dorflex'. 9. Apresentar a quantidade de remdios vendidos agrupados pelo laboratrio. 10. Apresentar os remdios similares 'Anador'.
194
EMPRESTIMO
cod_empr data_emprestimo data_devolucao
1..1
1..N
EXEMPLAR
num_tombo edicao ano
1..1 0..N
1..1
1..N
EDITORA
cod_editora nome
LIVRO
cod_livro titulo
1..N
1..N
0..N
cod_ass descricao
LIVRO_ASS
ASSUNTO
relevancia
LIVRO_AUT
ordem
0..N
cod_autor nome
AUTOR
196
198
199
ALUGUEL
cod_alu data_aluguel data_devolucao
1..1
0..N
COPIA
num_copia
1..1 0..N
1..1
0..N
MIDIA
cod_midia descricao
FILME
1..1
0..N
cod_gen descricao
GENERO
1..N
PERSONAGEM
papel
0..N
cod_ator nome
ATOR
200
Locadora: Exerccios
1. 2. 3. 4. 5. 6. 7. 8.
(1/2)
Apresentar os ttulos dos filmes cadastrados. Apresentar o total de filmes cadastrados. Apresentar o total de cpias cadastradas. Apresentar o ttulo dos filmes e a respectiva quantidade de cpias. Apresentar todos os ttulos de filmes do gnero aventura. Apresentar os atores do filme 'Jornada nas Estrelas'. Apresentar o gnero do filme 'Batman'. Apresentar o nmero e tipo de mdia de todas as cpias do filme 'Harry Poter'. 9. Apresentar os clientes que j alugaram o filme 'Matrix'. 10. Apresentar os ttulos dos filmes que j foram emprestados pelo cliente 'Carlos'.
201
Locadora: Exerccios
(2/2)
11. Apresentar o ttulos dos filmes que esto alugados. 12. Apresentar o ttulo do filme mais emprestado. 13. Apresentar o nome de cada ator e a quantidade de filmes que atuou. 14. Apresentar o nome dos atores que j atuaram em mais de 3 filmes. 15. Apresentar o ttulo do filme mais antigo. 16. Apresentar o ttulo dos filmes e a quantidade de vezes que foram alugados. 17. Moficar o anterior exibindo os que tenham sido alugados mais de 10 vezes. 18. Apresentar os filmes do gnero 'romance' ou 'drama'. 19. Apresentar o ttulo dos filmes em que atuou 'Al Pacino'. 20. Apresentar a quantidade de aluguis realizados agrupados por ms.
202
Bibliografia
Livro Texto: 1. Introduo a Sistemas de Banco de Dados; Date, C. J.; Ed. Campus; 8 edio; 2004; 15 exemplares. 2. Sistemas de Banco de Dados; Korth, , Henry F.; Ed. Campus; 5 edio; 2006; 15 exemplares. 3. Projeto e Modelagem de Banco de Dados; Lightstone, Teorey; Ed. Campus; 1 edio; 2006; 10 exemplares. Complementar: 4. Oracle Database 11g PL/SQL: Programao; McLaughlin, Michel; Ed. Novatec; 1 edio; 2009; 10 exemplares. 5. Oracle 10g PL/SQL; Oliveira, Celso H. Poderoso de; Ed. Novatec; 1 edio; 2005; 10 exemplares. 6. Oracle 10g Database: Guia do DBA; Serson, Serson Roberto Rubinstein; Ed. Novatec; 1 edio; 2004; 10 exemplares. 7. Oracle 10g: Ideal Para Quem Deseja Iniciar o Aprendizado do Oracle; Ramalho, Jos A.; Ed. Thomson; ; 1 edio; 2005; 10 exemplares. 8. Gerenciando Banco de Dados: A Abordagem Entidade-Relacionamento Entidade para Projeto Lgico; Chen, Peter; Makron Books; 1 edio; 1990; 7 exemplares.
203