Você está na página 1de 54

Projeto e Organizao de BD

Linguagem SQL
Data Definition Language
Linguagem SQL

O Modelo Relacional prev, desde sua


concepo, a existncia de uma
linguagem baseada em caracteres que
suporte a definio do esquema fsico
(tabelas, restries, etc.), e sua
manipulao (insero, consulta,
atualizao e remoo)
Linguagem SQL
A Linguagem SQL (Structured Query Language)
padro para SGBDs Relacionais
padro ANSI (American National Standards Institute)
ANSI X3.135-1986 = ISO/IEC 9075:1987
ANSI X3.135-1989 = ISO/IEC 9075:1989
ANSI X3.135-1992 = ISO/IEC 9075:1992 (SQL2)
ANSI X3.135.10-1998 substitudo pelo SQL1999
ANSI X3.135-1999 = ISSO/IEC 9075:1999
Embora seja capaz de prover acesso facilitado aos
dados, a linguagem SQL possui certas limitaes,
como a impossibilidade de manipular uma tabela
linha-a-linha, exigindo sua extenso, neste caso,
atravs da definio de cursores
Conjuntos de Comandos da
Linguagem SQL
A Linguagem SQL pode ser dividida em
5 conjuntos de comandos:
Recuperao de dados: comando SELECT
Linguagem de manipulao de dados
(DML - Data Manipulation Language):
comandos para inseres (INSERT),
atualizaes (UPDATE) e excluses
(DELETE)
Conjuntos de Comandos da
Linguagem SQL
Linguagem de definio de dados (DDL -
Data Definition Language): comandos para
criao e manuteno de objetos do banco
de dados: CREATE, ALTER, DROP,
RENAME e TRUNCATE
Linguagem para controle de transaes:
COMMIT, ROLLBACK e SAVEPOINT
Linguagem para controle de acesso a
dados: GRANT e REVOKE
Cdigo Armazenado no Banco de
Dados
O Modelo Relacional no previa,
originalmente, a possibilidade de armazenar
trechos de cdigo no banco de dados. No
entanto, foi adaptado para permitir a
definio de
Stored Procedures: trechos de cdigo escritos em
linguagem SQL, armazenados no BD, e que
podem ser ativados a partir de aplicaes-cliente,
comandos SQL, outras stored procedures, etc.
Triggers: trechos de cdigo armazenados no BD
ativados automaticamente aps determinados
eventos
Cdigo Armazenado no Banco de
Dados
No Oracle, os trechos de cdigo
armazenado (triggers, stored
procedures e stored functions) so
criados utilizando-se a linguagem PL-
SQL
PL-SQL uma linguagem de
programao de cdigo procedural
Exemplo de Trigger
create trigger t_itens_pedidos after insert or update or
delete on pedidos_produtos for each row
begin
if inserting or updating then
update pedidos
set valor_total = valor_total + :new.valor *
:new.quantidade
where num_pedido = :new.num_pedido;
endif;
if deleting or updating then
update pedidos
set valor_total = valor_total - :old.valor *
:old.quantidade
where num_pedido = :old.num_pedido;
endif;
end;
/
Exemplo de Stored Procedure
create procedure reajusta_precos (percentual in
number) as
begin
update produtos
set preco = preco * (1 + percentual/100);
end
/
Apresentao do Estudo de Caso

O Estudo de caso aqui utilizado visa


modelar a realidade de uma livraria
So apresentados os esquemas
conceitual, lgico e fsico
Todas as tabelas esto populadas e
sobre estas devem ser executados os
exerccios
CREATE TABLE tipos_telefones (
cod_tipo_telefone NUMBER ( 2 ) NOT NULL,
descricao VARCHAR2 ( 20 ) NOT NULL,
CONSTRAINT PK_TIPOS_TELEFONES PRIMARY KEY (cod_tipo_telefone)
) TABLESPACE TSP_CURSOSQL
/
CREATE TABLE administradores (
cod_administrador NUMBER ( 6 ) NOT NULL,
nivel_privilegio NUMBER ( 1 ) NOT NULL,
CONSTRAINT PK_ADMINISTRADORES PRIMARY KEY (cod_administrador)
) TABLESPACE TSP_CURSOSQL
/
CREATE TABLE clientes_enderecos (
cod_cliente NUMBER ( 6 ) NOT NULL,
cod_endereco NUMBER ( 2 ) NOT NULL,
data_cadastro DATE NOT NULL,
CONSTRAINT PK_CLIENTES_ENDERECOS PRIMARY KEY (cod_cliente, cod_endereco)
) TABLESPACE TSP_CURSOSQL
/
CREATE TABLE produtos (
cod_produto NUMBER ( 5 ) NOT NULL,
titulo VARCHAR2 ( 200 ) NOT NULL,
ano_lancamento DATE NOT NULL,
importado CHAR ( 1 ) NOT NULL,
preco NUMBER ( 10, 2 ) NOT NULL,
prazo_entrega NUMBER ( 3 ) NOT NULL,
CONSTRAINT PK_PRODUTOS PRIMARY KEY (cod_produto),
CONSTRAINT CHK_PROD_IMPORTADO CHECK (importado in ('S','N'))
) TABLESPACE TSP_CURSOSQL
/
CREATE TABLE enderecos (
cod_endereco NUMBER ( 2 ) NOT NULL,
rua VARCHAR2 ( 30 ) NOT NULL,
numero NUMBER ( 5 ) NOT NULL,
complemento VARCHAR2 ( 20 ),
cod_cidade NUMBER ( 4 ) NOT NULL,
cep CHAR ( 8 ) NOT NULL,
CONSTRAINT PK_ENDERECOS PRIMARY KEY (cod_endereco)
) TABLESPACE TSP_CURSOSQL
/
CREATE TABLE telefones (
cod_cliente NUMBER ( 6 ) NOT NULL,
cod_telefone NUMBER ( 2 ) NOT NULL,
cod_tipo_telefone NUMBER ( 2 ) NOT NULL,
ddd NUMBER ( 3 ),
numero VARCHAR2 ( 10 ) NOT NULL,
CONSTRAINT PK_TELEFONES PRIMARY KEY (cod_cliente, cod_telefone)
) TABLESPACE TSP_CURSOSQL
/
CREATE TABLE clientes (
cod_cliente NUMBER ( 6 ) NOT NULL,
data_nascimento DATE,
data_cadastro DATE NOT NULL,
CONSTRAINT PK_CLIENTES PRIMARY KEY (cod_cliente)
) TABLESPACE TSP_CURSOSQL
/
CREATE TABLE estados (
uf CHAR ( 2 ) NOT NULL,
nome VARCHAR2 ( 20 ) NOT NULL,
regiao CHAR ( 2 ) NOT NULL,
CONSTRAINT PK_ESTADOS PRIMARY KEY (uf)
) TABLESPACE TSP_CURSOSQL
/
CREATE TABLE usuarios (
cod_usuario NUMBER ( 6 ) NOT NULL,
nome VARCHAR2 ( 100 ) NOT NULL,
cpf CHAR ( 11 ) NOT NULL,
email VARCHAR2 ( 40 ) NOT NULL,
username VARCHAR2 ( 20 ) NOT NULL,
password VARCHAR2 ( 20 ) NOT NULL,
CONSTRAINT PK_USUARIOS PRIMARY KEY (cod_usuario),
CONSTRAINT AK_USU_CPF UNIQUE (cpf),
CONSTRAINT AK_USU_USERNAME UNIQUE (username)
) TABLESPACE TSP_CURSOSQL
/
CREATE TABLE cidades (
cod_cidade NUMBER ( 4 ) NOT NULL,
nome VARCHAR2 ( 40 ) NOT NULL,
uf CHAR ( 2 ) NOT NULL,
CONSTRAINT PK_CIDADES PRIMARY KEY (cod_cidade)
) TABLESPACE TSP_CURSOSQL
/
CREATE TABLE pedidos_produtos (
num_pedido NUMBER ( 7 ) NOT NULL,
cod_produto NUMBER ( 5 ) NOT NULL,
quantidade NUMBER ( 3 ) NOT NULL,
valor_unitario NUMBER ( 10, 2 ) NOT NULL,
CONSTRAINT PK_PEDIDOS_PRODUTOS PRIMARY KEY (num_pedido, cod_produto)
) TABLESPACE TSP_CURSOSQL
/
CREATE TABLE autores (
cod_autor NUMBER ( 4 ) NOT NULL,
nome VARCHAR2 ( 100 ) NOT NULL,
descricao VARCHAR2 ( 1024 ),
CONSTRAINT PK_AUTORES PRIMARY KEY (cod_autor)
) TABLESPACE TSP_CURSOSQL
/
CREATE TABLE pedidos (
num_pedido NUMBER ( 7 ) NOT NULL,
cod_cliente NUMBER ( 6 ) NOT NULL,
cod_endereco NUMBER ( 2 ) NOT NULL,
data_emissao DATE NOT NULL,
CONSTRAINT PK_PEDIDOS PRIMARY KEY (num_pedido)
) TABLESPACE TSP_CURSOSQL
/
CREATE TABLE autores_produtos (
cod_autor NUMBER ( 4 ) NOT NULL,
cod_produto NUMBER ( 5 ) NOT NULL,
CONSTRAINT PK_AUTORES_PRODUTOS PRIMARY KEY (cod_autor, cod_produto)
) TABLESPACE TSP_CURSOSQL
/
ALTER TABLE administradores ADD ( CONSTRAINT FK_USU_ADM FOREIGN KEY (cod_administra
REFERENCES usuarios (cod_usuario))
/
ALTER TABLE clientes_enderecos ADD ( CONSTRAINT FK_CLI_CLIEND FOREIGN KEY (cod_clien
REFERENCES clientes (cod_cliente))
/
ALTER TABLE clientes_enderecos ADD ( CONSTRAINT FK_END_CLIEND FOREIGN KEY (cod_endereco)
REFERENCES enderecos (cod_endereco))
/
ALTER TABLE enderecos ADD ( CONSTRAINT FK_CID_END FOREIGN KEY (cod_cidade)
REFERENCES cidades (cod_cidade))
/
ALTER TABLE telefones ADD ( CONSTRAINT FK_CLI_TEL FOREIGN KEY (cod_cliente)
REFERENCES clientes (cod_cliente))
/
ALTER TABLE telefones ADD ( CONSTRAINT FK_TIPTEL_TEL FOREIGN KEY (cod_tipo_telefone)
REFERENCES tipos_telefones (cod_tipo_telefone))
/
ALTER TABLE clientes ADD ( CONSTRAINT FK_USU_CLI FOREIGN KEY (cod_cliente)
REFERENCES usuarios (cod_usuario))
/
ALTER TABLE cidades ADD ( CONSTRAINT FK_EST_CID FOREIGN KEY (uf)
REFERENCES estados (uf))
/
ALTER TABLE pedidos_produtos ADD ( CONSTRAINT FK_PED_PEDPROD FOREIGN KEY (num_pedido)
REFERENCES pedidos (num_pedido))
/
ALTER TABLE pedidos_produtos ADD ( CONSTRAINT FK_PROD_PEDPROD FOREIGN KEY (cod_produto)
REFERENCES produtos (cod_produto))
/
ALTER TABLE pedidos ADD ( CONSTRAINT FK_CLIEND_PED FOREIGN KEY (cod_cliente, cod_endereco)
REFERENCES clientes_enderecos (cod_cliente, cod_endereco))
/
ALTER TABLE autores_produtos ADD ( CONSTRAINT FK_AUT_AUTPROD FOREIGN KEY (cod_autor)
REFERENCES autores (cod_autor))
/
ALTER TABLE autores_produtos ADD ( CONSTRAINT FK_PRD_AUTPROD FOREIGN KEY (cod_produto)
REFERENCES produtos (cod_produto))
Linguagem de definio de dados
(DDL)
A linguagem de definio de dados
permite a criao, manuteno e
eliminao de objetos do banco de
dados:
tabelas
vises
ndices
seqncias
sinnimos
Convenes de Nomes

Devem comear com uma letra


Pode ter de 1 a 30 caracteres
Pode conter somente A-Z, a-z, 0-9, _, $
e#
Os nomes devem ser nicos por
usurio
No podem ser utilizadas palavras
reservadas (salvo se entre aspas)
Tipos de Dados Bsicos

CHAR(tamanho): seqncia de
caracteres de tamanho fixo
VARCHAR(tamanho): seqncia de
caracteres de tamanho varivel
NUMBER(total, decimais): valores
numricos
DATE: data e hora
Tipos de Dados para Caracteres

CHAR(tamanho [BYTE | CHAR]): at 2000 bytes


Alocao de bytes o padro, mas podem ser alocados
CHARs, em formato Unicode
NCHAR(tamanho): at 2000 bytes em alocao
Unicode (2 ou 3 bytes por caracter)
VARCHAR2 ou VARCHAR(tamanho [BYTE |
CHAR]): at 4000 bytes
NVARCHAR2: at 4000 bytes
CLOB: at 232 1 bytes (4 GB)
NCLOB: at 232 1 bytes (4 GB) em alocao
Unicode
LONG: at 231 1 bytes (2 GB), mantido para
compatibilidade
Tipos de Dados para Data e Tempo

DATE: ano, ms, dia, hora, minuto, segundo,


armazenados em 7 bytes
INTERVAL DAY (preciso) TO SECOND
(preciso): intervalos entre duas datas em dias,
horas, minutos e segundos
INTERVAL (preciso) YEAR TO MONTH: intervalo
entre duas datas em anos e meses
TIMESTAMP (preciso): valores de instantes de
tempo com preciso de at 9 casas decimais nos
segundos
TIMESTAMP (preciso) WITH TIME ZONE: inclui a
informao do fuso horrio
TIMESTAMP (preciso) WITH LOCAL TIME ZONE:
recupera a informao ajustada ao fuso horrio local
Tipos de Dados Binrios

BLOB: at 232 1 bytes (4 GB) de


dados binrios armazenados no banco
de dados
BFILE: at 232 1 bytes (4 GB) de
dados binrios armazenados em
arquivos externos
RAW (tamanho): armazena at 2000
bytes, mantido para compatibilidade
LONG RAW: at 231 1 bytes (2 GB) ,
mantido para compatibilidade
Comando CREATE TABLE

Permite a criao de uma tabela:


CREATE TABLE nome_da_tabela (
nome_da_coluna tipo_de_dado [NULL|NOT
NULL] restries_de_coluna, ...
restries_de_tabela);
CREATE TABLE autores (
cod_autor NUMBER (4) NOT NULL,
nome VARCHAR2 (100) NOT NULL,
descricao VARCHAR2 (1024)
);
Restries de Integridade
Integridade de Entidade
Toda a tabela deve possuir,
obrigatoriamente, uma coluna (ou uma
composio de colunas) cujo valor nico
para todas as instncias CHAVE
PRIMRIA (PK)
Eventualmente, outras colunas alm da
chave primria podem ser nicas CHAVE
ALTERNATIVA (AK)
Restries de Integridade
Integridade de Domnio
Cada coluna da tabela tem seus valores
restringidos por
tipos de dados: definem o domnio de uma coluna
cod_cliente NUMBER ( 6 )
username VARCHAR2 ( 20 )
Restries a valores nulos: definem se as
colunas sero obrigatrias ou opcionais
email VARCHAR2 ( 40 ) NOT NULL
ddd NUMBER ( 3 )
Restries de Integridade
Integridade de Domnio
valores padro: define um valor padro a
ser associado a uma coluna se no for
fornecido valor (ou for explicitamente
fornecido um valor NULL) para esta
durante a insero

importado CHAR ( 1 ) DEFAULT 'N' NOT NULL

A definio de valores padres particularmente


importante para colunas NOT NULL
Restries de Integridade
Integridade de Domnio
restries de validao: restringem os
valores que podem ser atribudos a uma
coluna
CONSTRAINT CHK_PROD_IMPORTADO
CHECK (importado in ('S','N'))
tipos definidos pelo usurio: tipo de dado
construdo a partir de tipos pr-definidos,
contendo restrio a valores nulos, regras
de validao e um valor padro
No disponvel em todos os SGBDs
Restries de Integridade
Integridade Referencial
As restries de integridade referencial
garantem a consistncia dos relacionamentos
entre as tabelas
Restries de Integridade
Integridade Referencial
No exemplo, a definio da restrio de
integridade referencial seria criada como
segue

CONSTRAINT FK_EST_CID FOREIGN KEY (uf)


REFERENCES estados (uf)

Esta restrio estabelece uma relao entre


o atributo uf da tabela CIDADES e a chave
primria da tabela ESTADOS
Restries de Integridade
Integridade Referencial
O SGBD deve prover mecanismos para
assegurar que a restrio de integridade seja
respeitada, ou seja, uma linha violando a
restrio de integridade referencial no
poder existir;
Estes mecanismos prevem a execuo de
uma ao em resposta a uma atualizao, a
fim de manter a integridade referencial.
Restries de Integridade
Integridade Referencial
Existem diferentes aes possveis para
evitar que uma operao de atualizao viole
as restries de integridade referencial
RESTRICT: impede a execuo da operao
Inserir uma Sala situada em um Prdio no
existente
CASCADE: propaga a operao para respeitar
as restries de integridade referencial
Remover uma Disciplina do Currculo,
removendo todos os Pr-requisitos associados a
esta
Restries de Integridade
Integridade Referencial
SET NULL: assegura as restries de
integridade referencial associando um valor
NULL chave estrangeira que poderia viol-las
Remover um Professor, fazendo com que a
coluna matricula_professor em
DISCIPLINAS_TURMAS fosse atualizada para
NULL em todas as disciplinas que atua
NULL no considerado um valor, portanto, no
fere as restries de integridade referencial
SET DEFAULT: semelhante ao de SET
NULL, mas associa um valor padro chave
estrangeira
Restries de Integridade
Integridade Definida pelo Usurio
O Projetista do Banco de Dados pode definir
restries de integridade complexas,
utilizando, por exemplo, o conceito de
triggers
Triggers so pores de cdigo ativadas
aps certos eventos (insero, atualizao
ou excluso de linhas da tabela)
Restries de Integridade de Tabelas

CONSTRAINT nome_da_restrio
PRIMARY KEY (colunas)
CONSTRAINT nome_da_restrio
FOREIGN KEY (colunas) REFERENCES
nome_da_tabela_pai [ON DELETE
CASCADE]
CONSTRAINT nome_da_restrio
UNIQUE (colunas)
CONSTRAINT nome_da_restrio
CHECK (expressao)
Restries de Integridade de Colunas

CONSTRAINT nome_da_restrio NOT NULL


CONSTRAINT nome_da_restrio PRIMARY
KEY
CONSTRAINT nome_da_restrio
REFERENCES nome_da_tabela_pai [ON
DELETE CASCADE]
CONSTRAINT nome_da_restrio UNIQUE
CONSTRAINT nome_da_restrio CHECK
(expressao)
Exemplo
create table usuarios (
cod_usuario number ( 6 ),
nome varchar2 ( 100 )
constraint nn_usu_nome not null,
cpf char ( 11 )
constraint nn_usu_cpf not null,
email varchar2 ( 40 )
constraint nn_usu_email not null,
username varchar2 ( 20 )
constraint nn_usu_username not null,
password varchar2 ( 20 )
constraint nn_usu_password_not null,
constraint pk_usuarios primary key
(cod_usuario),
constraint ak_usu_cpf unique (cpf),
constraint ak_usu_username unique (username));
Exemplo
create table produtos (
cod_produto number ( 5 ) not null,
titulo varchar2 ( 200 ) not null,
ano_lancamento date not null,
importado char ( 1 ) not null,
preco number ( 10, 2 ) not null,
prazo_entrega number ( 3 ) not null,
constraint pk_produtos
primary key (cod_produto),
constraint chk_prod_importado
check (importado in (S',N'))
);
Exemplo
create table administradores (
cod_administrador number ( 6 ),
nivel_privilegio number ( 1 ) not null,
constraint pk_administradores primary
key (cod_administrador),
constraint fk_usu_adm foreign key
(cod_administrador) references usuarios
(cod_usuario)
);
Definindo Valores Padro
Pode ser definido um valor padro para uma
coluna (literais, expresses ou funes)
Se no for definido um valor, ser utilizado o
padro
create table pedidos (
num_pedido number ( 7 ),
cod_cliente number ( 6 ) not null,
cod_endereco number ( 2 ) not null,
data_emissao date not null default
sysdate,
constraint pk_pedidos primary key
(num_pedido));
Utilizando Valores Padro
insert into pedidos (num_pedido,
cod_cliente, cod_endereco)
values (17645, 540, 290);
Foi omitida a coluna data_emisso,
logo, ser utilizado o valor padro
insert into pedidos (num_pedido,
cod_cliente, cod_endereco,
data_emissao)
values (17645, 540, 290, NULL);
Foi explicitamente definido NULL
Consultando o Dicionrio de Dados

USER_TABLES: informaes sobre as


tabelas do usurio
USER_OBJECTS: informaes completas
sobre todos os diferentes tipos de objetos
(object_type) do usurio
USER_CATALOG ou CAT: lista de todos os
objetos e seus respectivos tipos
Consultas sobre estas tabelas (vises)
fornecem informaes teis
Verificando as Constraints

A tabela (viso) user_constraints inclui


informaes sobre todas as constraints do
usurio
select constraint_name,
constraint_type, search_condition
from user_constraints
where ...;
A tabela (viso) user_cons_columns mostra
as colunas envolvidas em cada constraint
Criando uma Tabela a Partir de uma
Consulta
SQL permite a criao de uma tabela a partir
do resultado de uma consulta:
CREATE TABLE nome_da_tabela (colunas)
AS
select ...
CREATE TABLE teste (cod_cliente,
nome_cliente) AS
select u.cod_usuario, u.nome
from usuarios u
where u.cod_cliente in (
select c.cod_cliente
from clientes c);
Comando ALTER TABLE
Permite a alterao de uma tabela
ALTER TABLE nome_da_tabela
[ADD definio de coluna,]
[MODIFY definio de coluna,]
[DROP COLUMN nome,]
[RENAME COLUMN antigo TO novo,]
[ADD definio de constraint,]
[MODIFY CONSTRAINT definio de
constraint,]
[DROP CONSTRAINT nome,]
[RENAME CONSTRAINT antigo TO novo,]
[ENABLE | DISABLE constraint,]
[RENAME TO novo_nome];
Exemplo
alter table pedidos
add valor_total number(10,2);
alter table enderecos
modify cod_endereco number(3);
alter table autores
drop column descricao;
alter table clientes
rename column cod_usuario to
cod_cliente;
alter table produtos
add constraint chk_prod_prazo
check(prazo between 3 and 30);
Exemplo

alter table produtos


add constraint chk_prod_prazo
check(prazo between 3 and
30);
alter table produtos
drop constraint
chk_prod_importado;
Exemplo
alter table enderecos
modify cod_endereco number(3);
alter table produtos
add constraint chk_prod_prazo
check(prazo between 3 and 30);
alter table usuarios
disable constraint pk_usuarios;
alter table usuarios
enable constraint pk_usuarios;
alter table pedidos_produtos
rename to itens_pedidos;
Comando DROP TABLE

Permite a eliminao de uma tabela:


DROP TABLE nome_da_tabela
[CASCADE CONSTRAINTS];
drop table tipos_telefones
cascade constraints;
Comando TRUNCATE TABLE

Permite a eliminao de todas as linhas


de uma tabela, de forma rpida e
liberando o espao alocado, sem
possibilitar a execuo de rollback:
TRUNCATE TABLE nome_da_tabela;
Comando CREATE INDEX

Para criar ndices deve ser utilizado o


comando CREATE INDEX
CREATE [UNIQUE] INDEX nome ON
tabela(colunas);
create index idx_usu_nome on
usuarios (nome);
O comando DROP INDEX pode ser
utilizado para eliminar um ndice
Quando Criar ndices?

A coluna usada freqentemente nas


clusulas WHERE ou em joins
A coluna contm inmeros valores
distintos
A coluna contm muitos NULL
A tabela tem muitas linhas e as
consultas normalmente retornam
poucas linhas
Quando no Criar ndices?

A tabela pequena
As colunas no aparecem em
condies ou joins
As consultas retornam muitas linhas
A tabela atualizada muito
freqentemente
Utilizando Sinnimos
Sinnimos so nomes alternativos pelos
quais podem ser conhecidos os objetos do
banco de dados (tabelas, vises, sequences,
stored procedures, etc.)
Sinnimos podem ser pblicos, acessveis
por todos os usurios, ou privados
CREATE [PUBLIC] SYNONYM nome FOR
objeto;
create public synonym usuarios for
cursosql.usuarios;
O comando DROP SYNONYM pode ser
utilizado para eliminar um sinnimo

Você também pode gostar