Você está na página 1de 203

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, Serson Roberto Rubinstein; Ed. Novatec; 1 edio; 2004; 10 exemplares. 7. Oracle 10g: Ideal Para Quem Deseja Iniciar o Aprendizado do Oracle; Ramalho, Jos A.; Ed. Thomson; ; 1 edio; 2005; 10 exemplares. 8. Gerenciando Banco de Dados: A Abordagem Entidade-Relacionamento Entidade para Projeto Lgico; Chen, Peter; Makron Books; 1 edio; 1990; 7 exemplares.

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; 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 inter 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, 2GHertz pode instalar a verso completa do Oracle 11g. . O disco de instalao tem cerca de 600Mb. Para mquinas mais antigas, recomenda-se recomenda o uso do Oracle 11g Express Edition. . A configurao mnima 256Mb e 1GHertz. O instalador tem cerca de 250Mb.

Obs.: Somente a verso 11g Express Edition gratuita para uso comercial (limitado a 1 base de dados de 4Gb).
11

Instalao e Servios

(cont.)

Afim de carregar o Oracle somente quando realmente desejar utiliz-lo, coloque os 3 servios listados a seguir para serem iniciados manualmente.
ORACLESERVICE - o principal servio. Efetivamente, esse o SGBD e consome bastante recursos do sistema. TNSLISTERNER responsvel por fazer a comunicao entre as chamadas (consultas) ao B.D. e o servio do SGBD. ISQLPLUS o servio que disponibiliza o programa iSQLPlus para realizar a conexo ao Oracle atravs de browser (11g).

Para localizar os servios, que na instalao so colocados para iniciar automaticamente, procure em:
INICIAR / CONFIGURAES / PAINEL DE CONTROLE / FERRAMENTAS ADMINISTRATIVAS / SERVIOS

12

iSQLPlus

http://<servidor>:<porta>/isqlplus http://ANDROMEDA:5560/isqlplus

13

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

Instrues DDL
As instrues DDL manipulam a estrutura do banco de dados. Comandos DDL no podem ser desfeitos. Por isso, necessrio usar esses comando com cautela e ateno, pois descuidos podem implicar na perda de informaes importantes do sistema. Em geral, os comandos DDL so bastante utilizados na criao inicial do banco de dados. Posteriormente, somente ajustes e/ou alteraes na estrutura do sistema implicaro em usar esses comandos. Alguns comandos DDL sero vistos a seguir.

21

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
22

Principais Tipos de Campos


Tipo de dados
VARCHAR2(n [byte|char])

Descrio
Armazena uma cadeia de caracteres de comprimento varivel. O valor mximo de n so 4000 bytes. O Oracle s guarda o que o utilizador introduzir no preenchendo o que falta para o limite n. Se usarmos BYTE n traduz o nmero de bytes; Armazena uma cadeia de caracteres de comprimento varivel em formato UNICODE. O valor n representa o nmero mximo de caracteres. Um caracter pode ocupar 2 bytes se usarmos AL16UTF16 encoding ou 3 bytes para UTF8 encoding. O valor mximo so 4000 bytes. O Oracle s guarda o que o utilizador introduzir no preenchendo o que falta para o limite n; Caracteres de comprimento fixo n. O valor por omisso 1 sendo o valor mximo 2000. A base de dados ocupa sempre n caracteres pois preenche o que falta com espaos em branco; Nmero em virgula flutuante com 38 digitos significativos de preciso; Nmero inteiro com 'n' digitos de preciso. Mximo de 38; Nmero com n digitos sendo d casas dcimais ( direita da virgula); Data desde 1 Jan de 4712 AC at 31 de Dez de 9999 DC. Tambm armazenada a hora, minuto e segundo. O calendrio interno da base de dados tem em conta as alteraes de calendrio impostas ao longo do tempo, por exemplo a passagem do calendrio Juliano para Gregoriano em 1582-10-05, 1582 onde foram eliminados 10 dias; Datas desde 1 Jan de 1970 com hora, minuto, segundo e centsima de segundo. Num casos armazenada a referncia para o fuso horrio e noutro usado o fuso horrio local; . Armazena at 4Gb em formato binrio Binary Large Object. Character Large Object. . Armazena at 4Gb de texto

NVARCHAR2(n)

CHAR(n [byte|char]) NUMBER NUMBER(n) NUMBER(n,d) DATE TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE BLOB CLOB

23

Principais Tipos de Campos


Exemplos:
NUMBER(4) NUMBER(8,2) VARCHAR2(100) CHAR(80) Armazena nmeros at 4 dgitos: 9999 Nmero com a mscara: 99999.99

(cont.)

Cadeia de caracteres com comprimento mximo de 100 caracteres mas pode ter menos. Cadeia de caracteres de comprimento fixo 80. Se o valor introduzido tiver 10 caracteres, o espao que sobra preenchido com brancos.

Notas: Os tipos VARCHAR2 e NUMBER so nativos apenas em ORACLE. Por isso, usaremos VARCHAR, INTEGER e DECIMAL. Dessa forma, nosso scripts estaro dentro do padro SQL Ansi e funcionaro para qualquer SGBD. Isso no ocasionar nenhuma mudana ao Oracle, pois ele ir substituir automaticamente esses campos por seus respectivos tipos nativos.
VARCHAR(n) INTEGER DECIMAL(n,d)
VARCHAR2(n) NUMBER NUMBER(n,d)
24

Campo de imagem no banco de dados

Foto do tipo BLOB


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

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

25

Exemplos de Comandos DDL


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

2. Verificar as tabelas criadas


SELECT * FROM USER_TABLES;
OU

SELECT * FROM CAT;

3. Verificar os campos de uma tabela


DESC tbl_produto;

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 uma Chave Primria (PK)


ALTER TABLE produto ADD PRIMARY(cod_prod);

7. Adicionar um novo campo na tabela


ALTER TABLE produto ADD estoque VARCHAR(5);

8. Modificar o tipo de um campo


ALTER TABLE produto MODIFY estoque Integer;

Exemplos de Comandos DDL


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

(cont.)

10. Criar uma tabela baseada numa consulta


CREATE TABLE temp_produto AS SELECT * FROM produto;

11. Apagar uma tabela


DROP TABLE temp_produto;

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


FLASHBACK TABLE temp_produto TO BEFORE DROP;

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


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

Definio de Restries
CHECK
Permite criar validaes para um campo Ex.: sexo char(1), check(sexo in('M','F'))

DEFAULT
Atribuir valor padro, se o campo no for preenchido Ex.: uf char(2) default 'SP'

UNIQUE
No permite valores duplicados para um campo Ex.: cpf varchar(18) unique

PRIMARY KEY
Chave primria, garante valor nico para o campo Ex.: Numa escola, cada aluno tem um nmero de matrcula nico.

FOREIGN KEY
Chave estrangeira, garante integridade com a tabela de origem do campo Ex.: Numa venda, verifica se o cdigo do cliente informado valido.

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

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.

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

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;

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.

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;

Transao
Uma transao:
uma sequncia de comandos que forma uma unidade lgica de processamento no banco de dados. um conjunto de operaes que leva o banco de dados de um estado consistente para outro estado consistente. Requer que todas as operaes sejam executadas de forma indivisvel.

Exemplos:
Transferncia Bancria Saque em Terminal de Cash Compra com Pagamento no Carto de Crdito Compra de Passagem Area

Transao Transferncia Bancria


Transferir 100 reais da conta 123 para a conta 456. Essa operao realizada em 3 etapas:
Debitar 100 reais da conta de origem 123 Creditar 100 reais na conta de destino 456 Confirmar a transao

1.

UPDATE tb_saldo SET saldo = saldo 100 WHERE num_conta = 123; UPDATE tb_saldo SET saldo = saldo + 100 WHERE num_conta = 456; COMMIT;

2.

3.

Caso ocorra um erro (como uma queda de energia) antes da execuo do COMMIT, automaticamente, o comando ROLLBACK executado e aborta toda a transao.
39

COMMIT e ROLLBACK
Ao executar uma instruo DML, as informaes so armazenadas inicialmente numa rea temporria. O comando COMMIT serve para confirmar a gravao dos dados na rea definitiva. ROLLBACK serve para cancelar a execuo da ltima sequncia de comandos DML (transao). Caso nenhum dos 2 comandos seja executado e a aplicao seja finalizada, o comando ROLLBACK realizado (exceto se o aplicativo estiver configurado para fazer COMMIT automtico) Comandos DDL executam implicitamente o COMMIT.
40

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>];

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

Exerccios
1. Alterar a estrutura da tabela de produtos adicionando o campo estoque com valor padro zero. 2. Atualizar a quantidade em estoque de todos os produtos para 100 unidades. 3. Cadastrar o produto 'Gravador de DVD', com preo de R$ 120,00 e estoque igual a 15 unidades. 4. Atualizar o estoque de 'Gravador de DVD' de 15 para 14 unidades. 5. Atualizar o preo do 'Gravador de DVD' aumentando seu valor em 10%. 6. Atualizar o preo de 'Gravador de DVD' para R$ 110,00 e a quantidade em estoque para 50. 7. Atualizar o preo dos produtos que custem at 500 reais abaixando os preos em 5%. 8. Excluir o registro de 'Gravador de DVD'. 9. Remover o campo estoque da tabela de produtos. 10. Apagar a tabela de produtos.
44

Exerccios
1. 2. 3. 4. 5. 6. 7. 8. 9. Criar uma tabela de clientes com os campos: cod_cli, nome, endereo, cidade e telefone. Cadastrar 5 clientes. Alterar o telefone do cliente 'Wagner' para '(14) 3533-3200'. 3533 Listar todos os clientes cadastrados. Listar todos os clientes classificados alfabeticamente pelo nome. Listar todos os clientes classificados decrescentemente pelo nome. Listar todos os clientes classificados pelo cdigo Listar todos os clientes ordenados pela cidade Listar todos os clientes ordenados primeiro pela cidade, depois pelo nome.

10. Apresentar os clientes residentes em 'Lins'.


45

Exerccios
1. 2. 3. 4. 5. 6. 7. 8. 9.

(cont.)

Apresentar os clientes que residam em 'Lins' ou 'Marlia'. Apresentar os dados do cliente 'Wagner'. Apresentar os dados dos clientes cujo nome comece por 'Wa'. Apresentar os clientes cujo nome termine com 'r'. Apresentar os clientes que contenham a slaba 'ne' no nome. Adicionar o campo data_nasc do tipo date na tabela de cliente. Preencher os aniversrios dos clientes. Apresentar os clientes que nasceram antes de 1990. Apresentar os clientes nascidos em dezembro, ordenados pela data de nascimento.

10. Apresentar os clientes que nasceram no ms atual.

46

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.

47

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

48

UPPER
Converte uma string para maiscula. _____________
SELECT UPPER('Unilins') FROM dual; Resp.: UNILINS

_____________
SELECT UPPER(nome) FROM cliente; Resp.: JOSE MARIO MARIADELIA RICARDO
Nota: A tabela DUAL contm apenas uma coluna e uma linha e criada automaticamente pelo Oracle.
49

LOWER
Converte uma string para minscula. _____________
SELECT LOWER('Unilins') FROM dual; Resp.: unilins

_____________
SELECT LOWER(nome) FROM cliente; Resp.: jose mario mariadelia ricardo

50

INITCAP
Retorna o primeiro caractere de cada palavra em maisculo e os demais caracteres em minsculo. _____________
SELECT INITCAP('wagner DIZERO') FROM dual; Resp.: Wagner Dizero

_____________
SELECT INITCAP(nome) FROM cliente; Resp.: Jose Mario Mariadelia Ricardo

51

CONCAT ( || )
Concate duas strings em uma nica. _____________
SELECT CONCAT('Wagner', 'DIZERO') FROM dual; SELECT 'Wagner' || 'Dizero' FROM dual; Resp.: Wagner Dizero

_____________
SELECT nome || '-' ' || cidade FROM cliente; Resp.: Jose Mario Lins Mariadelia Cafelndia Ricardo - Ponga

52

LENGTH
Retorna o comprimento da string medido em caracteres. _____________
SELECT LENGTH('Wagner') FROM dual; Resp.: 6

_____________
SELECT nome, LENGTH(nome) FROM cliente; Resp.: Jose Mario 10 Mariadelia 10 Ricardo 7

53

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

54

REPLACE
Troca uma substring por outra a cada ocorrncia na string principal.

_____________
SELECT REPLACE('1,20', ',', '.') FROM dual;

Resp.:

1.20

_____________
SELECT nome, REPLACE(telefone,'-','.') REPLACE(telefone,' FROM cliente;

Resp.:

Jose Mario Mariadelia Ricardo

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


55

SUBSTR
Retorna uma substring.

_____________
SELECT SUBSTR('Unilins',0,3) FROM dual;

Resp.:

Uni

_____________
SELECT SUBSTR('Unilins',3,4) FROM dual;

Resp.:

ilin

_____________
SELECT SUBSTR('Unilins',-4,4) SUBSTR('Unilins', FROM dual;

Resp.:

lins

56

Funes Numricas
ABS CEIL FLOOR MOD POWER ROUND SQRT TRUNC - valor absoluto - arredonda para cima - arredonda para baixo - resto da diviso - potncia - arredonda - raiz quadrada - trunca o valor

57

ABS
Retorna o valor absoluto.

_____________
Select ABS(-5) 5) From Dual;

Resp.: 5

CEIL
Arredonda para o prximo valor inteiro.

_____________
Select CEIL(1.7) From Dual;

Resp.: 2

58

FLOOR
Arredonda o valor para baixo.

_____________
Select FLOOR(1.7) From Dual;

Resp.: 1

MOD
Retorna o resto de uma diviso.

_____________
Select MOD(11,4) From Dual;

Resp.: 3
59

POWER
Retorna x elevado a y, onde x o primeiro parmetro e y o segundo.

_____________
Select POWER(5,3) From Dual;

Resp.: 125

ROUND
Arredonda para o valor mais prximo.

_____________
Select ROUND(1.666,2) From Dual;

Resp.: 1,67
60

SQRT
Retorna a raiz quadrada.

_____________
Select SQRT(2) From Dual;

Resp.:

1.41421356

TRUNC
Retorna o valor truncado.

_____________
Select TRUNC(1.999,1) From Dual;

Resp.: 1.9
61

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

62

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 1 FROM dual;

Resp.:

02/02/12
63

TO_DATE

Converte uma string em data

_____________
SELECT TO_DATE('Fevereiro 03, 2006', 'Month DD, YYYY') FROM dual;

Resp.:

03/02/12

64

TO_CHAR
Converte uma data para string. Podem ser usados diferentes formatos

_____________
SELECT TO_CHAR(SYSDATE,'DD/MM/YY HH:MI:SS') FROM dual;

Resp.:

03/02/12 - 03:01:30

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, 12, abreviado ou por extenso dia 1-31 dia da semana 1-7, 1 abreviado, extenso dia do ano 1-366 1 hora 1-12 12 ou 0-23 0 minutos 0-59 59 segundos 0-59 59 sculo ms em romano I-XII I
65

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

66

LAST_DAY

Retorna o ltimo dia do ms.

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

Resp.:

31/03/2012

67

ADD_MONTHS

Adiciona um determinado nmero de meses para uma data.

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

Resp.: 01/05/2012

68

Consultas em 2 tabelas

69

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.
*tupla = registro ou linha
70

Diagrama de Classes

DEPARTAMENTO 0..N cod_depto Nome ramal trabalha

1..1

FUNCIONARIO cod_Func nome salrio cargo data_admissao

Representao da Cardinalidade
UML
DEPARTAMENTO 0..N
1..1

FUNCIONARIO

Peter Chen

DEPARTAMENTO

FUNCIONARIO

Oracle

DEPARTAMENTO

FUNCIONARIO

Microsoft

DEPARTAMENTO

FUNCIONARIO

OBS.: Existem diferentes modelos para representar a cardinalidade no


relacionamento entre duas classes. Recomendo que, independente da metodologia, procure entender qual classe depende da outra para ser criada.

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

Dependncia de Dados da FK
Quando se cria uma chave estrangeira, o SGBD no permite que um registro pai seja apagado se este tiver filhos, pois isso geraria registros rfos. Por exemplo, no permitido apagar um departamento que tenha funcionrios cadastrados, pois esses funcionrios perderiam o vnculo com seu respectivo departamento. Por isso, preciso primeiro apagar todos os filhos (funcionrios) para depois poder apagar o registro pai (departamento).

Dependncia de Dados da FK

(cont.)

Uma alternativa definir que os registros filhos devem ser apagados em cascata. Mas ateno: por questes de segurana, esse recurso dever ser usado com cautela.
CREATE TABLE funcionario ( cod_func integer not null, cod_depto integer, nome varchar(40), salario numeric(8,2), cargo varchar(30), data_admissao date, PRIMARY KEY(cod_func), FOREIGN KEY(cod_depto) REFERENCES departamento(cod_depto) ON DELETE CASCADE );

Estrutura da Tabelas
DEPARTAMENTO nome Marketing Produo Informtica Vendas

cod_depto 1 2 3 4

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.


77

Consultas em 2 tabelas
1. Apresentar o nome de cada funcionrio e o respectivo departamento em que trabalha.
SELECT funcionario.nome, departamento.nome FROM funcionario, departamento WHERE funcionario.cod_depto = departamento.cod_depto; ou SELECT funcionario.nome, departamento.nome FROM funcionario INNER JOIN departamento ON funcionario.cod_depto = departamento.cod_depto; ou SELECT F.nome, D.nome FROM nuncionario F INNER JOIN departamento D ON F.cod_depto = D.cod_depto;
78

Consultas em 2 tabelas
2. Apresentar os funcionrios do departamento de 'Vendas'.
SELECT F.nome, D.nome FROM funcionario F INNER JOIN departamento D ON F.cod_depto = D.cod_depto WHERE D.nome = 'Vendas';

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

79

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;
80

Exerccios
1. Apresentar o departamento e o ramal do funcionrio 'Luiz'. 2. Apresentar o nome e o departamento dos funcionrio com cargo de gerente. 3. Apresentar o nome, cargo e departamento dos funcionrios admitidos a partir de 15/01/2011. 4. Apresentar o nome, cargo e departamento dos funcionrios admitidos entre 2007 e 2010. 5. Apresentar o nome, cargo e departamento dos funcionrios admitidos no ano atual. 6. Apresentar o nome, cargo e salrio dos funcionrios com salrio acima de R$ 5.000,00. 7. Apresentar o nome, cargo, salrio e depto dos funcionrios admitidos em 2010 e 2012.
81

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 se criar uma tabela de categorias de produtos:
CREATE TABLE categoria ( cod_cat integer not null, descricao varchar(30), PRIMARY KEY(cod_cat) );

82

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;

83

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;
84

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;

85

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.

86

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;

87

Exerccios
1. 2. 3. 4. 5. Apresentar a descrio do produto, preo do produto e descrio da categoria de todos os produtos cadastrados. Apresentar a descrio do produto, preo e categoria dos produtos que custem at R$ 50,00. Apresentar a descrio e preo dos produtos que sejam da categoria 'Informtica'. Apresentar a categoria a qual pertence o produto 'Impressora'. Elaborar uma consulta para apresentar os produtos que pertenam as categorias material de escritrio ou informtica e que custem entre 80 e 100 reais. Apresentar os produtos que no sejam da categoria eletroeletrnico. Apresentar o cdigo, a descrio, o preo e a categoria de todos os produtos ordenados pelo preo.
88

6. 7.

Tipos de juno

INNER JOIN LEFT JOIN RIGHT JOIN FULL JOIN

89

INNER JOIN
Realiza a juno de 2 tabelas retornando apenas os registros que tenham vnculo nas 2 tabelas. Exemplo: SELECT f.nome, d.nome FROM funcionario f INNER JOIN departamento d ON f.cod_depto = d.cod_depto;
Obs.: Se houver algum departamento sem funcionrios ou algum funcionrio que no esteja vinculado a um departamento, no ser exibido.

90

LEFT JOIN
Realiza a juno de 2 tabelas retornando todos os registros da tabela a esquerda, mesmo daqueles sem ligao.
INSERT INTO funcionario(cod_func,cod_depto,nome,salario cod_func ) VALUES(10, null, , 'Ivan', 5000); SELECT f.nome, d.nome FROM funcionario f LEFT JOIN departamento d ON f.cod_depto = d.cod_depto; Por exemplo, para gerar a folha de pagamento, deve-se deve localizar todos os funcionrios, mesmo aqueles que no estejam vinculados a nenhum setor.
91

RIGHT JOIN
A clusula RIGHT JOIN funciona de forma similar ao LEFT JOIN, porm retorna todos os registros da tabela a direita da clusula FROM.
SELECT f.nome, d.nome FROM funcionario f RIGHT JOIN departamento d ON f.cod_depto = d.cod_depto; Todos os departamento sero apresentados, mesmo aqueles que no tenham nenhum funcionrio vinculado.

O mesmo resultado pode ser obtido utilizando-se utilizando LEFT JOIN e invertendo a ordem das tabelas na clusula FROM.
92

FULL JOIN

A clusula FULL JOIN retorna todos os registros de ambas as tabelas, mesmo os registros que no tenham ligao entre as chaves.
SELECT f.nome, d.nome FROM funcionario f FULL JOIN departamento d ON f.cod_depto = d.cod_depto;

93

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

94

Exerccios
1. Apresentar a descrio, preo e categoria de todos os produtos, independente da categoria a que pertena. 2. Apresentar a descrio, preo e categoria de todos os produtos que custem at R$ 500,00. 3. Apresentar a descrio e o preo de todos os produtos da categoria 'Material de Escritrio'. 4. Apresentar a descrio, preo e categoria de todos os registros cadastrados. 5. Apresentar a descrio e o preo de todos os produtos sem categoria cadastrada.

95

Trabalho
1.

(individual ou em dupla)

Baseado no diagrama de classes abaixo, criar as tabelas com as respectivas chaves primrias e estrangeira.
CLIENTE
cod_cli nome endereco cidade telefone
0..N 1..1

cod_venda data

VENDA

2. 3. 4. 5.

Cadastrar 10 vendas com diferentes datas e para diferentes clientes. Criar uma consulta que apresente o cdigo da venda, a data da venda, o nome do cliente e a cidade do cliente. Incluir no resultado da consulta os telefones dos clientes. Modificar a consulta para que sejam exibidos apenas clientes que residam em 'Lins'.
96

Trabalho
6.

(cont.)

Apresentar a relao de clientes para os quais foram realizadas vendas na data de 10/03/2012. 7. Apresentar a relao de clientes para os quais foram realizadas vendas entre os dias 1 e 15 de maro de 2012. 8. Apresentar a relao de clientes para os quais foram realizadas vendas no ano de 2012. 9. Apresentar a relao de clientes para os quais foram realizadas vendas na data de hoje. 10. Apresentar a relao de clientes que residam em Lins e que foram realizadas vendas na ltima semana. 11. Apresentar a relao de clientes para os quais nenhuma venda foi realizada. 12. Apresentar a relao de clientes para os quais nenhuma venda foi realizada nos ltimos 30 dias.

ESTUDO DE CASO: Controle de Vendas


Modelar um sistema para controle de vendas realizadas por clientes, registrando-se 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.
98

Diagrama de Classes
DEPARTAMENTO
cod_depto nome ramal
0..N 1..1

FUNCIONARIO
cod_func nome data_admissao cargo salrio
0..N

CATEGORIA
cod_cat descricao
0..N 1..N 0..N 1..1

CLIENTE
cod_cli nome endereco cidade telefone

0..N

1..1

1..1

cod_venda data

VENDA

PRODUTO
cod_prod descricao preco estoque

ITENS

qtde

Relacionamento N para N
Banco de dados relacionais no conseguem mapear diretamente um relacionamento N para N. Ento criada uma nova tabela e so feitos 2 relacionamentos 1 para N. Tabelas geradas atravs de um relacionamento N para N sempre iro possuir chave primria composta. Essa PK composta utiliza as 2 FKs e, eventualmente, tambm outros campos.

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

101

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

Consulta em mais de 2 tabelas


Para consultar dados em mais de 2 tabelas basta fazer a ligao (JOIN) entre todas as tabelas necessrias.
Por exemplo, para apresentar os clientes que j foram atendidos pelo vendedor Joo, devemos usar 3 tabelas: cliente, venda e funcionrio. SELECT c.nome, c.telefone FROM cliente c INNER JOIN venda v ON c.cod_cli = v.cod_cli INNER JOIN funcionario f ON f.cod_func = v.cod_func WHERE f.nome = 'Joo'; Note que no possvel ligar diretamente funcionrio e cliente, pois no existe relacionamento (direto) entre essas duas tabelas, por isso usada a tabela de venda como ponte.

Exerccios
1. 2.

Apresentar o ramal telefnico do departamento de 'produo'. Apresentar o nome dos funcionrios que ocupem o cargo de 'gerente'. Apresentar os funcionrios que tenham sido admitidos at a data de '25/10/2004'. Apresentar os funcionrios que tenham sido admitidos entre '01/01/2003' e '31/12/2006'. Apresentar os clientes da cidade de 'Lins'. Apresentar os produtos cuja descrio inicie com 'di'. Apresentar o preo e o estoque atual do produto 'pen drive'. Apresentar os produtos com estoque abaixo de 5 unidades. Apresentar o nmero das vendas realizadas no dia '27/09/2005'. Apresentar o nmero das vendas realizadas no ms de 'agosto de 2006'.
105

3.

4.

5. 6. 7. 8. 9. 10.

11. 12.

Apresentar os dias em que a cliente 'Paula' realizou vendas. Apresentar o nome dos clientes que realizaram vendas no dia '17/02/2004'. Apresentar o nome dos clientes residentes em 'Lins' que realizaram pedidos no dia de hoje. Apresentar o nome e telefone dos clientes que tenham realizado pedidos no ano de '2006'. Apresentar o nome dos funcionrios que realizaram vendas no dia de hoje. Apresentar o nome, cargo e salrio dos funcionrios que trabalham no departamento de 'contabilidade'. Apresentar os funcionrios do departamento de 'informtica' admitidos no ms de 'janeiro de 2006'. Apresentar o nome do departamento e o ramal telefnico no qual trabalha o funcionrio 'Carlos'. Apresentar os produtos com preo entre R$ 1,50 e R$ 3,00 que tenham sido comercializados no dia 12/10/2006'. Apresentar os clientes com sobrenome 'Silva' e que tenham vendas hoje.
106

13.

14.

15.

16.

17.

18.

19.

20.

21.

Apresentar a descrio do produto, preo unitrio e quantidade dos itens solicitados referentes venda de nmero 1. Apresentar a descrio, preo, quantidade e subtotal dos itens da venda de nmero 1. Apresentar os clientes que tenham comprado 'notebook'. Apresentar os clientes que tenham comprado 'caneta', 'caderno' ou 'lapiseira' no ms de 'fevereiro de 2005'. Apresentar os produtos que j foram comprados pelo cliente 'Andr'. Solicitar a descrio de um produto e apresentar o nome de todos os clientes que j tenham comprado o mesmo. Apresentar os clientes que j foram atendidos pela funcionria 'Andrea'. Apresentar o nome dos funcionrios que j atenderam o cliente 'Renan'. Apresentar os produtos vendidos pelo vendedor 'Ricardo'. Apresentar os clientes de 'Cafelndia' que tenha sido vendido 'teclado' em 'novembro de 2006'.
107

22.

23. 24.

25.

26.

27.

28.

29. 30.

Funes de Agrupamento

COUNT SUM MAX MIN AVG

108

Funes de Agrupamento
A linguagem SQL oferece 5 funes de agregao:

COUNT
Conta a quantidade de registros localizados

SUM
Soma o total dos valores contidos em um campo

MAX
Retorna o maior valor de um campo

MIN
Retorna o menor valor de um campo

AVG
Retorna a mdia dos valores de um campo
109

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

110

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

111

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 INNER JOIN Depto D ON F.Cod_Depto = D.Cod_Depto WHERE 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);
112

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 INNER JOIN Depto D ON F.Cod_Depto = D.Cod_Depto WHERE 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);
113

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 INNER JOIN Depto D ON F.Cod_Depto = D.Cod_Depto WHERE D.Nome = 'Vendas';

4. Apresentar o nome dos fucionrios com salrio acima da mdia.


SELECT F.nome FROM Funcionario F WHERE F.salario > (SELECT AVG(Salario) FROM Funcionario);
114

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;

115

GROUP BY

(cont.)

2. Apresentar o nome de cada departamento e a respectiva despesa com folha de pagamento de cada setor.
SELECT D.Nome, SUM(Salario) FROM funcionario F INNER JOIN depto D ON F.cod_depto = D.cod_depto GROUP BY D.nome;

3. Apresentar o nome de cada departamento e a respectiva quantidade de funcionrios, somatria dos salrios e mdia salarial.
SELECT D.nome, COUNT(*), SUM(F.salario), AVG(F.salario) FROM funcionario F INNER JOIN depto D ON F.cod_depto = D.cod_depto GROUP BY D.nome;
116

HAVING
Depois que os registros so agrupados com GROUP BY, HAVING determina quais registros so exibidos.
semelhante a WHERE, que determina quais registros so selecionados. uma clusula opcional. S pode ser usada em parceria com GROUP BY

SELECT ... FROM ... GROUP BY ... HAVING ...

HAVING
1. Apresentar o nome de cada departamento com a respectiva quantidade de funcionrios, apenas dos departamentos com mais de 5 funcionrios.
SELECT D.nome, COUNT(*) qtde FROM funcionario F INNER JOIN depto D ON F.cod_depto = D.cod_depto GROUP BY D.nome HAVING COUNT(*) > 5;

2. Apresentar o nome de cada departamento com o respectivo valor gasto com folha de pagamento somente dos departamentos que gastem mais de 10 mil reais.
SELECT D.nome, SUM(F.salario) total FROM funcionario F INNER JOIN depto D ON F.cod_depto = D.cod_depto GROUP BY D.nome HAVING SUM(F.salario) ) > 10000.00;
118

EXERCCIOS:

Elaborar as instrues SQL para realizar as seguintes consultas baseadas em funes de agrupamento.

1. 2. 3. 4. 5.

Apresentar a quantidade de clientes da empresa. Apresentar a quantidade de produtos. Apresentar a quantidade de vendas realizadas. Apresentar a quantidade de clientes residentes em 'Lins'. Apresentar a quantidade de funcionrios com salrio entre R$ 350,00 e R$ 500,00. Apresentar a quantidade de produtos em falta (sem estoque). Apresentar a quantidade de vendas realizadas pelo funcionrio 'Alexandre'. Apresentar o nome do funcionrio e a quantidade de vendas realizadas por cada um. Solicitar o nome de um cliente e apresentar a quantidade de vendas realizadas para ele. Apresentar o nome do depto e a quantidade de funcionrios apenas daqueles que tenham pelo menos 3 funcionrios.
119

6. 7.

8.

9.

10.

11. 12.

Apresentar o montante gasto com folha de pagamento. Apresentar a soma dos salrios de todos os funcionrios com cargo de 'gerente'. Apresentar o total gasto com salrios pelo departamento de 'informtica'. Apresentar o faturamento bruto com a venda de 'notebook'. Apresentar cada produto e o respectivo faturamento bruto. Apresentar o nome de cada departamento e o respectivo valor gasto com folha de pagamento por cada setor. Apresentar o valor total da venda de nmero 1. Apresentar o total de vendas (em reais) realizado pelo funcionrio 'Marcelo'. Solicitar o nome de um cliente e apresentar o total de vendas (em reais) realizado para o mesmo. Apresentar os produtos que tenham tido faturamento bruto superior a R$ 50.000,00.
120

13.

14.

15.

16.

17. 18.

19.

20.

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

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.

122

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

45.

46.

47.

48.

49.

50.

Unio de consultas

UNION UNION ALL

124

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.

125

Exemplo
Por exemplo, possvel apresentar a relao de profissionais da rea da sade fazendo a unio entre as tabelas de mdico e de enfermeiro.
CREATE TABLE tb_medico ( crm varchar(15) not null primary key, nome varchar(40), sexo char(1), check (sexo in('F','M')), especialidade varchar(40) ); CREATE TABLE tb_enfermeiro ( coren varchar(15) not null primary key, nome varchar(40), sexo char(1), check (sexo in('F','M')) );

Cadastrar 5 mdicos e 5 enfermeiros.


126

UNION
1. Apresentar o documento, nome e sexo de todos os mdicos e enfermeiros.
SELECT crm doc, nome, sexo FROM tb_medico UNION ALL SELECT coren, nome, sexo FROM tb_enfermeiro; obs. nesse caso, as instrues UNION e UNION ALL trazem a mesma resposta, pois no h possibilidade de existirem registro duplicados. Assim, deve-se se usar o UNION ALL por questo de desempenho. obs2. note que conseguimos fazer a unio das 2 consultas, contudo, no possvel saber quem mdico e quem enfermeiro. Para resolver isso, podemos criar uma nova coluna.
127

UNION
2. Modificar o exemplo anterior de forma a conseguir diferenciar os tipos de profisso.
SELECT 'medico' tipo, crm doc, nome, sexo FROM tb_medico UNION ALL SELECT 'enfermeiro', coren, coren nome, sexo FROM tb_enfermeiro;

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

128

UNION
3. Adicionar a coluna especialidade. No caso de enfermeiros, deixar em vazio.
SELECT 'medico' tipo, crm doc, nome, sexo, especialidade FROM tb_medico UNION ALL SELECT 'enfermeiro', coren, coren nome, sexo, NULL FROM tb_enfermeiro;

obs.: note que no possvel usar a clusula UNION se o nmero de campos das consultas for diferente.

129

UNION
4. Apresentar somente os profissionais do sexo masculino.
SELECT 'medico' tipo, crm doc, nome, sexo FROM tb_medico WHERE sexo = 'M' UNION ALL SELECT 'enfermeiro', coren, coren nome, sexo FROM tb_enfermeiro WHERE sexo = 'M';

obs.: a clusula WHERE executada para cada select.

130

UNION
5. Apresentar os mdicos de ambos os sexos e as enfermeiras (sexo feminino).
SELECT 'medico' tipo, crm doc, nome, sexo FROM tb_medico UNION ALL SELECT 'enfermeiro', coren, coren nome, sexo FROM tb_enfermeiro WHERE sexo = 'F';

131

UNION
6. Apresentar todos os profissionais da sade, exceto os mdicos cardiologistas.
SELECT 'medico' tipo, crm doc, nome, sexo FROM tb_medico WHERE especialidade <> 'Cardiologista' UNION ALL SELECT 'enfermeiro', coren, coren nome, sexo FROM tb_enfermeiro;

132

UNION
7. Apresentar todos mdicos e enfermeiros, mas ordenado pelo nome dos profissionais (independente do tipo)
SELECT 'medico' tipo, crm doc, nome, sexo, especialidade FROM tb_medico UNION ALL SELECT 'enfermeiro', coren, coren nome, sexo, NULL FROM tb_enfermeiro ORDER BY nome;

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

133

UNION
8. Apresentar a mesma resposta do exerccio anterior, mas ordenado pelo nome primeiro dos mdicos, depois dos enfermeiros.
SELECT 'medico' tipo, crm doc, nome, sexo, especialidade FROM (SELECT * FROM tb_medico ORDER BY nome) UNION ALL SELECT 'enfermeiro', coren, coren nome, sexo, NULL FROM (SELECT * FROM tb_enfermeiro ORDER BY nome);

obs.: foi utilizado subconsulta para fazer a ordenao.

134

UNION
9. Apresentar os mdicos que sejam 'pediatra' ou do sexo 'feminino'.
, nome, sexo, especialidade SELECT crm, FROM tb_medico WHERE especialidade = 'Pediatra' UNION SELECT crm, , nome, sexo, especialidade FROM tb_medico WHERE sexo = 'F'; obs1.: note que desta vez foi usado o comando UNION (ao invs de UNION ALL), pois caso existam mdicas pediatras devero ser exibidas uma nica vez. obs2.: o exemplo anterior poderia ser resolvido com o operador OR. Contudo, o comando UNION tem melhor desempenho (no pior caso, o mesmo desempenho)
135

UNION
10. Apresentar a relao de clientes e funcionrios.
SELECT 'cliente' tipo, nome FROM cliente UNION ALL SELECT 'funcionario' ' tipo, nome FROM funcionario;

136

UNION
11. Apresentar a relao de clientes, funcionrios e fornecedores.
SELECT 'cliente' tipo, nome FROM cliente UNION ALL SELECT 'funcionario' ' tipo, nome FROM funcionario UNION ALL SELECT 'fornecedor' tipo, nome FROM fornecedor;

137

UNION
12. Apresentar todos os clientes que possuam a palavra 'Lins' no nome, cidade ou endereo.
SELECT nome, endereco, , cidade FROM tb_cliente WHERE UPPER(nome) LIKE '%LINS%' UNION SELECT nome, endereco, , cidade FROM tb_cliente WHERE UPPER(endereco) ) LIKE '%LINS%' UNION SELECT nome, endereco, , cidade FROM tb_cliente WHERE UPPER(cidade) LIKE '%LINS%'; obs.: note que esta consulta funciona de forma similar ao google, pois localiza a palavra 'Lins' em qualquer campo.
138

UNION
13. Apresentar os itens do pedido nmero 1 e apresentar ao final da listagem o valor total do pedido.
select p.descricao, p.preco, p.preco i.qtde, p.preco*i.qtde total from produto p inner join itens i on p.cod_prod=i.cod_prod where i.cod_ped = 1 union all select 'total', null, null, null sum(p.preco*i.qtde) from produto p inner join itens i on cod_prod=i.cod_prod where i.cod_ped = 1 obs.: note que esta consulta funciona de forma similar ao google, pois localiza a palavra 'Lins' em qualquer campo.

139

Tabelas com duplo relacionamento


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

0..N AEROPORTO id nome cidade 0..N

origem destino

1..1 VOO 1..1 id hr_partida hr_chegada

140

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

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

142

Exerccios
1. 2. 3. 4. 5. Apresentar os aeroportos cadastrados. Apresentar o nome de cada aeroporto e a quantidade de voos que partem dele. Apresentar o nome de cada aeroporto e a quantidade de voos que chegam at ele. Apresentar o horrio de partida e de chegada dos voos que partem da cidade de So Paulo com destino ao Rio de Janeiro. Apresentar o nome do aeroporto de origem, o nome da cidade de origem, o nome do aeroporto de destino, o nome da cidade de destino, o horrio de partida e o horrio de chegada de todos os voos. Apresentar aeroporto e cidade de destino, horrio de partida e de chegada de todos os voos cuja origem seja 'Congonhas'. Apresentar aeroporto e cidade de origem, horrio de partida e de chegada de todos os voos cujo destino seja 'Santos Dumont'. Apresentar aeroporto e cidade de origem, horrio de partida e de chegada de todos os voos cuja destino seja o 'Rio de Janeiro'.
143

6. 7. 8.

Exemplos de Duplo Relacionamento


0..N PEA id modelo 0..N 1..1 1..1 COMPATVEL

0..N MEDICAMENTO id nome 0..N

1..1 SIMILAR 1..1

0..N PRODUTO id descricao 0..N

1..1 RECOMENDADO 1..1

144

Auto-relacionamento relacionamento
O auto-relacionamento, relacionamento, ou relacionamento recursivo, permite que uma tabela receba uma chave estrangeira dela prpria. Esse tipo de relacionamento permite um alto grau de flexibilidade nos sistemas. Em geral, o tratamento de relacionamento recursivo feito atravs de funes recursivas via linguagem de programao.

145

Auto-relacionamento relacionamento
PEAS id descricao preco N 1

CREATE TABLE tb_peca ( id integer not null, pai integer, descricao varchar(80), preco decimal(8,2), PRIMARY KEY(id), FOREIGN KEY(pai) REFERENCES tb_peca(id) );
146

Auto-relacionamento relacionamento
INSERT INSERT INSERT INSERT INSERT INSERT INSERT COMMIT; INTO INTO INTO INTO INTO INTO INTO tb_peca(id, tb_peca(id, tb_peca(id, tb_peca(id, tb_peca(id, tb_peca(id, tb_peca(id, pai, pai, pai, pai, pai, pai, pai, descricao, descricao, descricao, descricao, descricao, descricao, descricao, preco) preco) preco) preco) preco) preco) preco) VALUES(1, VALUES(2, VALUES(3, VALUES(4, VALUES(5, VALUES(6, VALUES(7, null, 'motor', 5000); 1, 'pisto', 2000); 1, 'vlvulas', 1500); 1, 'bloco', 3000); 4, 'cabeote', 1000); 4, 'cilindro', 1500); 4, 'carter', 1000);

147

Consulta recursiva (em Oracle)

SELECT LEVEL, id, descricao, preco FROM tb_peca CONNECT BY PRIOR id = pai START WITH id = 1;

CONNECT BY PRIOR faz a chamada recursiva na consulta START WITH define o registro inicial para a consulta LEVEL apresenta o nvel em que se encontra o registro
148

CONNECT_BY_ROOT id children testar no select

Consulta recursiva (em Oracle)

SELECT SYS_CONNECT_BY_PATH(id,'.') codigo, LEVEL, descricao, preco FROM tb_peca CONNECT BY PRIOR id = pai START WITH id = 1;

SYS_CONNECT_BY_PATH monta o cdigo dentro dos nveis

149

Exemplos de Recursividade
1 CONTAS id tipo N

CATEGORIAS id descricao N

CARGOS id nome N

1 id titulo acao

MENU N

150

VIEW

(viso)

Uma view uma tabela virtual gerada a partir de uma consulta, na qual as informaes so obtidas diretamente nas tabelas usadas nas consultas. Atualizando-se se os dados das tabelas de origem, automaticamente atualiza-se se a view. Tipos de Viso:
1. 2. 3. 4. 5.

Viso Idntica Viso por Seleo de Linhas Viso por Seleo de Colunas Viso por Seleo de Linhas e Colunas Viso por Juno de Tabelas

151

Tipos de Vises
viso idntica viso por seleo de linhas e colunas

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.

153

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; view_funcionario ou SELECT * FROM view_funcionario WHERE cargo='Gerente';
155

View - Exemplo
Tambm podemos restringir linhas de uma tabela ao gerar uma view. . Por exemplo, podemos permitir o acesso aos dados dos funcionrios, excetos aqueles que ocupem cargo de 'diretor'.
CREATE VIEW view_funcionario_filtro AS SELECT * FROM funcionario WHERE cargo <> 'Diretor';

Para acessar:
SELECT * FROM view_funcionario_filtro; view_funcionario_filtro

156

View - Exemplo
Podemos, ainda, criar vises que utilizem dados de mais de uma tabela. Por exemplo, para exibir a relao de funcionrios da empresa, com seus respectivos departamentos.
CREATE VIEW view_func_depto AS SELECT f.nome funcionario, funcionario d.nome departamento FROM funcionario f LEFT JOIN departamento d ON f.cod_depto = d.cod_depto; d.cod_depto

Agora para termos a listagem, trabalhamos como se s existisse uma tabela: view_func_depto SELECT * FROM view_func_depto;
157

View - Exemplo
Consultas com campos calculados tambm podem ser usados para criar uma view. Por exemplo, uma viso que apresentar a quantidade de funcionrio por departamento.
CREATE VIEW view_func_por_depto AS SELECT d.nome, , count(*) qtde FROM funcionario f INNER JOIN departamento d ON f.cod_depto = d.cod_depto GROUP BY d.nome;

Para acessar: SELECT * from view_func_por_depto; view_func_por_depto


158

View

Em resumo, qualquer consulta que possa ser criada pode ser usada para se criar uma view. O uso das vises permite facilitar o uso das consultas e permite criar restries de segurana.

159

Usurios, Grupos e Permisses

CREATE USER CREATE ROLE GRANT REVOKE SYNONYM

160

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; cliente_ID 2. Dar permisso para o usurio poder consultar os dados da tabela produto; GRANT SELECT ON produto TO cliente_ID;
161

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; 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; SYSTEM.produto


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

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; cliente_ID ou GRANT ALL ON produto TO cliente_ID;
163

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.

164

SYNONYM
Para facilitar o acesso as tabelas criadas em diferentes esquemas, podemos criar sinnimos: CREATE PUBLIC SYNONYM produto_ID FOR SYSTEM.produto; Para testar, vamos conectar novamente com o usurio cliente_ID e fazer uma consulta agora usando o sinnimo criado: CONN cliente_ID / cliente; SELECT * FROM produto_ID; produto_ID
165

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; 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; vendedor_ID

166

ROLE
Agora podemos criar diversos usurios com esse perfil:
CREATE USER vend1_ID IDENTIFIED BY senha; CREATE USER vend2_ID IDENTIFIED BY senha; CREATE USER vend3_ID IDENTIFIED BY senha; GRANT vendedor_ID TO vend1_ID, vend2_ID, vend3_ID; Automaticamente, todos os 3 vendedores possuem as mesmas permisses. Caso alguma mudana seja feito ao ROLE vendedor_ID, os usurios desse grupo recebero as modificaes.

167

Colunas Especiais

ROWNUM ROWID

168

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:

169

ROWNUM

SELECT ROWNUM, cod_prod, cod_prod descricao, preco FROM produto;

obs.: note que para cada linha retornada pela consulta, gerado um nmero nico.

170

ROWNUM
SELECT ROWNUM, cod_prod, cod_prod descricao, preco FROM produto ORDER BY descricao;
obs.: neste caso, a coluna ROWNUM ficar fora de ordem, pois ela gerada antes de executar a clusula ORDER BY. Como resolver? usando subconsulta!!!

SELECT ROWNUM, p.cod_prod, p.cod_prod p.descricao, p.preco FROM (SELECT cod_prod, descricao, descricao preco FROM produto descricao p; ORDER BY descricao)
171

ROWNUM
Mas, qual a utilidade de ROWNUM? Por exemplo, para gerar paginao de registros num sistemas para web. Para exibir os 10 primeiros registros, podemos usar:
SELECT ROWNUM, p.cod_prod, p.cod_prod p.descricao, p.preco FROM (SELECT cod_prod, descricao, descricao preco FROM produto ORDER BY descricao) ) p WHERE ROWNUM <= 10;

172

ROWNUM
Agora vamos listar a segunda pgina, com os registros de 11 a 20.
p.cod_prod p.descricao, p.preco SELECT ROWNUM, p.cod_prod, FROM (SELECT cod_prod, descricao, descricao preco FROM produto ORDER BY descricao) ) p WHERE ROWNUM BETWEEN 11 AND 20;

Resposta: nenhuma linha selecionada!!! Por qu? A clusula WHERE executada antes do ROWNUM!!!
173

ROWNUM

A soluo novamente trabalhar com subconsulta:


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

174

ROWNUM
Uma soluo mais elegante seria criar uma viso com a consulta anterior.
CREATE VIEW paginacao_produto AS SELECT ROWNUM limite, p.cod_prod, p.cod_prod p.descricao, p.preco FROM (SELECT cod_prod, descricao, descricao preco FROM produto ORDER BY descricao) ) p;

Para executar:
SELECT * FROM paginacao_produto WHERE limite BETWEEN 11 AND 20; Curiosidade: se fosse em MySQL, MySQL bastaria: SELECT * FROM produto LIMIT 10,10;
175

ROWID
ROWID gerado pelo Oracle ao inserir um novo registro. Pode ser usado para acessar um registro com maior velocidade ou para distinguir registros com dados repetidos.
CREATE TABLE tb_teste ( codigo integer, descricao varchar(40) (40) ); values 'teste'); insert into tb_teste values(1, insert into tb_teste values(1, values 'teste'); commit; Note que os 2 registros tem o mesmo valor de cdigo!
176

ROWID

Para apagar apenas um dos registros criados acima, ser necessrio utilizar a coluna ROWID:
Primeiro descobrimos qual o valor do ROWID do registro:

SELECT ROWID,codigo,descricao FROM tb_teste;


Depois, apagamos o registro usando o ROWID:

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

177

SEQUENCE
Objetos sequence so usados para a gerao automtica de chaves primrias.
CREATE SEQUENCE seq_produto START WITH 1 INCREMENT BY 1; INSERT INTO produto(cod_prod, descricao, preco) VALUES (seq_produto.NEXTVAL, 'iPad 3', 2500);

Se a tabela j possuir registros, deve-se deve criar o sequence com o valor da maior PK j existente. Para cada tabela que se deseja utilizar auto-incremento, auto deve-se se criar um novo sequence.
178

SEQUENCE

(cont.)

Para se saber quais sequences existem no BD, use: SELECT * FROM user_sequences; Para se obter o valor corrente do sequence, use: SELECT nome_sequence.CURRVAL FROM dual; Para alterar o valor de um sequence, use: ALTER SEQUENCE nome_sequence START WITH 100;

179

Sequence - Exemplos
Criar uma sequncia ascendente chamada serial, comeando por 101:
CREATE SEQUENCE serial START WITH 101 INCREMENT BY 1;

Selecionar o prximo valor desta sequncia:


SELECT serial.nextval FROM dual; 102

Se a funo nextval for chamada duas vezes no mesmo comando a sequncia ser incrementada duas vezes:
SELECT serial.nextval, serial.nextval FROM dual; 103 | 104

Para que a sequncia no seja incrementada duas vezes deve ser utilizada a funo currval na vez seguinte:
SELECT serial.nextval, serial.currval FROM dual; 105 | 105
180

INDEX
Os ndices so utilizados, principalmente, para melhorar o desempenho do banco de dados (embora a utilizao no apropriada possa resultar em uma degradao de desempenho). O ndice do banco de dados segue a mesma filosofia de um ndice de um livro: achar a informao que procura mais rapidamente. O comando CREATE INDEX constri o ndice nome_do_ndice na tabela especificada.
181

INDEX
um recurso usado pelo gerenciador de Banco de Dados para facilitar a busca de linhas dentro de uma tabela. ndice nico
ndice criado a partir da chave primria, no permite a incluso de linhas duplicadas

ndice de Performance
Facilita a busca de linhas na tabela, diminuindo o tempo de resposta.

INDEX Sintaxe:
CREATE [UNIQUE] INDEX <nome_indice> ON <nome_tabela> (<nome_coluna> [ASC / DESC])

Exemplo:
CREATE INDEX IDX_Cliente ON Cliente (Nome ASC)

INDEX
Estudos apontam que 80% das atualizaes de hardware por novos equipamentos seriam desnecessrios, bastando apenas o ajuste adequado do software. ATENO: O uso excessivo de indexao pode tornar o acesso lento!!!
Assim, deve-se se criar ndices apenas para tabelas com grande nmero de registros (alguns milhares, pelo menos) e para campos que sejam frequentemente utilizados em buscas.

DISTINCT
A clusula DISTINCT remove do resultado as linhas duplicadas. A utilizao do DISTINCT obriga a base de dados a executar a query em trs passos:
1. 2. 3. Criar um "result set" com todas as linhas que satisfazem o query como se este no tivesse DISTINCT; Ordenar as linhas resultantes para identificar e eliminar valores repetidos; Mostrar o resultado ao utilizador;

Com DISTINCT, a query fica mais pesada, pois requer o passo 2. Sem ordenao, o utilizador comearia a ver resultados logo que o primeiro conjunto de dados fosse identificado pela base de dados.

DISTINCT Exemplo
Exibir o nome de todos os clientes que tiveram vendas realizadas no ano de 2012. SELECT DISTINCT c.nome, c.telefone FROM cliente c INNER JOIN venda v ON c.cod_cli = v.cod_cli WHERE EXTRACT(YEAR FROM v.data) = 2012; Se a clusula DISTINCT no fosse utilizada, os clientes que tenham realizado mais de uma venda seriam listados em duplicidade.
186

IN
A clusul IN permite filtrar registros entre uma lista de opes. Ele funciona como o operador OR, mas permite, por exemplo, o uso de sub-consulta consulta no momento do filtro. Os clientes que j fizeram alguma venda em 2012.
SELECT c.cod_cli, c.nome, , c.telefone FROM cliente c WHERE c.cod_cli IN(SELECT v.cod_cli FROM venda v WHERE EXTRACT(YEAR FROM v.data)=2012); Apesar de mais prtico que o uso do operador OR, deve-se deve usar esse comando com cautela, pois seu desempenho no dos melhores.
187

EXISTS
O operador EXISTS frequentemente usado com subpesquisas correlatas. Ele testa quando um valor existe. (NOT EXISTS garante que no existe). Se o valor existir ser retornado TRUE, caso contrrio FALSE. A execuo da subconsulta interrompida assim que o primeiro valor for localizado.
SELECT c.cod_cli, c.nome, , c.telefone FROM cliente c WHERE EXISTS (SELECT cod_cli FROM venda v WHERE v.cod_cli = c.cod_cli) ORDER BY c.nome;

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

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

190

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

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. Os remdios similares devem ser relacionados. O estoque de cada medicamento deve ser feito por lote de validade. A cada venda realizada deve-se se registrar: a data da venda, o cliente para quem foi vendido e os itens vendidos.

192

Farmcia: Diagrama 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

0..N 0..N

1..1 1..1

SIMILAR
cod_sim

LABORATRIO
cod_lab nome

193

Farmcia: Exerccios
1. 2. 3. 4. Apresentar o nome, tarja e laboratrio de todos os remdios. Apresentar os nomes dos remdios de tarja 'preta'. Apresentar a validade e estoque do remdio 'Anador'. Apresentar o nome dos remdios, que tenham estoque disponvel. 5. Apresentar o nome e a quantidade em estoque, independente da validade. 6. Apresentar todos os itens (remdio, validade, quantidade e valor) da venda nmero 1. 7. Apresentar o nome dos clientes com vendas de 'Aspirina'. 8. Apresentar os clientes que tenham com venda de 'Dorflex'. 9. Apresentar a quantidade de remdios vendidos agrupados pelo laboratrio. 10. Apresentar os remdios similares 'Anador'.
194

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

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

cod_ass descricao
LIVRO_ASS

ASSUNTO

relevancia

LIVRO_AUT

ordem

0..N

cod_autor nome

AUTOR

196

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'.
197

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.

198

Locadora: Estudo de Caso


Elaborar a modelagem de um sistema para controle de uma locadora. Deve-se 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 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.

199

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

200

Locadora: Exerccios
1. 2. 3. 4. 5. 6. 7. 8.

(1/2)

Apresentar os ttulos dos filmes cadastrados. Apresentar o total de filmes cadastrados. Apresentar o total de cpias cadastradas. Apresentar o ttulo dos filmes e a respectiva quantidade de cpias. Apresentar todos os ttulos de filmes do gnero aventura. Apresentar os atores do filme 'Jornada nas Estrelas'. Apresentar o gnero do filme 'Batman'. Apresentar o nmero e tipo de mdia de todas as cpias do filme 'Harry Poter'. 9. Apresentar os clientes que j alugaram o filme 'Matrix'. 10. Apresentar os ttulos dos filmes que j foram emprestados pelo cliente 'Carlos'.

201

Locadora: Exerccios

(2/2)

11. Apresentar o ttulos dos filmes que esto alugados. 12. Apresentar o ttulo do filme mais emprestado. 13. Apresentar o nome de cada ator e a quantidade de filmes que atuou. 14. Apresentar o nome dos atores que j atuaram em mais de 3 filmes. 15. Apresentar o ttulo do filme mais antigo. 16. Apresentar o ttulo dos filmes e a quantidade de vezes que foram alugados. 17. Moficar o anterior exibindo os que tenham sido alugados mais de 10 vezes. 18. Apresentar os filmes do gnero 'romance' ou 'drama'. 19. Apresentar o ttulo dos filmes em que atuou 'Al Pacino'. 20. Apresentar a quantidade de aluguis realizados agrupados por ms.

202

Bibliografia
Livro Texto: 1. Introduo a Sistemas de Banco de Dados; Date, C. J.; Ed. Campus; 8 edio; 2004; 15 exemplares. 2. Sistemas de Banco de Dados; Korth, , Henry F.; Ed. Campus; 5 edio; 2006; 15 exemplares. 3. Projeto e Modelagem de Banco de Dados; Lightstone, Teorey; Ed. Campus; 1 edio; 2006; 10 exemplares. Complementar: 4. Oracle Database 11g PL/SQL: Programao; McLaughlin, Michel; Ed. Novatec; 1 edio; 2009; 10 exemplares. 5. Oracle 10g PL/SQL; Oliveira, Celso H. Poderoso de; Ed. Novatec; 1 edio; 2005; 10 exemplares. 6. Oracle 10g Database: Guia do DBA; Serson, Serson Roberto Rubinstein; Ed. Novatec; 1 edio; 2004; 10 exemplares. 7. Oracle 10g: Ideal Para Quem Deseja Iniciar o Aprendizado do Oracle; Ramalho, Jos A.; Ed. Thomson; ; 1 edio; 2005; 10 exemplares. 8. Gerenciando Banco de Dados: A Abordagem Entidade-Relacionamento Entidade para Projeto Lgico; Chen, Peter; Makron Books; 1 edio; 1990; 7 exemplares.

203

Você também pode gostar