Escolar Documentos
Profissional Documentos
Cultura Documentos
APOSTILA
DE SQL
Para Aulas de Laboratrio
NDICE
INTRODUO AO SQL, SQL*PLUS E PL/SQL (ORACLE) ..............................................................................4
COMANDOS SQL ........................................................................................................................................................4
SQL*PLUS ................................................................................................................................................................6
EXEMPLO DE UM BLOCO PL/SQL ...............................................................................................................................7
COMANDO SELECT .................................................................................................................................................8
COMO SELECIONAR LINHAS DE UMA NICA TABELA..................................................................................................8
COMO ORDENAR E LIMITAR AS LINHAS SELECIONADAS ...........................................................................................10
FUNES APLICADAS A LINHAS ...............................................................................................................................14
COMO SELECIONAR DADOS DE MAIS DE UMA TABELA ...............................................................................................18
FUNES DE GRUPO .................................................................................................................................................21
A CLUSULA GROUP BY ...........................................................................................................................................23
A CLUSULA HAVING ...............................................................................................................................................24
A RECUPERAO DE DADOS COM SUBCONSULTAS (SUBQUERIES) ............................................................................26
A RECUPERAO DE DADOS COM SUBCONSULTAS CORRELACIONADAS ....................................................................28
SCRIPTS REUTILIZVEIS ...................................................................................................................................33
CRIAO DE TABELAS ........................................................................................................................................35
DICIONRIO DE DADOS.......................................................................................................................................40
COMANDOS DE MANIPULAO DE DADOS..............................................................................................43
O COMANDO INSERT..............................................................................................................................................43
O COMANDO UPDATE ...........................................................................................................................................45
O COMANDO DELETE............................................................................................................................................46
CONTROLE DE TRANSAES..........................................................................................................................48
ALTERANDO TABELAS E CONSTRAINTS ....................................................................................................51
SEQNCIAS ...........................................................................................................................................................56
VISES ......................................................................................................................................................................59
NDICES ....................................................................................................................................................................64
CONTROLANDO O ACESSO DOS USURIOS AO BANCO DE DADOS ......................................................69
TIPOS DE PRIVILGIOS ..............................................................................................................................................69
GERENCIANDO ROLES ..............................................................................................................................................73
UTILIZAO DE ROLE COM PASSWORD ....................................................................................................................73
ROLES QUE J VEM DE FBRICA................................................................................................................................74
INFORMAES SOBRE ROLES NO DICIONRIO DE DADOS .........................................................................................75
ROLES ASSOCIADAS AO SISTEMA OPERACIONAL ......................................................................................................75
LISTAS DE EXERCCIOS ....................................................................................................................................77
BIBLIOGRAFIA .......................................................................................................................................................85
Comandos SQL, SQL*Plus e PL/SQL so utilizados para acessar e manipular dados armazenados em
um servidor de Banco de Dados Oracle.
Linguagem ou Ferramenta
SQL
SQL*Plus
PL/SQL
Descrio
Uma linguagem no procedural para a comunicao com
Bancos de Dados Relacionais a partir de ferramentas ou
aplicaes.
Uma ferramenta Oracle que reconhece e submete
comandos SQL e PL/SQL para execuo no servidor.
Edita comandos SQL com um editor de linha, formata o
resultado de queries, controla variveis de ambiente, etc.
Para executar estas tarefas o SQL*Plus possui seus
prprios comandos.
Uma linguagem procedural da Oracle para controlar a
lgica de aplicaes.
Comandos SQL
Comando
SELECT
INSERT
UPDATE
DELETE
CREATE
ALTER
DROP
RENAME
TRUNCATE
COMMIT
ROLLBACK
SAVEPOINT
GRANT
REVOKE
Descrio
Recupera dados do Banco de Dados.
Insere novas linhas, altera linhas existentes e remove linhas de
tabelas do banco de dados, respectivamente. Estes comandos so
conhecidos como comandos DML (Data Manipulation Language).
Cria, altera e remove objetos do banco de dados. So conhecidos
como comandos DDL (Data Definition Language).
SQL*PLUS
Connect User/Password @String de Conexo
COMANDO SELECT
Como Selecionar Linhas de uma nica Tabela
OU
SELECT NOME, SALARIO * 12 SAL ANUAL, DT_ADMISSAO
FROM EMPREGADOS;
10
Observaes:
1. Usar aspas simples quando a comparao for com um literal.
2. literal Case Sensitive.
3. default para datas DD-MON-YY
3. Operadores lgicos:
- AND
- OR
- NOT
11
12
[R2] Comentrio:
AQUI ENTRA A LISTA DE
EXERCCIOS NMERO 1.
13
Funes de linhas
Funes de grupos
Um funo de linha retorna um resultado por linha da tabela acessada. J uma funo de grupo
retorna um resultado por grupo de registros.
14
Formato de Data
15
TO_CHAR Converte um nmero ou uma data para VARCHAR2. Um formato pode ser
especificado.
TO_NUMBER Converte um string contendo dgitos para NUMBER
TO_DATE Converte um string representando uma data para DATE de acordo com o
formato especificado. O formato default DD-MON-YY.
Exemplo 1: Utilizao da funo TO_CHAR. Como exibir uma data no formato DD/MM/AA.
SELECT NOME, TO_CHAR (DT_ADMISSAO, DD/MM/YY) ADMISSO
FROM EMPREGADOS;
Observaes:
-
Por default, a largura de uma coluna que resulta de uma expresso de 80 posies.
YYYY ou YYY ou YY ou Y Os ltimos 4, 3, 2 ou 1 dgitos do ano.
MM O ms representado em 2 dgitos.
MON O nome do ms abreviado em 3 letras.
DDD ou DD ou D Dia do ano, ms ou semana.
DAY O nome do dia por extenso, completado com brancos at 9 caracteres.
MM/AA Apenas o ms e o ano so exibidos.
16
17
Para se exibir dados de mais de uma tabela, atravs de um comando SQL, preciso definir
condies de juno. (Joins)
Os joins geralmente ocorrem entre valores de chave primria e de chave estrangeira.
Tipos de Joins:
Equijoin
Non-equijoin
Outer join
Self Join
Set operators
Um produto cartesiano geralmente ocorre quando a condio de juno omitida ou invlida.
Para evitar produtos cartesianos preciso incluir, na clusula Where, condies de juno vlidas.
Exemplo 1: Uma juno simples entre a Tabela de Empregados (Emp) e a tabela de Departamentos
(Dept).
SELECT EMPREGADOS.NOME, NUMERO_DEPT, DEPARTAMENTOS.NOME
FROM EMPREGADOS, DEPARTAMENTOS
WHERE EMPREGADOS.NUMERO_DEPT = DEPARTAMENTOS.NUMERO;
Obs: Haver um ganho de desempenho e de clareza se voc sempre qualificar as colunas com o nome
das tabelas s quais elas pertencem.
18
Nome
---------INGO
TERESA
CHICO
CELIO
JOSE
LUIZA
ARMANDO
WALTER
MARTA
TUTTI
JAMES
JOHN
SEBASTIAN
ABELARDO
SILVIO
Nome do Depto
-------------COMPRAS
COMPRAS
COMPRAS
VENDAS
VENDAS
MARKETING
MARKETING
VENDAS
COMPRAS
PESQUISA
COMPRAS
VENDAS
VENDAS
15 rows selected.
19
Observaes:
- Observe que o empregado Tutti no est lotado em nenhum departamento.
- O sinal de + deve ficar do lado do valor nulo.
- O sinal de + no pode ser colocado em ambos os lados da clusula Where.
[R10] Comentrio: Na
verdade o valor nulo est na
coluna Numero_dept na tabela de
empregados.
Empregado
---------TERESA
CHICO
CELIO
JOSE
LUIZA
ARMANDO
WALTER
MARTA
TUTTI
JAMES
JOHN
SEBASTIAN
ABELARDO
SILVIO
14 rows selected.
O que precisaria ser feito para que o empregado Ingo (que o presidente) aparea na coluna de
empregados, porem sem Supervisor?
[R12] Comentrio:
SELECT E1.NOME
Supervisor, E2.NOME
Empregado
FROM EMPREGADOS E1,
EMPREGADOS E2
WHERE E1.NUMERO(+) =
E2.NUM_SUPERVISOR;
20
Funes de Grupo
Funes de grupo operam com um conjunto de linhas para dar um resultado por grupo de linhas.
Um conjunto de linhas pode ser uma tabela inteira ou linhas desta tabela divididas em grupos.
Funes de grupo podem aparecer tanto na clusula Select quanto na clusula Having.
A clusula Group By divide as linhas de uma ou mais tabelas em grupos de linhas.
A clusula Having seleciona os grupos que sero aceitos.
AVG
COUNT
MAX
MIN
STDDEV
SUM
VARIANCE
Observaes:
A clusula Distinct pode ser utilizada para que sejam considerados apenas valores no duplicatas.
Todas as funes de grupo ignoram valores nulos. Para substituir um valor nulo por outro valor
utilize a funo NVL.
Exemplo 1: Utilizao de funes de grupo, considerando todas as linhas de uma tabela um nico
grupo.
SELECT AVG(SALARIO), MAX(SALARIO), MIN(SALARIO), SUM(SALARIO)
FROM EMPREGADOS;
OU
SELECT MIN(NOME), MAX(NOME)
FROM EMPREGADOS;
21
SELECT COUNT(*)
FROM EMPREGADOS
WHERE NUMERO_DEPT = 10;
Exemplo 4: Utilizao da funo COUNT para contar o nmero de empregados que possuem
percentual de comisso diferente de nulo.
SELECT COUNT(PERC_COMISSAO)
FROM EMPREGADOS;
Observaes:
22
A clusula Group By
Exemplo 6: Utilizao da clusula GROUP BY e da funo COUNT para se contar quantos
empregados esto lotados em cada departamento.
SELECT NUMERO_DEPT, COUNT(*)
FROM EMPREGADOS
GROUP BY NUMERO_DEPT;
Observaes:
Qualquer coluna includa na clusula SELECT, se no estiver em uma funo de grupo, dever
constar da clusula GROUP BY.
Com a clusula WHERE possvel excluir determinadas linhas dos grupos.
Por default as linhas so ordenadas ascendentemente conforme a lista de colunas especificada na
clusula GROUP BY. Para modificar este comportamento preciso utilizar a clusula ORDER
BY.
Exemplo 7: Utilizao da clusula Group By, da funo COUNT e de um JOIN para se contar
quantos empregados esto lotados em cada departamento.
SELECT D.NOME DEPARTAMENTO, COUNT(*) QTD
FROM EMPREGADOS E, DEPARTAMENTOS D
WHERE E.NUMERO_DEPT = D.NUMERO
GROUP BY D.NOME;
[R13] Comentrio: No
possvel fazer o Group By por
Numero_Dept e na clusula Select
colocar o Nome do Departamento.
Exemplo 8: Utilizao da clusula Group By e da funo COUNT para se contar quantos empregados
esto lotados em cada departamento.
SELECT D.NOME DEPARTAMENTO, COUNT(*) QTD
FROM EMPREGADOS E, DEPARTAMENTOS D
WHERE E.NUMERO_DEPT = D.NUMERO
GROUP BY D.NOME
ORDER BY 2;
[R14] Comentrio: No
possvel fazer o Group By por
Numero_Dept e na clusula Select
colocar o Nome do Departamento.
[R15] Comentrio: Normalme
nte esta query estaria ordenada
ascendentemente por D.Nome.
23
Exemplo 9: A query abaixo est correta? A inteno listar o nmero dos departamentos seguido da
mdia salarial. No entanto, deseja-se listar apenas aqueles departamentos cuja mdia salarial superior
a 2000.
SELECT NUMERO_DEPT, AVG(SALARIO)
FROM EMPREGADOS
WHERE AVG(SALARIO) > 2000
GROUP BY NUMERO_DEPT;
A clusula Having
Exemplo 10: A utilizao da clusula HAVING para listar o nmero dos departamentos seguido da
mdia salarial de seus empregados. No entanto, deseja-se listar apenas aqueles departamentos cuja
mdia salarial superior a 2000.
SELECT NUMERO_DEPT, AVG(SALARIO)
FROM EMPREGADOS
GROUP BY NUMERO_DEPT
HAVING AVG(SALARIO) > 2000;
Exemplo 11: A utilizao da clusula GROUP BY para listar a quantidade de empregados por
departamento/cargo. Isto , grupos dentro de grupos. No deve ser exibido Nmero de Departamento
NULO.
SELECT NUMERO_DEPT, CARGO, COUNT(*)
FROM EMPREGADOS
GROUP BY NUMERO_DEPT, CARGO
HAVING NUMERO_DEPT IS NOT NULL;
24
Exemplo 12: A utilizao da clusula GROUP BY para listar a quantidade de empregados por
departamento/cargo. S devem ser exibidos os grupos de departamentos/cargo com mais de 1
empregado.
SELECT NUMERO_DEPT, CARGO, COUNT(*)
FROM EMPREGADOS
GROUP BY NUMERO_DEPT, CARGO
HAVING COUNT(*) > 1;
25
Uma subconsulta um comando SELECT embutido em uma clusula de outro comando SQL.
Quando e como utilizar:
Exemplo 1: A utilizao de uma subconsulta aninhada para recuperar o nome e salrio de todos os
empregados que trabalham no mesmo departamento que o JOSE trabalha.
SELECT NOME, SALARIO
FROM EMPREGADOS
WHERE NUMERO_DEPT = (SELECT NUMERO_DEPT
FROM EMPREGADOS
WHERE NOME = JOSE);
Exemplo 2: A utilizao de uma subconsulta aninhada para recuperar o nome e salrio de todos os
empregados que ganham mais do que a mdia salarial da empresa.
SELECT NOME, SALARIO
FROM EMPREGADOS
WHERE SALARIO > (SELECT AVG(SALARIO)
FROM EMPREGADOS);
26
Exemplo 6: A utilizao de uma subconsulta aninhada para recuperar, por departamento, o nome e o
salrio do empregado mais bem pago.
SELECT NOME, SALARIO
FROM EMPREGADOS
WHERE (SALARIO, NUMERO_DEPT) IN (SELECT MAX(SALARIO), NUMERO_DEPT
FROM EMPREGADOS
GROUP BY NUMERO_DEPT);
27
Exemplo 2: A utilizao de uma subconsulta correlacionada para recuperar o nome dos empregados
que trabalham no projeto numero 2.
SELECT NOME
FROM EMPREGADOS E
WHERE 2 IN ( SELECT NUMERO_PROJ
FROM TRABALHAM
WHERE NUMERO_EMP = E.NUMERO);
28
Quantificador Existencial
29
SELECT NOME
FROM EMPREGADOS
MINUS
SELECT NOME
FROM EMPREGADOS E, TRABALHAM T
WHERE T.NUMERO_EMP = E.NUMERO
AND T.NUMERO_PROJ = 2;
Observaes:
-
Deve ser selecionado um nome de empregado quando no existir um projeto no qual ele no
trabalhe.
Exemplo 4: Obter o nome dos empregados que trabalham em todos os projetos nos quais o
empregado 7521 trabalha.
SELECT NOME
FROM EMPREGADOS E
WHERE NOT EXISTS
(SELECT *
FROM TRABALHAM T1
WHERE NUMERO_EMP = 7521
AND NOT EXISTS
(SELECT *
FROM TRABALHAM T2
WHERE T2.NUMERO_EMP = E.NUMERO
AND
T2.NUMERO_PROJ = T1.NUMERO_PROJ));
30
Linhas duplicatas so eliminadas do resultado de uma unio a no ser que o operador UNION
inclua explicitamente o quantificador ALL. Assim, no exemplo n 1, o projeto n 3 selecionado
em ambos os SELECTS, mas s aparece uma vez no resultado final.
J o exemplo n 2 retornar os nmeros de projeto 2, 3 e 3.
Qualquer nmero de SELECTS pode ser unido pelo UNION.
Quando sabemos que no haver elementos duplicados no resultado conveniente utilizarmos
UNION ALL para que o sistema no seja forado a eliminar duplicidades, desnecessariamente.
Exemplo 1: Obter o nmero dos projetos que, ou se iniciaram aps 31-JUL-97, ou possuem o
empregado 7566 nele trabalhando. Unio sem repetio.
SELECT NUMERO
FROM PROJETOS
WHERE DT_INICIO > 31-JUL-97
UNION
SELECT NUMERO_PROJ
FROM TRABALHAM
WHERE NUMERO_EMP = 7566;
Exemplo 2: Obter o nmero dos projetos que, ou se iniciaram aps 31-JUL-97, ou possuem o
empregado 7566 nele trabalhando. Unio com repetio.
SELECT NUMERO
FROM PROJETOS
WHERE DT_INICIO > 31-JUL-97
UNION ALL
SELECT NUMERO_PROJ
FROM TRABALHAM
WHERE NUMERO_EMP = 7566;
31
CONDIO
--------------------DT_INICIO > 07-JAN-90
DT_INICIO > 07-JAN-90
DT_INICIO > 07-JAN-90
NUMERO_EMP = 7566
32
SCRIPTS REUTILIZVEIS
O objetivo aqui escrever scripts que, em tempo de execuo, indaguem o usurio sobre o valor de
variveis utilizadas na clusula WHERE de comandos SQL embutidos no script.
Exemplo 1: Usando Variveis de Substituio em Instrues SQL.
SELECT NOME, SALARIO
FROM EMPREGADOS
WHERE CARGO = '&CARGO';
Enter value for cargo: VENDEDOR
SALARIO
------------1600.45
1250
1250
1100
33
SET ECHO OFF evita que os comandos ecoem na tela do SQL*PLUS. (Assim como ocorre no
DOS).
SET VERIFY OFF faz desaparecer da tela os valores OLD e NEW da varivel de substituio.
Note que &DATA_ADM na clusula WHERE acima encontra-se entre plics. Isto evita que o
usurio seja obrigado a digitar os PLICS.
Sem os plics o usurio teria de digit-los para tudo que necessitasse ser tratado como caracter
ou data.
O comando ACCEPT cria a varivel (caso ela j no tenha sido criada anteriormente), l o
valor digitado pelo usurio e o atribui varivel.
Sintaxe do comando: ACCEPT varivel [datatype] [FORMAT] [PROMPT texto] [HIDE]
O comando UNDEFINE libera a rea de memria ocupada pela varivel.
Assim como no DOS, se digito a clusula WHERE assim: WHERE CARGO = &1 ento
ser possvel executar este script assim: @Z:\Exerc02.SQL VENDEDOR
S comandos SQL vo para o buffer. Todos os demais comandos no vo para o buffer do
SQL*Plus.
34
CRIAO DE TABELAS
Descrio
Armazena dados.
Representa logicamente subconjuntos de dados
de uma ou mais tabelas.
Gera valores de chaves primrias.
Melhora o desempenho de algumas consultas.
Tabelas
Observaes:
-
35
Tipos de Constraints
PRIMARY KEY
FOREIGN KEY
NOT NULL
UNIQUE
CHECK
Observaes:
-
36
37
Exemplo 4:
CREATE TABLE DEPENDENTES
(NUMERO_EMP
NUMBER(4)
CONSTRAINT DEPENDENTES_EMP_NUMERO_EMP_FK
REFERENCES EMPREGADOS (NUMERO),
NUM_ORDEM
NUMBER(2),
NOME
VARCHAR2(10),
CONSTRAINT DEPENDENTES_NUM_EMP_NUM_ORD_PK
PRIMARY KEY(NUMERO_EMP, NUM_ORDEM));
A constraint Primary Key uma combinao das constraints Unique e Not Null.
Um ndice nico automaticamente criado.
Designa uma coluna ou uma combinao de colunas de tal forma que duas linhas no possam
ter o mesmo valor.
Valores nulos so aceitos.
Automaticamente criado um ndice nico para a(s) coluna(s) especificada(s).
A constraint Check define uma condio que cada linha deve satisfazer.
No pode fazer referncia a CURRVAL, NEXTVAL, LEVEL e ROWNUM ou chamadas s
funes SYSDATE, UID, USER.
Subconsultas no so permitidas na definio de uma constraint check.
38
Triggers
Procedimentos ou funes armazenados no servidor de banco de dados
Atravs do cdigo na prpria aplicao.
[R26] Comentrio: Na
verdade Search_Condition a
nica informao que no consta
do prprio nome da constraint
'EMPREGADOS_PERC_COMIS
SAO_CK'.
Observao:
-
39
DICIONRIO DE DADOS
DESCRIO
Contm objetos cujo owner o prprio usurio. Ex. USER_TABLES
Acessa objetos aos quais o usurio recebeu algum direito em adio aos
objetos possuidos pelo usurio.
Permite que um usurio com o privilgio de DBA acesse qualquer objeto no
banco de dados.
Apresenta informaes de performance do Servidor e informaes de lock.
Disponvel apenas para o DBA.
Outras Vises: Vrias vises do dicionrio de dados no usam os prefixos listados acima. Por
exemplo:
Nome da Viso
DICTIONARY
DICT_COLUMNS
IND
Descrio
Descreve todas as tabelas, vises e sinnimos que compem o
dicionrio de dados.
Descreve as colunas das tabelas, vises e sinnimos que
compem o dicionrio de dados.
sinnimo para USER_INDEXES
40
Exemplo 1: Como saber que vises existem no dicionrio de dados e para que servem.
DESC DICTIONARY
SELECT TABLE_NAME, COMMENTS
FROM DICTIONARY;
Exemplo 2: Para conhecer a descrio das colunas de qualquer tabela ou viso do dicionrio de
dados, veja o contedo de DICT_COLUMNS. Na clusula WHERE voc dever informar o nome da
tabela ou viso do dicionrio que deseja conhecer.
SELECT COLUMN_NAME, COMMENTS
FROM DICT_COLUMNS
WHERE TABLE_NAME = USER_OBJECTS;
Exemplo 5: Como saber a que tabela e a que coluna uma constraint pertence?
SELECT TABLE_NAME, COLUMN_NAME
FROM USER_CONS_COLUMNS
WHERE CONSTRAINT_NAME = EMPR_DEPARTAMENTOS_NUMERO_DEPT_FK;
41
COLUMN_NAME
-----------------------------CPF
NUMERO
PERC_COMISSAO
NUMERO_DEPT
NUM_SUPERVISOR
42
Comandos
INSERT
UPDATE
DELETE
COMMIT
SAVEPOINT
ROLLBACK
Descrio
Adiciona novas linhas a uma tabela.
Modifica linhas existentes em uma tabela.
Remove linhas existentes de uma tabela.
Torna permanente todas as modificaes pendentes.
Permite um Rollback at a marca de savepoint.
Desfaz todas as manipulaes efetuadas.
O Comando INSERT
Exemplo 1: Quando so informados os dados de todas as colunas e na ordem default, no
necessrio informar o nome das colunas.
Exemplo 4: Mtodo explcito de insero de nulos. Alm da palavra-chave NULL, tambm pode ser
utilizado o string vazio
INSERT INTO DEPARTAMENTOS (NUMERO, NOME, LOCAL)
VALUES (50, 'PROJETOS', NULL);
43
Exemplo 5: Os nomes das colunas precisaram ser informados uma vez que os dados no esto na
ordem default.
INSERT INTO DEPARTAMENTOS (NOME, NUMERO, LOCAL)
VALUES ('PROJETOS', 50, RIO);
44
O Comando UPDATE
Exemplo 1: Atualizao da coluna LOCAL.
UPDATE DEPARTAMENTOS
SET LOCAL = ORLANDO
WHERE NUMERO = 40;
45
Observao:
-
No se pode atualizar a chave primria de uma tabela pai se houver filhos na tabela filho.
O Comando DELETE
Exemplo 1: Apagar o empregado 7788 da tabela de empregados.
DELETE FROM EMPREGADOS
WHERE NUMERO = 7788;
46
47
CONTROLE DE TRANSAES
Uma transao contm:
Uma transao comea quando o primeiro comando SQL executado e termina quando ocorre um dos
seguintes eventos:
Quando uma transao termina, o prximo comando SQL inicia automaticamente a prxima
transao.
48
Antes do commit os dados so vistos por outros usurios como se no tivessem sofrido nenhuma
manipulao.
As linhas afetadas so bloqueadas (locked). Outros usurios no podem modificar os dados
manipulados uma vez que estes dados encontram-se bloqueados.
Se um nico comando DML falha durante sua execuo, somente este comando sofre Rollback.
Todas as demais modificaes so provisoriamente mantidas at que um comando Commit ou
Rollback seja executado.
50
Todos os trs comandos acima so comandos DDL. Quando executados causam um COMMIT
automtico. Cuidado...
51
possvel adicionar e modificar colunas de uma tabela mas no se pode remover uma coluna
de uma tabela. A tabela deve ser criada novamente sem a coluna que se deseja remover.
No se pode especificar em que posio da tabela voc deseja que a coluna aparea. Ela
aparecer no final da tabela, isto , ser a ltima coluna.
Ao se criar uma nova coluna em uma tabela s se pode especificar a clusula NOT NULL se a
tabela estiver vazia.
A largura (preciso) de uma coluna s deve ser diminuda se a coluna s possui valores nulos
ou se a tabela se encontra vazia.
A modificao de um tipo de dado de uma coluna s deve ser efetuada se a coluna s contm
valores nulos.
Para converter uma coluna CHAR em VARCHAR2 ou de VARCHAR2 para CHAR a coluna
dever estar vazia ou o tamanho no dever ser modificado.
52
UCC.COLUMN_NAME
FROM
USER_CONSTRAINTS UC,
USER_CONS_COLUMNS UCC
WHERE
UC.CONSTRAINT_NAME =
UCC.CONSTRAINT_NAME
AND UC.TABLE_NAME =
'TRABALHAM';
Exemplo 5: Coma dropar uma constraint de primary key forando a remoo da respectiva constraint
de foreign key.
ALTER TABLE PROJETOS
DROP CONSTRAINT PROJETOS_NUMBER_PK CASCADE;
OU
ALTER TABLE PROJETOS
DROP PRIMARY KEY CASCADE;
53
54
[R37] Comentrio: No
funcionou. Ao dropar a tabela
Projetos (passo 4) o SGBD
reclama como se houvesse outra
constraint habilitada.
Exemplo 7: Como renomear uma tabela, uma viso, uma seqncia ou um sinnimo.
55
SEQNCIAS
Exemplo 1: Criao de uma seqncia para ser utilizada na gerao de valores de chave primria para
a tabela de departamentos.
CREATE SEQUENCE S_DEPARTAMENTOS_NUMERO
INCREMENT BY
1
START WITH
41
MAXVALUE
99
NOCACHE
NOCYCLE;
Observaes:
A opo CYCLE no deve ser utilizada se a seqncia ser utilizada para gerar valores de chave
primria.
Com a opo CACHE possvel pedir para o Oracle manter na memria uma certa quantidade de
valores da seqncia que, quando solicitados, sero buscados na memria e no no disco.
Intervalos na seqncia podem ocorrer quando:
Ocorre um Rollback
Ocorre um crash no sistema
A seqncia utilizada em mais de uma tabela
Para se saber que valor da seqncia foi utilizado no mais recente Insert em Departamentos devese utilizar S_DEPARTAMENTOS.CURRVAL.
56
Name
------------------------------SEQUENCE_NAME
MIN_VALUE
MAX_VALUE
INCREMENT_BY
CYCLE_FLAG
ORDER_FLAG
CACHE_SIZE
LAST_NUMBER
Null?
--------------NOT NULL
NUMBER
NOT NULL
NOT NULL
NOT NULL
Type
-------------------VARCHAR2(30)
[R51] Comentrio:
SELECT
S_DEPARTAMENTOS_NOME.C
URRVAL
FROM SYS.DUAL;
NUMBER
NUMBER
VARCHAR2(1)
VARCHAR2(1)
NUMBER
NUMBER
[R52] Comentrio:
DELETE FROM EMPREGADOS
WHERE NUMERO_DEPT =
(SELECT NUMERO
FROM DEPARTAMENTOS
[R53] Comentrio:
CREATE TABLE TESTE
(N1 NUMBER(3),
N2 NUMBER(3) DEFAULT
3);
57
Observao: Para se poder alterar uma seqncia preciso ser o OWNER da seqncia ou ter o
privilgio de ALTER para a seqncia.
58
VISES
Uma viso (VIEW) uma tabela virtual baseada em tabelas base ou em outras vises.
[R55] Comentrio: Se um
usurio possui privilgio de objeto
sobre uma view que lhe permita
alterar a view, ele no precisar
drop-la para efetuar a alterao.
At porque ele precisar Ter o
privilgio de sistema CREATE
VIEW para poder recri-la.
59
NOME
---------------INGO
TERESA
CHICO
MARTA
SEBASTIAN
SOBRENOME
---------HOFFMANN
AGUIAR
SERRA
ROCHA
COAL
Vises Complexas:
Exemplo 1: Criao de uma viso sobre a tabela de empregados.
CREATE VIEW V_DEPT_SALARIO (NOME, MENOR_SAL, MAIOR_SAL, MEDIA)
AS SELECT D.NOME, MIN(E.SALARIO), MAX(E.SALARIO), AVG(E.SALARIO)
FROM EMPREGADOS E, DEPARTAMENTOS D
WHERE E.NUMERO_DEPT = D.NUMERO
GROUP BY D.NOME;
60
possvel emitir comandos DML contra vises baseadas em uma nica tabela, exceto nos casos
abaixo:
Funes de grupo.
A clusula Group by.
O comando Distinct.
possvel emitir comandos DML contra vises baseadas em mais de uma tabela quando:
As linhas que se pretende excluir, pertencem tabela cuja chave primria preservada na
viso.
As colunas que se pretende alterar ou incluir pertencem tabela cuja chave primria
preservada na viso.
61
62
Desc USER_VIEWS
Name
----------------------VIEW_NAME
TEXT_LENGTH
TEXT
Null?
--------------NOT NULL
Type
--------------------VARCHAR2(30)
NUMBER
LONG
63
NDICES
O servidor Oracle 7 utiliza, por default, uma estrutura de rvore balanceada (B*Tree) para ndices.
Esta estrutura de ndice garante que o acesso a qualquer linha de uma tabela leve aproximadamente o
mesmo tempo independentemente da posio da linha na tabela.
Exemplo:
BETO
GILBERTO
GILBERTO
NAIR
LAURA
NAIR
ROWID
NEL
1
2
3
4
5
6
7
8
BETO
GILBERTO
LAURA
NAIR
NELSON
SERGIO
UBALDO
VERA
...
NELSON
SERGIO
SERGIO
VERA
UBALDO
VERA
Cada linha da base de dados possui um nmero identificador denominado ROWID que uma
composio do nmero do arquivo, do bloco e da linha onde se encontra a linha da tabela desejada.
Exemplo:
SELECT ROWID, NUMERO, CPF, NOME
FROM EMPREGADOS;
00000099.0000.0002
00000099.0001.0002
00000099.0002.0002
00000099.0003.0002
7839
7566
7698
7782
11111111111
22222222222
33333333333
44444444444
INGO
TERESA
CHICO
CELIO
(Bloco.Linha.Arquivo)
Tipos de ndices
64
B-Tree
nico
No nico
Clusterizado
Index Cluster
Hash Cluster
Bitmap
[R68] Comentrio: No so
tratados neste curso. O Hash
cluster serve para reduzir I/O
atravs do uso de uma funo que
determina o endereo do bloco
onde as linhas que possuem a
mesma Hash Key devem ser
encontradas. No eficiente se o
nmero de linhas para cada Hash
Key muito varivel.
A tabela pequena.
As colunas no so utilizadas como condies em queries.
A maioria das queries recuperam mais de 2 a 4% das linhas.
A tabela atualizada frequentemente.
Cuidado: Uma maior quantidade de ndices nem sempre aumenta o desempenho do banco.
Como criar ndices:
1. Cria-se o Cluster
CREATE CLUSTER CLUSTER_EMPREGADOS (NUM_DEP NUMBER(2));
2. Cria-se o ndice
CREATE INDEX I_CLU_EMPREGADOS_NUMERO_DEPT
ON CLUSTER CLUSTER_EMPREGADOS;
3. Cria-se uma ou mais tabelas no cluster
CREATE TABLE EMPREGADOS_AUX
(NUMERO
NUMBER(4)
CONSTRAINT EMPREGADOS_AUX_NUMBER_PK PRIMARY KEY,
NOME
VARCHAR2(10),
SALARIO
NUMBER(7,2),
NUMERO_DEPT NUMBER(2)
CONSTRAINT EMPREG_AUX_DEP_NUMERO_FK
REFERENCES DEPARTAMENTOS (NUMERO))
CLUSTER CLUSTER_EMPREGADOS (NUMERO_DEPT);
4. Inserem-se os dados na tabela.
INSERT INTO EMPREGADOS_AUX
VALUES(1111, 'CARLOS', 1000, 10);
INSERT INTO EMPREGADOS_AUX
VALUES(2222, 'JOSE', 2000, 20);
INSERT INTO EMPREGADOS_AUX
VALUES(3333, 'SILVIA', 3000, 10);
SELECT *
FROM EMPREGADOS_AUX;
NUMERO
-----------1111
3333
2222
NOME
----------CARLOS
SILVIA
JOSE
SALARIO
-----------1000
3000
2000
NUMERO_DEPT
---------------------10
10
20
66
Observaes:
Desc USER_INDEXES
Name
----------------------INDEX_NAME
TABLE_OWNER
TABLE_NAME
TABLE_TYPE
UNIQUENESS
Null?
--------------NOT NULL
NOT NULL
NOT NULL
Type
--------------------VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(11)
VARCHAR2(9)
...
Desc USER_IND_COLUMNS
Name
----------------------INDEX_NAME
TABLE_NAME
COLUMN_NAME
COLUMN_POSITION
COLUMN_LENGTH
Null?
--------------NOT NULL
NOT NULL
NOT NULL
NOT NULL
NOT NULL
Type
--------------------VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(30)
NUMBER
NUMBER
67
Exemplo 1: Para se recuperar detalhes sobre os ndices que existem para a tabela de
departamentos.
SELECT UI.INDEX_NAME, UI.TABLE_NAME, UI.TABLE_TYPE, UI.UNIQUENESS,
UIC.COLUMN_NAME, UIC.COLUMN_POSITION, UIC.COLUMN_LENGTH
FROM USER_INDEXES UI, USER_IND_COLUMNS UIC
WHERE UI.INDEX_NAME = UIC.INDEX_NAME
AND UI.TABLE_NAME = DEPARTAMENTOS;
Resultado:
INDEX_NAME
TABLE_NAME
TABLE_TYPE
UNIQUENES
COLUMN_NAME
COLUMN_POSITION
COLUMN_LENGTH
DEPARTAMENTOS_NUMERO_PK
DEPARTAMENTOS
TABLE
UNIQUE
NUMERO
1
22
Caso o ndice seja utilizado para garantir uma chave primria ou coluna nica ocorrer o seguinte erro:
ORA-02429: cannot drop index used for enforcement of unique/primary key
Neste caso, para apagar o ndice preciso apagar a constraint correspondente:
ALTER TABLE DEPARTAMENTOS
DROP CONSTRAINT DEPARTAMENTOS_NUMERO_PK
CASCADE;
68
Privilgios de Sistema
Privilgios de Objetos
Create Session
Create User
Create Table
Create Index
Drop User
Drop Any Table
Backup Any Table
Uma das tarefas que um DBA deve executar a criao dos usurios do banco. No basta apenas criar
os usurios. preciso, aps a criao, atribuir direitos a estes usurios.
Exemplo 1: Criao de um usurio e a atribuio de alguns privilgios de sistema.
CREATE USER JULIO IDENTIFIED BY SENHA;
GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE,
SELECT ANY TABLE TO JULIO;
[R72] Comentrio:
ALTER USER ALUNO4
QUOTA 10 M ON
ROLLBACK_DATA
QUOTA 20 K ON SYSTEM
QUOTA 40 M ON
TEMPORARY_DATA
QUOTA UNLIMITED ON
USER_DATA;
REVOKE UNLIMITED
TABLESPACE FROM ALUNO4;
69
Exemplo 2: Como um usurio autorizado pode conceder a JULIO privilgios de objeto sobre a
tabela de DEPARTAMENTOS do usurio CARLOS:
[R74] Comentrio:
Exemplo 3: Como um usurio autorizado pode conceder a JULIO privilgios de objeto sobre
colunas da tabela de DEPARTAMENTOS do usurio CARLOS:
GRANT INSERT (NUMERO, NOME) ON CARLOS.DEPARTAMENTOS TO JULIO;
GRANT UPDATE (NUMERO, NOME) ON CARLOS.DEPARTAMENTOS TO JULIO;
Se um usurio A atribui a um
usurio B um privilgio de
objeto, com a clusula With Grant
Option, o usurio B ter o
direito de atribuir a um usurio
C este privilgio de objeto. Com
a clusula With Admin Option
possvel fazer o mesmo, no
entanto, para privilgios de
sistema.
[R75] Comentrio: Privilgios
de objeto podem ser sobre:
Tabelas
Indices
Prcedures e Functions
Sequences
Views
Snapshots
Sinonimos
[R76] Comentrio: No
possvel atribuir privilgio de
select sobre determinadas colunas.
Para isto ser feito preciso definir
views.
70
Desc DBA_SYS_PRIVS
Name
----------------------GRANTEE
PRIVILEGE
ADMIN_OPTION
Null?
--------------NOT NULL
NOT NULL
Type
--------------------VARCHAR2(30)
VARCHAR2(40)
VARCHAR2(3)
Null?
--------------NOT NULL
NOT NULL
NOT NULL
NOT NULL
NOT NULL
Type
--------------------VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(30)
VARCHAR2(40)
VARCHAR2(3)
Outras Vises
Disponveis para o DBA
DBA_TAB_PRIVS
DBA_COL_PRIVS
Descrio
Todos os privilgios em objetos do banco
Todos os privilgios em colunas de tabelas do banco
71
Vises de Privilgios de
Objetos Disponveis para os
Usurios
USER_TAB_PRIVS
USER_COL_PRIVS
TABLE_PRIVILEGES
COLUMN_PRIVILEGES
Descrio
Privilgios em objetos dos quais o usurio
Grantor ou Grantee.
Privilgios em colunas das quais o usurio
Grantor ou Grantee.
Privilgios em objetos dos quais o usurio
Grantor, Grantee, ou o grupo PUBLIC Grantee.
Privilgios em colunas das quais o usurio
Grantor, Grantee ou o grupo PUBLIC Grantee.
Owner,
Owner,
Owner,
Owner,
72
Gerenciando Roles
Para facilitar a gerncia de concesso de privilgios deve-se atribuir privilgios a perfis (ROLES) e,
ento, designar estes perfis a usurios.
Um perfil contm um certo nmero de privilgios relacionados.
Pode-se criar:
Perfis de Funo, e,
Perfis de Aplicao
CREATE
CREATE
CREATE
CREATE
CREATE
CREATE
SESSION
TABLE
CLUSTER
VIEW
PROCEDURE
TRIGGER
J os usurios finais da aplicao de folha de pagamento poderiam ter a eles associado o perfil
FOLHAPGTO que teria os seguintes privilgios:
CREATE SESSION
EXECUTE sobre as procedures e functions necessrias aplicao.
73
CONNECT
RESOURCE
DBA
EXP_FULL_DATABASE
IMP_FULL_DATABASE
ALTER SESSION
CREATE CLUSTER
CREATE DATABASE LINK
CREATE SEQUENCE
CREATE SESSION
74
CREATE SYNONYM
CREATE TABLE
CREATE VIEW
Role RESOURCE
CREATE
CREATE
CREATE
CREATE
CREATE
CLUSTER
PROCEDURE
SEQUENCE
TABLE
TRIGGER
Role EXP_FULL_DATABASE
Role IMP_FULL_DATABASE
40 Direitos diferentes
Role DBA
77 Direitos diferentes
Descrio
Privilgios de Sistema atribudos a ROLES
Privilgios em tabelas atribudos a ROLES
ROLES que podem ser acessados pelo usurio
Privilgios habilitados que o usurio possui
correntemente.
ROLES atribudos ao usurio.
Privilgios de sistema atribudos a usurios e a ROLES.
Todos os ROLES que existem no banco de dados.
SYSOPER
SYSDBA
75
STARTUP
SHUTDOWN
ALTER DATABASE OPEN/MOUNT
ALTER DATABASE
BACKUP CONTROLFILE
ETC.
76
LISTAS DE EXERCCIOS
77
LISTA N 1
1. possvel emitir um comando Select com a clusula Order By mencionando uma coluna que no
consta da lista de colunas mencionadas no Select?
3. Escreva uma conulta para recuperar, da tabela de empregados, os seguintes dados: Numero, nome
e departamento de todos os empregados lotados no departamento n 10. Salve a query no arquivo
Exerc_01.sql.
Empregado
Departamento
--------------------- -----------------SILVIO LUIS
10
CLAUDIA LINS
20
5. Modifique a query acima para que ela exiba o resultado ordenado descendentemente pelo nmero
do empregado.
6. Escreva uma query para recuperar o nome, sobrenome e nmero do departamento dos empregados
lotados nos departamentos 10 e 30. O resultado dever estar em ordem ascendente de sobrenome.
As colunas nome e sobrenome devero ser apresentadas como se fossem uma nica coluna.
Atribua a esta coluna (resultante da concatenao de nome e sobrenome) o cabealho Nome do
Empregado.
7. Escreva uma query para exibir o nome, sobrenome e salrio de todos os empregados cujo
sobrenome contem um "S".
8. Escreva uma query para listar o nmero, nome, cargo, data de admisso e nmero do departamento
de todos os vendedores contratados em fevereiro de 91 e de todos os vendedores que atualmente
no esto lotados em nenhum departamento.
78
LISTA N 2
3. Escreva uma query para recuperar o nome e sobrenome dos empregados seguidos do cargo que
ocupam entre parentesis. Devem ser recuperados apenas os empregados que ocupam os seguintes
cargos: PRESIDENTE e GERENTE. Essas informaes devem ser listadas conforme vem abaixo:
Nome e Cargo
------------------------------------------------INGO HOFFMANN (PRESIDENTE)
TERESA AGUIAR (GERENTE)
CHICO SERRA (GERENTE)
CELIO SILVA (GERENTE)
4. Escreva uma query para recuperar nome e salario e nmero de semanas desde a data de admisso
(com arredondamento de 2 casas decimais) de todos os empregados contratados a mais de 350
semanas.
5. Escreva uma query para recuperar o nome e o nmero de meses de trabalho de todos os
empregados da empresa a partir de suas datas de admisso.
6. Recuperar para cada empregado seu nome e data de admisso no formato DD/MM/YY HH:MI:SS.
7. Escreva uma query para recuperar o nome e salrio dos empregados no formato abaixo.
8. Escreva uma query para recuperar o nome e o percentual de comisso dos empregados acrescido
de 3%. Aqueles que no possuirem % de comisso (% de comisso nulo) devem aparecer com 3%.
79
LISTA N 3
1. Escreva uma query para recuperar o nome dos empregados e o nmero e nome de seus
departamentos.
2. Escreva uma query para recuperar o nome dos empregados e o nome dos projetos nos quais eles
trabalham.
3. Escreva uma query para recuperar o nome, sobrenome e nome do departamento onde ARMANDO
trabalha.
4. Escreva uma query para recuperar o nome dos produtos utilizados nos diversos projetos
controlados pelos departamentos. Deseja-Se que o resultado seja apresentado conforme vem
abaixo:
DEPTO
-------------COMPRAS
COMPRAS
COMPRAS
MARKETING
MARKETING
VENDAS
VENDAS
VENDAS
VENDAS
PRODUTO
-------------PROD1
PROD2
PROD4
PROD2
PROD3
PROD1
PROD2
PROD3
PROD4
80
LISTA N 4
1. Escreva uma query para recuperar o maior, o menor salrio e a diferena entre o maior e o menor
salrio existente na tabela de empregados.
2. Escreva uma query para contar o nmero de gerentes existentes na tabela de empregados.
3. Escreva uma query para recuperar o nome dos empregados seguido do nmero de dependentes que
possuem.
4. Escreva uma query para recuperar, para cada gerente, o seu numero e o menor salrio pago a um
de seus subordinados. No devem ser considerados os grupos cujos salrios sejam inferior a
1000,00 reais. Ordene o resultado por salrio.
81
LISTA N 5
1. Recupere o nome dos empregados que trabalham nos projetos em que TERESA trabalha.
3. Recupere o nmero, nome e sobrenome dos empregados que ganham mais do que a mdia salarial
da empresa e esto subordinados a um gerente que possua a letra T no nome.
4. Recupere o nome e salrio de todos os empregados que ganham o salrio mximo pago aos
empregados de cada departamento.
82
LISTA N 6
1. Adicione uma linha tabela de PRODUTOS. O nmero do produto 1216, seu nome PROD5 e
sua cor, AMARELO. Antes de emitir o comando INSERT d um DESCRIBE em PRODUTOS
para tomar conhecimento do tipo de cada coluna.
2. Emita o mesmo comando novamente. Qual foi a mensagem de erro apresentada?
_________________________________________________________________________
3. Adicione uma linha tabela de PRODUTOS_PROJETOS. O nmero do produto 1216, o
nmero do projeto onde este produto foi utilizado 4, a data da utilizao 25 de julho de 1995 e
a quantidade utilizada nesta data foi de 67 unidades do produto. D um DESCRIBE em
PRODUTOS_PROJETOS para tomar conhecimento do tipo de cada coluna. A insero foi
realizada com sucesso? ____________
4. Adicione outra linha tabela de PRODUTOS_PROJETOS. O nmero do produto 1217, o
nmero do projeto onde este produto foi utilizado 3, a data da utilizao 10 de outubro de 1994
e a quantidade utilizada nesta data foi de 22 unidades do produto. A insero foi realizada com
sucesso? Porqu? _______________________________________________
_________________________________________________________________________
5. Troque a cor do produto 1216 para AZUL.
6. Troque o nmero do DEPARTAMENTO 10 para 50. O que aconteceu?
7. Delete todos os dependentes do empregado nmero 7499.
8. Logue-se mais uma vez no SQL*PLUS e execute o comando abaixo:
SELECT *
FROM DEPENDENTES;
Os 3 dependentes do empregado nmero 7499 foram deletados? Porqu? _____________
_________________________________________________________________________
9. Ainda na segunda sesso do SQL*PLUS, troque o nome do dependente LUCIO para LUCIO
ALVES. Voc conseguiu? Porqu? ____________________________________
_________________________________________________________________________
10. Coloque as duas janelas do SQL*PLUS lado a lado e, em seguida, execute o comando COMMIT
na primeira sesso do SQL*PLUS. Observe o que vai acontecer na outra sesso. Quantas linhas
foram atualizadas? _____________
Ocorreu algum tipo de erro?
Porqu?
_________________________________________________________________________
Feche a segunda sesso aberta no SQL*PLUS.
83
LISTA N 7
Numero
PK
Number
4
Data_Pedido Numero_Cliente
NN
FK
Date
Number
5
Observacoes
Varchar2
255
Observao:
PK
FK
U
NN
CK
Primary Key
Foreign Key
Unique
Not Null
Check
Exemplo:
Seguindo a conveno acima a constraint Primary Key da tabela de clientes teria o seguinte nome:
CLIENTES_CODIGO_PK.
84
LISTA N 8
NUMERO
NOME
SOBRENOME
3. Crie uma seqncia para ser utilizada na gerao de nmeros de chave primria da tabela de
PROJETOS. A seqncia deve comear com o nmero 5, o incremento deve ser de 1 e o nome da
seqncia deve ser PROJETOS_NUMERO_SEQ. Permita que a seqncia faa um cache de 3
nmeros (o default de 20).
4. Descreva em que situaes um ndice criado automaticamente:
85
LISTA N 9
1. Executar o comando CREATE USER suficiente para que o usurio criado tenha acesso a um
banco de dados? Porqu? ________________________________________________
_________________________________________________________________________
3. Se voc um DBA e pretende criar muitos usurios com os mesmos privilgios de sistema. O que
voc faria para tornar este trabalho mais fcil? ______________________________
_________________________________________________________________________
86
BIBLIOGRAFIA
Livros:
C. Batini, S. Ceri, S. Navathe, Conceptual Database Design, The Benjamin Cummings Publishing Company, Inc.,
1992.
Manuais Oracle:
87