You are on page 1of 92

Projeto de Banco de Dados Linguagem SQL

Prof. Dr. Wagner J. Dizer


wagner@unilins.edu.br

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.

Conceitos de Banco de Dados

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

A Importncia de um 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.

Definio de Banco de Dados


Como o prprio nome sugere, um Banco de Dados (BD), muitas vezes tambm chamado de base de dados, pode ser definido como uma coleo organizada de dados inter-relacionados, cujo contedo informativo representa a qualquer instante, o estado de uma determinada aplicao. Como exemplos de BD podemos citar: filmes de uma locadora de vdeo; livros de uma biblioteca, clientes de uma empresa; alunos de uma escola.

Sistema Gerenciador de Banco de Dados


Um Sistema Gerenciador de Banco de Dados - SGBD (ou DBMS - Database Management System) consiste em um conjunto de dados inter-relacionados e em uma coleo de programas para prover o acesso aos dados. Tais sistemas incluem mdulos para consulta, atualizao e as interfaces entre o sistema e o usurio. Como exemplo de SGBDs temos:
Oracle SQL Server Firebird MySQL Access Postegre ...
7

Sistema de Banco de Dados


Um sistema de banco de dados formado pelo Banco de Dados, pelo SGBD, pelos usurios, e pelos equipamentos de hardware para armazenamento, processamento e comunicao de dados. Ou seja, um SBD formado por todos softwares, hardwares e peopleware envolvidos.

Estrutura Geral de um Sist. de Banco Dados


Usurio leigo Interface do Aplicativo Programador Programas Aplicativos Usurio de alto nvel Consultas DBA Esquema do Banco de Dados

Pr-compilador da linguagem de manipulao de dados Cdigo-objeto de programas aplicativos

Processador de Consultas

Compilador da Linguagem de Definio de Dados

Gerenciador de Banco de Dados

Sistema Gerenciador de Banco de Dados

Gerenciador de arquivos

Arquivo de dados

Dicionrio de dados

Disco de armazenamento

Oracle 11g

Instalao e Servios iSQLPlus Criao de um usurio DBA

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

Criao de um usurio DBA


Para utilizar o Oracle, necessrio possuir um usurio (ou uma conta) atravs da qual possvel se conectar ao banco de dados. Sintaxe: CREATE USER <usuario> IDENTIFIED BY <senha>; Para se poder criar um usurio, preciso estar conectado com privilgio de administrador (SYSTEM). CONN SYSTEM / ORACLE @ ORCL;
usurio senha banco
14

Criao de um usurio DBA

(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

Linguagem de Manipulao de Dados (DML)


INSERT UPDATE DELETE SELECT
17

Structured Query Language (SQL)


A Linguagem de Consulta Estruturada - SQL, uma poderosa linguagem-padro para definio, manipulao e recuperao de dados em um banco de dados relacional. Com ela possvel criar a estrutura de tabelas do banco, inserir, alterar e excluir dados, alm de sua funo mais importante que realizar consultas. Por ser padronizada, seus comandos funcionam em diversos SGBD, alm de poderem ser executados a partir de linguagens de programao.

18

Structured Query Language (SQL)


SQL mais do que uma linguagem de consulta:
Definio de dados Permite a definio da estrutura do banco de dados Recuperao de dados Possibilita a recuperao dos dados do banco Manipulao de dados Permite alteraes e excluses de dados j existentes, bem como a adio de novos dados Controle de acesso Fornece meios para determinar o controle de acesso de usurios aos dados do banco Compartilhamento de dados Coordena o acesso concorrente de usurios, assegurando que um no interfira no trabalho do outro Integridade de dados Permite definir restries de integridade aos dados do banco
19

Mdulos da Linguagem SQL


Basicamente, a linguagem SQL dividida em 2 mdulos:
DDL (Data Definition Language) DML (Data Manipulation Language)

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

Linguagem de Definio de Dados (DDL)


Instrues para definio do esquema da base de dados: CREATE TABLE
Cria uma nova tabela na base de dados, especificando nome, atributos e restries

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

Exemplos de Comandos DDL


1. Criar uma tabela para Produtos
CREATE TABLE tbl_produto ( codigo INTEGER NOT NULL, descricao VARCHAR(40) NOT NULL, preco Numeric(8,2), PRIMARY KEY(codigo) );

2. Verificar as tabelas criadas


SELECT * FROM USER_TABLES;
OU

SELECT * FROM CAT;

3. Verificar os campos de uma tabela


DESC tbl_produto;

11

Primary Key (PK)


A chave primria um campo especial utilizado para garantir o acesso individualizado a qualquer registro da tabela. Ou seja, a PK ser nica dentro de uma tabela. Por exemplo, numa escola possvel que tenhamos 2 alunos com o mesmo nome, mas cada um ter um ID nico (chave primria), que ir diferenci-los.

Exemplos de Comandos DDL


4. Renomear uma tabela
RENAME tbl_produto TO produto;

(cont.)

5. Renomear o nome de um campo na tabela


ALTER TABLE produto RENAME COLUMN codigo TO cod_prod;

6. Adicionar um novo campo na tabela


ALTER TABLE produto ADD estoque VARCHAR(5);

7. Modificar o tipo de um campo


ALTER TABLE produto MODIFY estoque Integer;

12

Exemplos de Comandos DDL


8. Apagar um campo da tabela
ALTER TABLE produto DROP COLUMN estoque;

(cont.)

9. Criar uma tabela baseada numa consulta


CREATE TABLE temp_produto AS SELECT * FROM produto;

10. Apagar uma tabela


DROP TABLE temp_produto;

11. Recuperar uma tabela apagada (somente Oracle 10g+)


FLASHBACK TABLE temp_produto TO BEFORE DROP;

12. Remover a tabela da lixeira (somente Oracle 10g+)


SELECT * FROM CAT; PURGE TABLE "BIN$DnTf1Og5RT6LRpQ+N78PwQ==$0";

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

Linguagem de Manipulao de Dados (DML)


Instrues para a manipulao de dados na base de dados: INSERT
Permite a incluso de novos registros na tabela

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

INSERT Incluso de dados


A clusula INSERT usada para incluir dados numa tabela.

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

Exemplos de incluso de dados


1. Incluir caneta com preo igual a R$ 2.50 na tabela produto
INSERT INTO produto VALUES(1, caneta, 2.50);

2. Incluir lpis sem lanar seu preo na tabela produto


INSERT INTO produto(cod_prod,descricao) VALUES(1,lpis);

3. Confirmar a incluso dos produtos


COMMIT;

4. Cancelar a incluso dos produtos


ROLLBACK;

5. Cadastrar 5 produtos, respeitando a PK. ...

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

UPDATE Alterao de dados


A clusula UPDATE usada para alterar dados numa 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.

Exemplos de alterao de dados


1. Atualizar o preo do lpis para R$ 1.20
UPDATE produto SET preco = 1.20 WHERE descricao = lpis;

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

Exemplos de alterao de dados


2. Atualizar em 10% o preo de caneta
UPDATE produto SET preco = preco + preco * 0.10 WHERE descricao = caneta;

3. Descontar 50 centavos dos produtos que custem acima de 10 reais


UPDATE produto SET preco = preco 0.50 WHERE preco > 10.00;

4. Aumentar em 5% o preo de todos os produtos


UPDATE produto SET preco = preco * 1.05;

DELETE Excluso de dados


A clusula DELETE usada para excluir dados de uma tabela.
Sintaxe: DELETE FROM <tabela> WHERE <condio>;

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

Exemplos de excluso de dados


1. Excluir o produto lpis
DELETE FROM produto WHERE descricao = lpis;

2. Excluir o produto de cdigo 3


DELETE FROM produto WHERE cod_prod = 3;

3. Excluir os produtos com os cdigos 1, 3 e 5


DELETE FROM produto WHERE cod_prod IN (1,3,5);

4. Excluir os produtos com preo abaixo de R$ 1.00


DELETE FROM produto WHERE Preco < 1.00;

5. Excluir todos os produtos


DELETE FROM produto;

Consultas Instruo SELECT


Talvez, a clusula SELECT seja a instruo mais importante da linguagem SQL. , sem dvidas, um comando extremamente poderoso, capaz de buscar informaes no banco de dados e gerar relatrios complexos com poucas linhas de cdigo.
Sintaxe: SELECT <campo1> [,<campo2>, <campo3>] FROM <tabela1> [,<tabela2>, <tabela3>] WHERE <condio1> [and <condio2>];

18

Exemplos de Consultas
1. Consultar a descrio e o preo dos Produtos
SELECT descricao, preco FROM produto;

2. Consultar todos os campos da tabela Produto


SELECT * FROM produto;

3. Consultar os produtos ordenados alfabeticamente pela descrio


SELECT * FROM produto ORDER BY descricao;

4. Consultar os produtos ordenados decrescentemente pelo preo


SELECT * FROM produto ORDER BY preco DESC;

5. Consultar os produtos que custem acima de R$ 10.00


SELECT * FROM produto WHERE preco > 10;

Exemplos de Consultas

(cont.)

6. Apresentar os produtos que custem entre 5 e 25 reais


SELECT * FROM produto WHERE preco >= 5 AND preco <= 25;
ou

SELECT * FROM produto WHERE preco BETWEEN 5 AND 25;

7. Apresentar o preo do produto caneta


SELECT preco FROM produto WHERE descricao = caneta;

8. Apresentar a descrio de todos os produtos em maisculas


SELECT UPPER(descricao), preco FROM produto;

9. Apresentar os produtos com descrio iniciada por ca


SELECT * FROM produto WHERE descricao LIKE ca%;

10. Solicitar a descrio de um produto e consultar seu preo


SELECT * FROM produto WHERE descricao LIKE %&X%;

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

Funes SQL predefinidas


Os comandos bsicos SQL so aprimorados por vrias funes predefinidas, que facilitam a realizao de consultas. Basicamente, servem para manipular:
String Nmeros Data/Hora, e Converses de tipos.

41

Funes para manipular Strings

UPPER LOWER INITCAP CONCAT LENGTH TRIM REPLACE SUBSTR

- 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

TRIM (LTRIM, RTRIM)


Remove espaos em branco no incio e final da string.

_____________
SELECT TRIM( Wagner ) FROM dual;

Resp.:

Wagner

_____________
SELECT TRIM(nome) FROM cliente;

Resp.:

Jose Mario Mariadelia Ricardo

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.:

Jose Mario Mariadelia Ricardo

(14) 3533.3267 (18) 3788.7789 (14) 9677.6611


49

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

Funes de Data e Hora

SYSDATE TO_DATE TO_CHAR EXTRACT LAST_DAY ADD_MONTH

- 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

Obtm uma data somando/subtraindo dias

_____________
SELECT SYSDATE+7 FROM dual;

Resp.:

10/02/12

_____________
SELECT SYSDATE-1 FROM dual;

Resp.:

02/02/12
57

TO_DATE

Converte uma string em data

_____________
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

Alguns formatos so:


YY, YYYY MM, MON, MONTH DD D, DY, DAY DDD HH, HH24 MI SS CC RM ano com 2 ou 4 dgitos ms 1-12, abreviado ou por extenso dia 1-31 dia da semana 1-7, abreviado, extenso dia do ano 1-366 hora 1-12 ou 0-23 minutos 0-59 segundos 0-59 sculo ms em romano I-XII
59

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.:

Guilherme Airton Felipe

2001 1999 2002

60

30

LAST_DAY

Retorna o ltimo dia do ms.

_____________
SELECT LAST_DAY(01/03/2012) FROM dual;

Resp.:

31/03/2012

61

ADD_MONTHS

Adiciona um determinado nmero de meses para uma data.

_____________
SELECT ADD_MONTHS(01/03/2012,2) FROM dual;

Resp.: 01/05/2012

62

31

Consultas em 2 tabelas

63

Chaves: Primria e Estrangeira


As chaves so usadas para garantir integridade num banco de dados. Aps sua definio, o prprio SGBD se encarrega de fazer as validaes. A chave primria (PK), como j vimos, define um identificador nico para cada tupla. Seu uso garante que no havero 2 registros com valores repetidos na tabela. S possvel criar uma chave primria por tabela. Mas possvel criar chaves primrias compostas por 2 ou mais campos. A chave estrangeira (FK) garante que a informao inserida no campo seja consistente. Ou seja, no permitido gravar um valor na chave estrangeira se esse valor no existir na tabela referenciada. Uma tabela pode ter diversas chaves estrangeiras, cada uma referenciando sua tabela de origem.

64

32

Diagrama de Classes

DEPARTAMENTO cod_depto Nome ramal

0..N

1..1

trabalha

FUNCIONARIO cod_Func nome salrio cargo data_admissao

Script das Tabelas


CREATE TABLE departamento ( cod_depto integer not null, nome varchar(30), ramal varchar(10), PRIMARY KEY(cod_depto) );

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

FUNCIONARIO cod_depto Nome 1 Luiz 4 Paulo 4 Julio 3 Rafael 3 Adalberto 4 Durval

...

Cadastro de Deptos e Funcionrios


Cadastrar os departamentos:
Marketing, Produo, Informtica e Vendas

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)

Cadastrar 10 funcionrios distribudos pelos departamentos.


68

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;

3. Apresentar departamento em que trabalha o funcionrio Paulo.


SELECT F.nome, D.nome FROM funcionario F INNER JOIN departamento D ON F.cod_depto = D.cod_depto WHERE F.nome = Paulo;

70

35

Consultas em 2 tabelas

(cont.)

4. Apresentar os funcionrios que trabalhem em Vendas ou Produo.


SELECT F.nome, D.nome FROM funcionario F INNER JOIN departamento D ON F.cod_depto = D.cod_depto WHERE D.nome IN (Vendas,Produo);

5. Apresentar os funcionrios do departamento de Vendas, com salrio superior a R$ 1.000,00.


SELECT F.nome, D.nome FROM funcionario F INNER JOIN departamento D ON F.cod_depto = D.cod_depto WHERE D.nome = Vendas AND F.salario > 1000.00;
71

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

Cadastro de Produtos e Categorias


Em nossa base de dados j possumos uma tabela de produtos. Mas, vamos imaginar que a quantidade de produtos cadastrados tenha crescido significativamente. Para facilitar a busca por produtos, poderamos colocar cada produto vinculado a uma categoria. Para isso, pode-se criar uma tabela de categorias de produtos:
CREATE TABLE categoria ( cod_cat integer not null, descricao varchar(30), PRIMARY KEY(cod_cat) );

73

Cadastro de Produtos e Categorias

(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

Cadastro de Produtos e Categorias

(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

Cadastro de Produtos e Categorias

(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

Cadastro de Produtos e Categorias

(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

Cadastro de Produtos e Categorias

(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

INNER JOIN LEFT JOIN RIGHT JOIN FULL JOIN

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

Comparao entre os tipos de JOIN


No possvel afirmar que um tipo de instruo JOIN seja melhor que outro. preciso analisar qual a informao desejada e utilizar a instruo adequada.

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

ESTUDO DE CASO: Controle de Vendas


Modelar um sistema para controle de vendas realizadas por clientes, registrando-se a data da realizao e os produtos solicitados por cada cliente. Um cliente pode realizar diversas vendas; cada venda pertence a um nico cliente; numa mesma venda possvel solicitar um ou mais produtos; cada produto pode ser inserido em diferentes vendas; cada produto pertence a uma categoria; cada venda realizada por um funcionrio; cada funcionrio trabalha em um departamento.
89

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.

Scripts SQL para criar as tabelas


ALTER TABLE venda ADD( cod_func integer, FOREIGN KEY(cod_func) REFERENCES funcionario );

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

Estrutura no Banco de Dados


Cod_Cli 001 002 004 008 012 CLIENTE Nome Renan Correia Fernando Sinicatto Mariana Bedoni Ricardo Gerdes Fabiana Pires ...

VENDA Cod_Vend Cod_Cli 1 001 2 004 3 001 5 008


ITENS Cod_Vend Cod_Prod 1 AA 1 BB 1 FF 2 AA 2 DD 3 AA 5 FF

Data 15/06/2004 15/06/2004 16/06/2004 18/06/2004

PRODUTO Cod_Prod Descrio AA Caneta BB Lpis DD Disquete FF Impressora

Preo R$ 1,50 R$ 0,80 R$ 1,20 R$ 180,00

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

COUNT SUM MAX MIN AVG

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

Exemplos da funo COUNT


1. Apresentar a quantidade de funcionrios cadastrados
SELECT COUNT(*) FROM Funcionario;

2. Apresentar a quantidade de funcionrios com cargo de gerente.


SELECT COUNT(*) FROM Funcionario WHERE Cargo = Gerente;

3. Apresentar a quantidade de funcionrios que trabalham no departamento de marketing.


SELECT COUNT(*) FROM Funcionario F INNER JOIN Depto D ON F.Cod_Depto = D.Cod_Depto WHERE D.Nome = Marketing;

100

50

Exemplos da funo SUM


1. Apresentar a somatria dos salrios de todos funcionrios.
SELECT SUM(Salario) FROM Funcionario;

2. A soma dos salrios dos funcionrios com cargo de gerente.


SELECT SUM(Salario) FROM Funcionrio WHERE Cargo=Gerente;

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

Exemplos da funo MAX


1. Apresentar o valor do maior salrio pago pela empresa.
SELECT MAX(Salario) FROM Funcionario;

2. Apresentar o maior salrio entres os funcionrios com cargo de gerente.


SELECT MAX(Salario) FROM Funcionrio WHERE Cargo=Gerente;

3. Apresentar o maior salrio pago no departamento de Vendas.


SELECT MAX(Salario) FROM Funcionario F, Depto D WHERE F.Cod_Depto = D.Cod_Depto AND

D.Nome = Vendas;

4. Apresentar o nome e o salrio do funcionrio mais bem remunerado.


SELECT Nome, Salario FROM Funcionario WHERE Salrio = (SELECT MAX(Salario) FROM Funcionario);
102

51

Exemplos da funo MIN


1. Apresentar o valor do menor salrio pago pela empresa.
SELECT MIN(Salario) FROM Funcionario;

2. Apresentar o menor salrio entres os funcionrios com cargo de gerente.


SELECT MIM(Salario) FROM Funcionrio WHERE Cargo=gerente;

3. Apresentar o menor salrio pago no departamento de Vendas.


SELECT MIN(Salario) FROM Funcionario F, Depto D WHERE F.Cod_Depto = D.Cod_Depto AND

D.Nome = Vendas;

4. Apresentar o nome e o salrio do funcionrio mais mal remunerado.


SELECT Nome, Salario FROM Funcionario WHERE Salrio = (SELECT MIN(Salario) FROM Funcionario);
103

Exemplos da funo AVG


1. Apresentar a mdia salarial da empresa.
SELECT AVG(Salario) FROM Funcionario;

2. Apresentar a media salarial entres os funcionrios com cargo de gerente.


SELECT AVG(Salario) FROM Funcionrio WHERE Cargo=gerente;

3. Apresentar a mdia salarial paga no departamento de Vendas.


SELECT AVG(Salario) FROM Funcionario F, Depto D WHERE F.Cod_Depto = D.Cod_Depto AND

D.Nome = Vendas;

4. Apresentar o nome de cada departamento e a respectiva mdia salarial de cada setor.


SELECT D.Nome, AVG(F.Salario) FROM Funcionario F, Depto D WHERE F.cod_depto = D.cod_depto GROUP BY D.Nome;
104

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

21. 22. 23.

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.

31. 32. 33.

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

41. 42. 43. 44.

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

UNION UNION ALL

112

56

UNION e UNION ALL


As instrues UNION e UNION ALL servem para gerar como resultado a unio de 2 ou mais consultas. As consultas podem usar dados das mesmas tabelas ou obter os dados de diferentes fontes, desde que a quantidade (e o tipo) de colunas das consultas sejam iguais. A diferena entre UNION e UNION ALL que o comando UNION ignora registros repetidos. Em contrapartida, a instruo UNION ALL mais rpida.

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')) );

Cadastrar 5 mdicos e 5 enfermeiros.


114

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;

obs.: agora teremos uma coluna que identifica o tipo de profissional.

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;

obs.: apenas um nico order by deve ser utilizado.


118

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;

obs.: a clusula WHERE executada para cada select.


119

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

Tabelas com duplo relacionamento


Em alguns casos, necessrio que 2 classes possuam 2 relacionamentos entre si. o caso de sistemas para controle de voos:

125

Tabelas com duplo relacionamento


CREATE TABLE tb_aeroporto ( id integer not null primary key, nome varchar(40), cidade varchar(40) ); CREATE TABLE tb_voo ( id integer not null primary key, hr_partida varchar(10), hr_chegada varchar(10), origem integer, destino integer, FOREIGN KEY(origem) REFERENCES tb_aeroporto(id), FOREIGN KEY(destino) REFERENCES tb_aeroporto(id) );
126

63

Tabelas com duplo relacionamento


INSERT INTO INSERT INTO INSERT INTO INSERT INTO INSERT INTO COMMIT; INSERT INTO INSERT INTO INSERT INTO INSERT INTO INSERT INTO INSERT INTO INSERT INTO INSERT INTO INSERT INTO INSERT INTO COMMIT; tb_aeroporto(id,nome,cidade) tb_aeroporto(id,nome,cidade) tb_aeroporto(id,nome,cidade) tb_aeroporto(id,nome,cidade) tb_aeroporto(id,nome,cidade) VALUES(1,'Congonhas','So Paulo'); VALUES(2,'Cumbica','Guarulhos'); VALUES(3,'Viracopos','Campinas'); VALUES(4,'Galeo','Rio de Janeiro'); VALUES(5,'Santos Dumond','Rio de Janeiro');

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

viso por seleo de linhas

viso por juno de tabelas

viso por seleo de colunas

Vantagens do uso de VIEW

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>

onde, <expresso_consulta> qualquer consulta SQL vlida.

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;

Para acessar: SELECT * from view_func_por_depto;


139

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

Usurios, Grupos e Permisses

CREATE USER CREATE ROLE GRANT REVOKE SYNONYM

141

USER criao de novos usurios


1. Como criar um novo usurio: CREATE USER cliente_ID IDENTIFIED BY cliente;
obs.: neste momento, o usurio j foi criado, mas no tem nenhuma permisso no banco de dados, nem mesmo para se conectar.

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

USER criao de novos usurios


Para testar, vamos fazer logout e se conectar com o novo usurio que criamos: CONN cliente_ID / cliente; SELECT * FROM tbl_produto;
ERRO: tabela no encontrada Por qu? Como agora estamos conectados com outro usurio, precisamos informar o esquema onde se encontra a tabela:

SELECT * FROM SYSTEM.produto;


onde, SYSTEM o nome do usurio que criou a tabela.
143

GRANT concedendo as permisses


Agora, tente alterar o preo de um produto.
No ser possvel pois o usurio no possui permisso.

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

REVOKE revogando as permisses

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

ROLE grupos de usurios


Podemos, tambm, criar grupos de usurios (ROLES - papis) e conceder privilgios a partir dos grupos.
H alguns grupos j criados automaticamente, como o caso do ROLE chamado DBA, que possui a maioria das permisses do sistema. CREATE ROLE vendedor_ID; GRANT CONNECT TO vendedor_ID; GRANT SELECT ON view_funcionario TO vendedor_ID; GRANT SELECT, INSERT ON venda TO vendedor_ID; GRANT ALL ON itens TO vendedor_ID;

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

Colunas especiais: ROWNUM e ROWID


As colunas ROWNUM e ROWID so criadas automaticamente pelo Oracle (especfico do Oracle) e podem ser usadas como campos auxiliares.
ROWNUM uma coluna gerada dinamicamente a cada consulta executada e apresenta um nmero sequencial (independente da PK). ROWID uma espcie de chave primria criada automaticamente pelo SGBD.

Veremos cada uma delas a seguir:

150

75

ROWNUM

SELECT ROWNUM, cod_prod, descricao, preco FROM produto;

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

A soluo novamente trabalhar com subconsulta:


SELECT * FROM (SELECT ROWNUM limite, p.descricao, p.preco FROM (SELECT cod_prod, descricao, preco FROM produto ORDER BY descricao) p) WHERE limite BETWEEN 11 AND 20;

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:

SELECT ROWID,codigo,descricao FROM tb_teste;


Depois, apagamos o registro usando o ROWID:

DELETE FROM tb_teste WHERE ROWID = '???';

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

Loja de Calados: Estudo de Caso


Elaborar um diagrama de classes para uma loja de calados. O sistema dever armazenar os modelos de calados e controlar seu estoque. Cada calado dever possuir: modelo, descrio e cor. Cada calado possui uma categoria (ex.: sapato, tenis, sandlia, etc.). Cada calado possui uma marca/fabricante. Cada calado possui, ainda, uma grade* com diversos tamanhos (numerao). A cada venda realizada deve-se registrar: a data da venda, o cliente para quem foi vendido e os itens vendidos.
* O conceito de grade permite que produtos de diferentes dimenses (numerao ou medidas) possam ser cadastrados uma nica vez.
169

Loja de Calados: Diagrama de Classes


CLIENTE
cod_cli nome endereco cidade telefone
0..N 1..1

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

Loja de Calados: Exerccios


1. 2. 3. Apresentar os modelos, cores e tipos de todos os calados. Apresentar os modelos de calados do tipo sandlia. Apresentar a numerao e estoque dos calados modelo 'prime executive' na cor 'preta'. 4. Apresentar o modelo e cor dos calados nmero 38, que tenham estoque disponvel. 5. Apresentar o modelo, a cor e a quantidade em estoque, independente da numerao. 6. Apresentar todos os itens (modelo, cor, nmero, quantidade e valor) da venda nmero 1. 7. Apresentar o nome dos clientes com vendas de calados nmero 38. 8. Apresentar os clientes que com vendas do calado modelo 'prime executive' na cor 'preta'. 9. Apresentar a quantidade de pares vendidos agrupados pela numerao. 10. Apresentar a quantidade de pares vendidos agrupados pela categoria.
171

Farmcia: Estudo de Caso


Elaborar um diagrama de classes para uma farmcia. O sistema dever armazenar os medicamentos e controlar seu estoque. Cada medicamento dever possuir: nome, bula e preo. Cada medicamento possui um classificao (ex.: tarja preta, tarja vermelha, etc). Cada medicamento possui um laboratrio/fabricante. O estoque de cada medicamento deve ser feito por lote de validade. A cada venda realizada deve-se registrar: a data da venda, o cliente para quem foi vendido e os itens vendidos.

172

86

Farmcia: Digrama de Classes


CLIENTE
cod_cli nome endereco cidade telefone
0..N 1..1

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

Biblioteca: Estudo de Caso


Modelar um sistema para controle do acerca da biblioteca da Unilins. O sistema deve permitir o cadastro de todo acervo de livros. De cada livro deve-se saber: ttulo, autores, editora, ano de publicao e edio. Cada livro possui um ou mais exemplares. Cada exemplar possui um nmero de tombo. O sistema deve permitir consultar livros pelo ttulo, autor ou assunto. Um livro pode possuir diversos assuntos. Cada assunto pode ter um ou mais livros. preciso registrar, tambm, os emprstimos feitos ao aluno, guardando a data de retirada e data de devoluo.
175

Biblioteca: Diagrama de Classes


ALUNO
cod_cli nome endereco cidade telefone
0..N 1..1

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

Campo de imagem no banco de dados

Foto da capa do livro, do tipo BLOB


Vantagem: maior segurana e privacidade; Desvantagem: Ocupa mais espao no banco.

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

Biblioteca: Exerccios (1/2)


1. 2. 3. 4. Apresentar os ttulos dos livros cadastrados. Apresentar o total de ttulos cadastrados. Apresentar o total de exemplares cadastrados. Apresentar o ttulo dos livros e a respectiva quantidade de exemplares. 5. Apresentar todos os ttulos de livros sobre o assunto banco de dados. 6. Apresentar os autores do livro 'Sistemas de Banco de Dados'. 7. Apresentar os assuntos relacionados ao livro 'Sistemas de Banco de Dados'. 8. Apresentar tombo, edio, ano e editora de todos os exemplares do livro 'Sistemas de Banco de Dados'. 9. Apresentar os alunos que j emprestaram o livro 'Sistemas de Banco de Dados'. 10. Apresentar os ttulos dos livros que j foram emprestados pelo aluno 'Arnon'.
178

89

Biblioteca: Exerccios (2/2)


11. Apresentar o ttulos dos livros que esto emprestados. 12. Apresentar o ttulo do livro mais emprestado. 13. Apresentar o nome de cada autor e a quantidade de livros publicados. 14. Apresentar o nome dos autores que j publicaram mais de 3 livros. 15. Apresentar o ttulo do livro mais antigo do acervo. 16. Apresentar o ttulo dos livros e a quantidade de vezes que foram emprestados. 17. Moficar o anterior exibindo os que tenham sido emprestados mais de 10 vezes. 18. Apresentar os livros sobre 'SQL' ou 'Banco de Dados'. 19. Apresentar o ttulo dos livros escritos por 'Paulo Coelho'. 20. Apresentar a quantidade de emprstimos realizados agrupados por ms.

179

Locadora: Estudo de Caso


Elaborar a modelagem de um sistema para controle de uma locadora. Deve-se armazenar toda coleo de filmes. De cada filme deve-se saber: ttulo, gnero, ano de lanamento e durao. Cada filme possui uma ou mais cpias. Cada cpia possui uma mdia, que pode ser em DVD, Blu-Ray ou VHS. O sistema deve permitir consultar os filmes pelo ttulo, gnero ou atores. Num filme atuam diversos atores, que atuam com um ou mais personagens. preciso registrar os emprstimos realizados aos clientes, guardando a data de emprstimo e data de devoluo dos filmes.

180

90

Locadora: Diagrama de Classes


CLIENTE
cod_cli nome endereco cidade telefone
0..N 1..1

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

cod_filme titulo ano duracao

FILME

1..1

0..N

cod_gen descricao

GENERO

1..N

PERSONAGEM

papel

0..N

cod_ator nome

ATOR

181

Locadora: Exerccios (1/2)


1. 2. 3. 4. 5. 6. 7. 8. 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'.

182

91

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.

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