Professional Documents
Culture Documents
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, 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 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, pode instalar a verso completa do Oracle 11g. O disco de instalao tem cerca de 600Mb. Para mquinas mais antigas, recomenda-se 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 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
10
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
21
11
(cont.)
12
(cont.)
Instrues DDL
Como vimos, 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. Outros comandos DDL sero vistos posteriormente.
26
13
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.
27
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.
14
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 seqncia 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.
30
15
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;
16
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.
17
18
Exemplos de Consultas
1. Consultar a descrio e o preo dos Produtos
SELECT descricao, preco FROM produto;
Exemplos de Consultas
(cont.)
19
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.
39
Exerccios
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 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. 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. Apresentar os clientes residentes em 'Lins'. 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.
40
20
41
- 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
42
21
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.
43
LOWER
Converte uma string para minscula. _____________
SELECT LOWER(Unilins) FROM dual; Resp.: unilins
_____________
SELECT LOWER(nome) FROM cliente; Resp.: jose mario mariadelia ricardo
44
22
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
45
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
46
23
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
47
_____________
SELECT TRIM( Wagner ) FROM dual;
Resp.:
Wagner
_____________
SELECT TRIM(nome) FROM cliente;
Resp.:
48
24
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,-,.) 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) FROM dual;
Resp.:
lins
50
25
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
51
ABS
Retorna o valor absoluto.
_____________
Select ABS(-5) From Dual;
Resp.: 5
CEIL
Arredonda para o prximo valor inteiro.
_____________
Select CEIL(1.7) From Dual;
Resp.: 2
52
26
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
53
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
54
27
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
55
- data atual do servidor - converte para data - converte para string - extrai o ano, ms ou dia - ltimo dia do ms - soma meses numa data
56
28
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 FROM dual;
Resp.:
02/02/12
57
TO_DATE
_____________
SELECT TO_DATE(Fevereiro 03, 2006, Month DD, YYYY) FROM dual;
Resp.:
03/02/12
58
29
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.:
60
30
LAST_DAY
_____________
SELECT LAST_DAY(01/03/2012) FROM dual;
Resp.:
31/03/2012
61
ADD_MONTHS
_____________
SELECT ADD_MONTHS(01/03/2012,2) FROM dual;
Resp.: 01/05/2012
62
31
Consultas em 2 tabelas
63
64
32
Diagrama de Classes
0..N
1..1
trabalha
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) );
33
Estrutura da Tabelas
cod_depto 1 2 3 4 DEPARTAMENTO nome Marketing Produo Informtica Vendas ramal 111 222 333 444
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)
34
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;
69
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;
70
35
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.
72
36
73
(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;
74
37
(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;
75
(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;
76
38
(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.
77
(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;
78
39
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.
79
6. 7.
Tipos de juno
80
40
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.
81
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) 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 localizar todos os funcionrios, mesmo aqueles que no estejam vinculados a nenhum setor.
82
41
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 LEFT JOIN e invertendo a ordem das tabelas na clusula FROM.
83
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;
84
42
INNER JOIN
LEFT JOIN
RIGHT JOIN
FULL JOIN
85
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.
86
43
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
VENDA
cod_venda data
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.
87
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.
44
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
45
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 );
92
46
Qtde 5 2 1 1 8 3 2
47
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.
95
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.
96
13.
14.
15.
16.
17.
18.
19.
20.
48
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.
97
22.
23. 24.
25.
26.
27.
28.
29. 30.
Funes de Agrupamento
98
49
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
99
100
50
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;
101
D.Nome = Vendas;
51
D.Nome = Vendas;
D.Nome = Vendas;
52
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.
1. Apresentar o nome de cada departamento e a respectiva quantidade de funcionrios.
SELECT D.nome, COUNT(*) FROM funcionario F INNER JOIN depto D ON F.cod_depto = D.cod_depto GROUP BY D.nome;
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;
105
HAVING
A clusula HAVING funciona de forma parecida com o WHERE, mas executada depois da clusula GROUP BY.
1. 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;
106
53
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.
107
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.
108
13.
14.
15.
16.
17. 18.
19.
20.
54
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.
109
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.
110
55
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.
111
45.
46.
47.
48.
49.
50.
Unio de consultas
112
56
113
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')) );
57
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 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.
115
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, nome, sexo FROM tb_enfermeiro;
116
58
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, nome, sexo, NULL FROM tb_enfermeiro;
obs.: note que no possvel usar a clusula UNION se o nmero de campos das consultas for diferente.
117
UNION
4. Apresentar a mesma resposta do exerccio anterior, 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, nome, sexo, NULL FROM tb_enfermeiro ORDER BY nome;
59
UNION
5. 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, nome, sexo FROM tb_enfermeiro WHERE sexo = 'M' ORDER BY nome;
UNION
6. 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, nome, sexo FROM tb_enfermeiro WHERE sexo = 'F' ORDER BY nome;
120
60
UNION
7. 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, nome, sexo FROM tb_enfermeiro;
121
UNION
8. Apresentar os mdicos que sejam 'pediatra' ou do sexo 'feminino.
SELECT crm, nome, sexo, especialidade 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)
122
61
UNION
9. Apresentar a relao de clientes e funcionrios.
SELECT 'cliente' tipo, nome FROM cliente UNION ALL SELECT 'funcionario' tipo, nome FROM funcionario;
123
UNION
10. 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.
124
62
125
63
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');
127
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'.
128
6. 7. 8.
64
Auto-relacionamento
O auto-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.
129
Auto-relacionamento
CREATE TABLE tbl_pecas ( cod_pai integer not null, cod_filho integer, descricao varchar(80), preco decimal(8,2), PRIMARY KEY(cod_pai), FOREIGN KEY(cod_filho) REFERENCES tbl_pecas(cod_pai) );
130
65
Auto-relacionamento
INSERT INTO tbl_pecas(cod_pai, cod_filho, VALUES(1, null, 'motor', 5000); INSERT INTO tbl_pecas(cod_pai, cod_filho, VALUES(2, 1, 'pisto', 2000); INSERT INTO tbl_pecas(cod_pai, cod_filho, VALUES(3, 1, 'virabrequim', 1500); INSERT INTO tbl_pecas(cod_pai, cod_filho, VALUES(4, 1, 'bloco', 3000); INSERT INTO tbl_pecas(cod_pai, cod_filho, VALUES(5, 4, 'cabeote', 1000); INSERT INTO tbl_pecas(cod_pai, cod_filho, VALUES(6, 4, 'cilindro', 1500); INSERT INTO tbl_pecas(cod_pai, cod_filho, VALUES(7, 4, 'carter', 1000); commit;
131
descricao, preco) descricao, preco) descricao, preco) descricao, preco) descricao, preco) descricao, preco) descricao, preco)
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 os dados das tabelas de origem, automaticamente atualiza-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
132
66
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.
134
67
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; ou SELECT * FROM view_funcionario WHERE cargo='Gerente';
136
68
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;
137
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, d.nome departamento FROM funcionario f LEFT JOIN departamento d ON f.cod_depto = d.cod_depto;
Agora para termos a listagem, trabalhamos como se s existisse uma tabela: SELECT * FROM view_func_depto;
138
69
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.
140
70
141
2. Dar permisso para o usurio se conectar ao BD: GRANT CONNECT TO cliente_ID; 2. Dar permisso para o usurio poder consultar os dados da tabela produto; GRANT SELECT ON produto TO cliente_ID;
142
71
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; ou GRANT ALL ON produto TO cliente_ID;
144
72
Revogar as permisses do cliente: REVOKE UPDATE, INSERT, DELETE ON produto FROM cliente_ID;
obs.: novamente, o cliente s pode fazer consultas.
145
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;
146
73
147
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.
148
74
Colunas Especiais
ROWNUM ROWID
149
150
75
ROWNUM
obs.: note que para cada linha retornada pela consulta, gerado um nmero nico.
151
ROWNUM
SELECT ROWNUM, 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.descricao, p.preco FROM (SELECT cod_prod, descricao, preco FROM produto ORDER BY descricao) p;
152
76
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.descricao, p.preco FROM (SELECT cod_prod, descricao, preco FROM produto ORDER BY descricao) p WHERE ROWNUM <= 10;
153
ROWNUM
Agora vamos listar a segunda pgina, com os registros de 11 a 20.
SELECT ROWNUM, p.cod_prod, p.descricao, p.preco FROM (SELECT cod_prod, 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!!!
154
77
ROWNUM
155
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.descricao, p.preco FROM (SELECT cod_prod, 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, bastaria: SELECT * FROM produto LIMIT 10,10;
156
78
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) ); insert into tb_teste values(1, 'teste'); insert into tb_teste values(1, 'teste'); commit; Note que os 2 registros tem o mesmo valor de cdigo!
157
ROWID
Para apagar apenas um dos registros criados acima, ser necessrio utilizar a coluna ROWID:
Primeiro descobrimos qual o valor do ROWID do registro:
158
79
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 criar o sequence com o valor da maior PK j existente. Para cada tabela que se deseja utilizar auto-incremento, deve-se criar um novo sequence.
159
SEQUENCE
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;
160
80
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.
161
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.
81
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 criar ndices apenas para tabelas com grande nmero de registros (alguns milhares, pelo menos) e para campos que sejam frequentemente utilizados em buscas.
82
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.
166
83
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 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 usar esse comando com cautela, pois seu desempenho no dos melhores.
167
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;
84
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
170
85
172
86
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
LABORATRIO
cod_lab nome
173
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 pela tarja. 10. Apresentar a quantidade de remdios vendidos agrupados pelo laboratrio.
174
87
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
ASSUNTO
cod_ass descricao
LIVRO_ASS
relevancia
LIVRO_AUT
ordem
0..N
cod_autor nome
AUTOR
176
88
Foto da capa do livro, do tipo varchar(100) (nesse campo colocamos a URL (caminho) da foto)
Vantagem: ocupa pouco espao no BD. Desvantagem: menos segurana por ter que armazenar as fotos na URL indicada, acessvel ao usurio final.
177
89
179
180
90
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
181
182
91
183
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, 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 para Projeto Lgico; Chen, Peter; Makron Books; 1 edio; 1990; 7 exemplares.
184
92