Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

Linguagem SQL
Prof. Paulo Sena
Linguagem SQL
 O Modelo Relacional prevê, desde sua 
concepção, a existência de uma 
linguagem baseada em caracteres que 
suporte a definição do esquema físico 
(tabelas, restrições, etc.), e sua 
manipulação (inserção, consulta, 
atualização e remoção)
Linguagem SQL
 A Linguagem SEQUEL ou SQL (Structured Query 
Language) é padrão para SGBDs Relacionais.
 Embora seja capaz de prover acesso facilitado aos 
dados, a linguagem SQL possui certas limitações, 
como a impossibilidade de manipular uma tabela 
linha-a-linha, exigindo sua extensão, neste caso, 
através da definição de cursores e cláusulas.
Conjuntos de Comandos da 
Linguagem SQL
 A Linguagem SQL pode ser dividida em 
5 conjuntos de comandos:
Conjuntos de Comandos da 
Linguagem SQL
– Linguagem de consulta de dados (DQL –
Data Query Language): comando SELECT
– Linguagem de manipulação de dados 
(DML - Data Manipulation Language): 
comandos para inserções (INSERT), 
atualizações (UPDATE) e exclusões 
(DELETE)
Conjuntos de Comandos da 
Linguagem SQL
– Linguagem de definição de dados (DDL -
Data Definition Language): comandos para 
criação e manutenção de objetos do banco 
de dados: CREATE, ALTER, DROP
– Linguagem para controle de transações: 
BEGIN, COMMIT, ROLLBACK
– Linguagem para controle de acesso a 
dados: GRANT e REVOKE
Apresentação do Estudo de Caso
 O Estudo de caso aqui utilizado visa 
modelar a realidade de uma livraria
 São apresentados os esquemas 
conceitual, lógico e físico
 Todas as tabelas estão “populadas” e 
sobre estas devem ser executados os 
exercícios
Linguagem de Definição de 
Dados (DDL)
Linguagem de definição de dados 
(DDL)
 A linguagem de definição de dados 
permite a criação, manutenção e 
eliminação de objetos do banco de 
dados:
– tabelas
– visões
– índices
– seqüências
– sinônimos
SQL - DDL
 Criação de um BD
– SQL padrão não oferece tal comando
• BDs são criados via ferramentas do SGBD
– alguns SGBDs (SQL Server, DB2, MySQL) 
oferecem este comando
• create database nome_BD
• drop database nome_BD
SQL - DDL
 Comandos para definição de esquemas
– create table
• define a estrutura da tabela, suas restrições de 
integridade e cria uma tabela vazia
– alter table
• modifica a definição de uma tabela 
– drop table
• remove uma tabela com todas as suas tuplas
Convenções de Nomes
 Devem começar 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 
usuário
 Não podem ser utilizadas palavras 
reservadas (salvo se entre aspas)
Tipos de Dados Básicos
 CHAR(tamanho): seqüência de 
caracteres de tamanho fixo
 VARCHAR(tamanho): seqüência de 
caracteres de tamanho variável
 NUMBER(total, decimais): valores 
numéricos
 DATE: data e hora
Tipos de Dados para Caracteres
 CHAR(tamanho [BYTE | CHAR]): até 2000 bytes
– Alocação de bytes é o padrão, mas podem ser alocados 
CHARs, em formato Unicode
 NCHAR(tamanho): até 2000 bytes em alocação 
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 alocação 
Unicode
 LONG: até 231 – 1 bytes (2 GB), mantido para 
compatibilidade
Tipos de Dados para Data e Tempo
 DATE: ano, mês, dia, hora, minuto, segundo, 
armazenados em 7 bytes
 INTERVAL DAY (precisão) TO SECOND (precisão): 
intervalos entre duas datas em dias, horas, minutos e 
segundos
 INTERVAL (precisão) YEAR TO MONTH: intervalo 
entre duas datas em anos e meses
 TIMESTAMP (precisão): valores de instantes de 
tempo com precisão de até 9 casas decimais nos 
segundos
 TIMESTAMP (precisão) WITH TIME ZONE: inclui a 
informação do fuso horário
 TIMESTAMP (precisão) WITH LOCAL TIME ZONE: 
recupera a informação ajustada ao fuso horário local
Tipos de Dados Binários
 BLOB: até 232 – 1 bytes (4 GB) de 
dados binários armazenados no banco 
de dados
 BFILE: até 232 – 1 bytes (4 GB) de 
dados binários 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 criação de uma tabela:
– CREATE TABLE nome_da_tabela (
nome_da_coluna tipo_de_dado [NULL|NOT 
NULL] restrições_de_coluna, ...
restrições_de_tabela);
 Exemplo:
– CREATE TABLE autores (
cod_autor NUMBER (4) NOT NULL,
nome VARCHAR2 (100) NOT NULL,
descricao VARCHAR2 (1024)
);
Restrições de integridade
 Integridade de Entidade
 Integridade de Domínio
 Integridade Referencial
 Integridade definida pelo usuário
Restrições de Integridade
Integridade de Entidade
 Toda a tabela deve possuir, 
obrigatoriamente, uma coluna (ou uma 
composição de colunas) cujo valor é único 
para todas as instâncias  CHAVE 
PRIMÁRIA (PK)
 Eventualmente, outras colunas além da 
chave primária podem ser únicas  CHAVE 
ALTERNATIVA (AK)
Restrições de Integridade
Integridade de Domínio
 Cada coluna da tabela tem seus valores 
restringidos por
– tipos de dados: definem o domínio de uma coluna
– cod_cliente NUMBER ( 6 )
– username VARCHAR2 ( 20 )
 Restrições a valores nulos: definem se as 
colunas serão obrigatórias ou opcionais
– email VARCHAR2 ( 40 ) NOT NULL
– ddd NUMBER ( 3 )
Restrições de Integridade
Integridade de Domínio
– valores padrão: define um valor padrão a 
ser associado a uma coluna se não for 
fornecido valor (ou for explicitamente 
fornecido um valor NULL) para esta 
durante a inserção
importado CHAR ( 1 ) DEFAULT 'N' NOT NULL
– A definição de valores padrões é particularmente 
importante para colunas NOT NULL
Restrições de Integridade
Integridade de Domínio
– restrições de validação: restringem os 
valores que podem ser atribuídos a uma 
coluna
CONSTRAINT CHK_PROD_IMPORTADO 
CHECK (importado in ('S','N'))
– tipos definidos pelo usuário: tipo de dado 
construído a partir de tipos pré-definidos, 
contendo restrição a valores nulos, regras 
de validação e um valor padrão
• Não disponível em todos os SGBDs
Restrições de Integridade
Integridade Referencial
 As restrições de integridade referencial 
garantem a consistência dos relacionamentos 
entre as tabelas
Restrições de Integridade
Integridade Referencial
 No exemplo, a definição da restrição de 
integridade referencial seria criada como 
segue
CONSTRAINT FK_EST_CID FOREIGN KEY (uf) 
REFERENCES estados (uf)
 Esta restrição estabelece uma relação entre 
o atributo uf da tabela CIDADES e a chave 
primária da tabela ESTADOS
Restrições de Integridade
Integridade Referencial
 O SGBD deve prover mecanismos para 
assegurar que a restrição de integridade seja 
respeitada, ou seja, uma linha violando a 
restrição de integridade referencial não 
poderá existir;
 Estes mecanismos prevêem a execução de 
uma ação em resposta a uma atualização, a 
fim de manter a integridade referencial.
Restrições de Integridade
Integridade Referencial
 Existem diferentes ações possíveis para 
evitar que uma operação de atualização viole 
as restrições de integridade referencial
– RESTRICT: impede a execução da operação
Inserir uma Sala situada em um Prédio não 
existente
– CASCADE: propaga a operação para respeitar 
as restrições de integridade referencial
Remover uma Disciplina do Currículo, 
removendo todos os Pré-requisitos associados a 
esta
Restrições de Integridade
Integridade Referencial
– SET NULL: assegura as restrições 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 não é considerado um valor, portanto, não 
fere as restrições de integridade referencial
– SET DEFAULT: semelhante à ação deSET 
NULL, mas associa um valor padrão à chave 
estrangeira
Restrições de Integridade
Integridade Definida pelo Usuário
 O Projetista do Banco de Dados pode definir 
restrições de integridade complexas, 
utilizando, por exemplo, o conceito de
triggers
 Triggers são porções de código ativadas 
após certos eventos (inserção, atualização 
ou exclusão de linhas da tabela)
Restrições de Integridade de Tabelas
– CONSTRAINT nome_da_restrição 
PRIMARY KEY (colunas)
– CONSTRAINT nome_da_restrição 
FOREIGN KEY (colunas) REFERENCES 
nome_da_tabela_pai [ON DELETE 
CASCADE]
– CONSTRAINT nome_da_restrição 
UNIQUE (colunas)
– CONSTRAINT nome_da_restrição 
CHECK (expressao)
Restrições de Integridade de Colunas
– CONSTRAINT nome_da_restrição NOT NULL
– CONSTRAINT nome_da_restrição PRIMARY 
KEY
– CONSTRAINT nome_da_restrição 
REFERENCES nome_da_tabela_pai [ON 
DELETE CASCADE]
– CONSTRAINT nome_da_restrição UNIQUE
– CONSTRAINT nome_da_restrição 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 Padrão
 Pode ser definido um valor padrão para uma 
coluna (literais, expressões ou funções)
 Se não for definido um valor, será utilizado o 
padrão
– 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 Padrão
– insert into pedidos (num_pedido, 
cod_cliente, cod_endereco)
values (17645, 540, 290);
 Foi omitida a coluna data_emissão, 
logo, será utilizado o valor padrão
– insert into pedidos (num_pedido, 
cod_cliente, cod_endereco, 
data_emissao)
values (17645, 540, 290, NULL);
 Foi explicitamente definido NULL
Comando ALTER TABLE
 Permite a alteração de uma tabela
ALTER TABLE nome_da_tabela
[ADD definição de coluna,]
[MODIFY definição de coluna,]
[DROP COLUMN nome,]
[RENAME COLUMN antigo TO novo,]
[ADD definição de constraint,]
[MODIFY CONSTRAINT definição 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 eliminação de uma tabela:
– DROP TABLE nome_da_tabela
[CASCADE CONSTRAINTS];
– drop table tipos_telefones
cascade constraints;
Comando TRUNCATE TABLE
 Permite a eliminação de todas as linhas 
de uma tabela, de forma rápida e 
liberando o espaço alocado, sem 
possibilitar a execução de rollback:
– TRUNCATE TABLE nome_da_tabela;
Linguagem de Modelagem de 
Dados (DML)
SQL – DML
 Define operações de manipulação de 
dados
– (INSERT)
– (UPDATE)
– (DELETE)
 Instruções declarativas
– manipulação de conjuntos
– especifica-se o que fazer e não como fazer
SQL – DML
 Inserção de dados
INSERT INTO nome_tabela
[(lista_atributos)]
VALUES (lista_valores_atributos)
[, (lista_valores_atributos)]
 Exemplos
INSERT INTO Ambulatorios VALUES (1, 1, 30)
INSERT INTO Medicos
(codm, nome, idade, especialidade, CPF,
cidade)
VALUES (4, ‘Carlos’, 28,’ortopedia’, 
11000110000, ‘Joinville’);
MySQL
SQL – DML
 Alteração de dados
UPDATE nome_tabela
SET nome_atributo_1 = Valor
[{, nome_atributo_n = Valor}]
[WHERE condição] 
 Exemplos
UPDATE Medicos
SET cidade = ‘Florianopolis’
UPDATE Ambulatorios
SET capacidade = capacidade+5,andar=3
WHERE nroa = 2
SQL – DML
 Exclusão de dados
DELETE FROM nome_tabela
[WHERE condição] 
 Exemplos
DELETE FROM Ambulatorios
DELETE FROM Medicos
WHERE especialidade = ‘cardiologia’
or cidade ‘Florianopolis’
Linguagem de Controle de Dados 
(DCL)
Privilégios de usuários
 CONCEDER e REVOGAR privilégios em vários objetos de 
banco de dados
 Conceder:
 Podem ser concedidos aos usuários vários privilégios para as 
tabelas. Essas permissões podem ser qualquer combinação de 
SELECT, INSERT, UPDATE, DELETE, REFERENCES, ALTER 
ou ALL.
 Sintaxe:
GRANT privileges ON object TO user;
Privilégios de usuários
Privilege Description
SELECT Habilidade de usar SELECT na tabela.
INSERT Habilidade de usar INSERT statements on the table.
UPDATE Habilidade de usar UPDATE statements on the table.
DELETE Habilidade de usar DELETE statements on the table.
REFERENCES
Habilidade de criar constraints que referenciem a 
tabela.
ALTER
Habilidade de usar ALTER TABLE para mudar a 
definição da tabela
ALL
Garante todas as permissões acima: SELECT, INSERT, 
UPDATE, DELETE, e REFERENCES.
*Privilégios tanto para conceder quanto para revogar.
Privilégios de usuários
 Exemplos:
GRANT SELECT, INSERT, UPDATE, DELETE ON employees TO smithj;
GRANT ALL ON employees TO smithj;
GRANT SELECT ON employees TO public;
Privilégios de usuários
 Revogar privilégios 
 Depois de conceder privilégios, você pode precisar 
revogar alguns ou todos esses privilégios. Para fazer 
isso, você pode executar um comando revoke. Você 
pode revogar qualquer combinação de SELECT, 
INSERT, UPDATE, DELETE, REFERENCES, ALTER 
ou ALL.
REVOKE privileges ON object FROM user;
Privilégios de usuários
 Exemplos:
REVOKE DELETE ON employees FROM anderson;
REVOKE ALL ON employees FROM anderson;
REVOKE SELECT ON employees FROM public;
Linguagem de Transação de 
Dados (DTL)
Transações SQL
 Nem todo SGBD permite trabalhar queries como 
transações.
 O que é?
– É uma unidade lógica de processamento que tem por 
objetivo preservar a integridade e a consistência dos dados. 
Esse processamento pode ser executado todo ou não 
garantindo a atomicidade das informações.
– Seguem as propriedades ACID: Atomicidade, Consistência, 
Isolamento e Durabilidade.
Transações SQL
 A sintaxe básica de uma transação é:
Begin Transaction
--Corpo de comando
Commit ou Rollback
 Onde:
Begin Transaction: Tag inicial para o inicio de uma transação.
--Corpo de comando: Conjunto de comando a serem 
executados dentro de uma transação.
Commit ou Rollback: Comandos que finalizam a transação 
onde o ‘commit’ confirma o conjunto de comandos e o ‘rollback’ 
desfaz todo o processo executado pelo corpo de comandoscaso tenha ocorrindo algum evento contrario ao desejado.
Transações SQL
 Exemplo
 BEGIN TRANSACTION
UPDATE FROM TbContas
SET NuSaldo= 10.000
WHERE NuSaldo 18
Select CPF, nome 
From Pacientes
Select CPF, nome 
From Pacientes
Where idade > 18
Comando SELECT
 Facilidades para projeção de informações
– Não há eliminação de duplicatas no Select
• tabela ≡ coleção 
– retorno de valores calculados
• uso de operadores aritméticos (+,-,*,/)
– invocação de funções de agregação
• COUNT (contador de ocorrências [de um atributo])
• MAX / MIN (valores máximo / mínimo de um atributo)
• SUM (somador de valores de um atributo)
• AVG (média de valores de um atributo)
Comando SELECT
 Eliminação de duplicatas
select [distinct] lista_atributos
...
 Exemplo
– buscar as especialidades dos médicos
select distinct especialidade
from Médicos
Comando SELECT
 Retorno de valores calculados - Exemplos
– quantos grupos de 5 leitos podem ser 
formados em cada ambulatório?
select nroa, capacidade/5 as grupos5
from Ambulatórios
– qual o salário líquido dos funcionários (desc. 
10%)?
select CPF, salário – (salário * 0.1) as 
líquido from Funcionários
Comando SELECT
 Função COUNT - Exemplos
– informar o total de médicos ortopedistas
select count(*) as TotalOrtopedistas
from Médicos
where especialidade = ´ortopedia´
– total de médicos que atendem em ambulatórios
select count(nroa) as Total
from Médicos
não conta nulos
Comando SELECT
 Função SUM - Exemplo
– informar a capacidade total dos ambulatórios 
do primeiro andar
select sum(capacidade) as TotalAndar1
from Ambulatórios
where andar = 1
Comando SELECT
 Função AVG - Exemplo
– informar a média de idade dos pacientes de 
Florianópolis
select avg(idade) as MediaPacFpolis
from Pacientes
where cidade = ´Florianópolis´
Comando SELECT
 Funções MAX / MIN - Exemplo
– informar o menor e o maior salário pagos aos 
Funcionários do departamento pessoal com 
mais de 50 anos
select min(salário) as mínimo,
max(salário) as máximo
from Funcionários
where depto = ´Pessoal´
and idade > 50
Comando SELECT
 Funções de Agregação com distinct
– valores duplicados não são computados
– exemplos
select count(distinct especialidade)
from Médicos
select avg(distinct salário)
from Funcionários
Comando SELECT
 Observação sobre as funções de agregação
– não podem ser combinadas a outros atributos da 
tabela no resultado da consulta
select andar, COUNT (andar)
from Ambulatórios
Cláusula WHERE
 Facilidades para seleção de dados
– busca por padrões
• cláusula [NOT] LIKE
– teste de existência de valores nulos
• cláusula IS [NOT] NULL
– busca por intervalos de valores
• cláusula [NOT] BETWEEN valor1 AND valor2
– teste de pertinência elemento-conjunto, listas
• cláusula [NOT] IN
Cláusula WHERE
 Busca por padrões
where atributo like ´padrão´
% : casa com qualquer cadeia de caracteres
´_´ : casa com um único caractere
[a-f] : casa com qualquer caractere entre 
´a´ e ´f´ (SQL-Server)
 Exemplos
– buscar CPF e nome dos médicos com inicial M
select CPF, nome
from Médicos
where nome like ´M%´
Cláusula WHERE
 Exemplos
– buscar nomes de pacientes cujo CPF termina com 
20000 ou 30000
select nome
from Pacientes
where CPF like '%20000‘
or CPF like '%30000‘
 Observações
– em alguns dialetos SQL, ´*´ é usado invés de ´%´
– não é possível testar padrões em atributos datetime
(SQL-Server)
Cláusula WHERE
 Teste de valores nulos - Exemplo
– buscar o CPF e o nome dos médicos que 
não dão atendimento em ambulatórios
select CPF, nome
from Médicos
where nroa is null
Cláusula WHERE
 Busca por intervalos de valores - Exemplo
– buscar os dados das consultas marcadas para o 
período da tarde
select *
from Consultas
where hora between ´14:00´ and ´18:00´
Cláusula WHERE
 Teste de pertinência elemento-conjunto -
Exemplo
– buscar os dados das médicos ortopedistas, 
traumatologistas e cardiologistas de Florianópolis
select *
from Médicos
where cidade = ´Florianópolis´
and especialidade in (´cardiologia´,
´traumatologia´,
´cardiologia´)
Ordenação de Resultados
 Cláusula ORDER BY
– Default é ASC
select lista_atributos
from lista_tabelas
[where condição]
[order by nome_atributo 1 [desc] {[, 
nome_atributo n [desc]]} ]
 Exemplos
select * select salário, nome
from Pacientes from Funcionários 
order by nome order by salário desc, nome 
Ordenação de Resultados
 É possível determinar a quantidade 
de valores ordenados a retornar
select ...
limit valor1 [,valor2]
 Exemplos
select * select salário, nome
from Pacientes from Funcionários 
order by nome order by salário desc, 
limit 5 nome
limit 5,10
retorna as 5 primeiras tuplas 
retorna tuplas 6 a 15 
Definição de Grupos
 Cláusula GROUP BY
select lista_atributos
from lista_tabelas
[where condição]
[group by lista_atributos_agrupamento 
[having condição_para_agrupamento] ]
 GROUP BY
– define grupos para combinações de valores dos atributos definidos
em lista_atributos_agrupamento
– apenas atributos definidos em lista_atributos_agrupamento
podem aparecer no resultado da consulta
– geralmente o resultado da consulta possui uma função de
agregação
Definição de Grupos
 Exemplo
select especialidade, count(*)
from Médicos
group by especialidade
especialidade “grupos”
ortopedia codm nome idade RG cidade nroa
1 João 40 1000010000 Fpolis 1
4 Carlos 28 1100011000 Joinville
pediatria codm nome idade RG cidade nroa
3 Pedro 51 1100010000 Fpolis 2
neurologia codm nome idade RG cidade nroa
5 Márcia 33 1100011100 Biguaçu 3
traumatologia codm nome idade RG cidade nroa
2 Maria 42 1000011000 Blumenau 2
6 Joana 37 1111110000 Fpolis 3
7 Mauro 53 1111000011 Blumenau 2
especialidade Count
ortopedia 2
pediatira 1
neurologia 1
traumatologia 3
Definição de Grupos
 Cláusula HAVING
– define condições para que grupos sejam 
formados
• condições só podem ser definidas sobre atributos 
do agrupamento ou serem funções de agregação
– existe somente associada à cláusula GROUP 
BY
 Exemplos
select especialidade, count(*)
from Médicos
group by especialidade
having count(*) > 1
Atualização com Consulta
 Comandos de atualização podem incluir 
comandos de consulta
– necessário toda vez que a atualizaçãodeve 
testar relacionamentos entre tabelas
 Exemplo 1
delete from Consultas
where hora > ’17:00:00’
and codm in (select codm
from Médicos
where nome = ‘Maria’)
Atualização com Consulta
 Exemplo 2
update Médicos
set nroa = NULL
where not exists 
(select * from Médicos m
where m.codm Médicos.codm 
and m.nroa = Médicos.nroa)
 Exemplo3
update Ambulatórios
set capacidade = capacidade + 
(select capacidade 
from Ambulatórios where nroa = 4)
where nroa = 2
Atualização com Consulta
 Exemplo 4 (supondo MedNovos(código, nome, 
especialidade))
insert into MedNovos
select codm, nome, especialidade
from Médicos
where idade ‘12:00’
and Pacientes.codp = Consultas.codp
Select m2.nome
From Médicos m1, Médicos m2
Where m1.nome = ‘João’
and m1.especialidade = m2.especialidade
Joins
- Combina colunas de uma ou mais tabelas
- Existem diferentes tipos de junções em SQL
- Veremos aqui:
- I N N E R
- N AT U R A L
- OUTER (RIGHT, L E F T OR F U L L )
- Alguns SGBDs podem suportar outros tipos de junções não
apresentadas aqui
Com os seguintes dados
Cliente
id nome
1532 Asdrúbal
1755 Doriana
1780 Quincas
93 DinoTech
97 Proj
cliente_empresa
id cnpj
93 58.443.828/0001-02
97 44.876.234/7789-10
cliente_particular
id cpf
1532 448.754.253-44
1755 567.387.387-44
1780 576.456.123-55
corrida
cliiid placa datapedido
1755 DAE6534 2003-02-15
97 JDM8776 2003-02-18
taxi
placa marca modelo anofab
DAE6534 Ford Fiesta 1999
DKL4598 Wolkswagen Gol 2001
DKL7878 Ford Fiesta 2001
JDM8776 Wolkswagen Santana 2002
JJM3692 Chevrolet Corsa 1999
INNER JOIN
- Ou apenas JOIN: seleciona as tuplas de acordo com a 
condição em ON.
- Exemplo: recuperar clientes que fizeram corridas de taxi
SELECT *
FROM cliente INNER JOIN corrida ON cliid=id;
- Equivalente a
SELECT *
FROM cliente, corrida 
WHERE cliid=id;
id nome cliid placa datapedido
1755 Doriana 1755 DAE6534 2003-02-15
97 Proj 97 JDM8776 2003-02-18
NATURAL JOIN
- Seleciona as tuplas que tem valor equivalente para as 
colunas/atributos de mesmo nome (mesmo que na álgebra)
- Exemplo: recupera todos os taxis que fizeram corridas
SELECT *
FROM taxi NATURAL JOIN corrida;
a junção acontece em
placa
- Similar a:
SELECT *
FROM taxi as t INNER JOIN corrida as c ON 
c.placa=t.placa;
- Neste caso, placa aparece duas vezes no esquema resultante (c.placa e t.placa)
SELECT 
FROM TableA 
NATURAL JOIN
TableB
placa marca modelo anofab cliid datapedido
DAE6534 Ford Fiesta 1999 1755 2003-02-15
JDM8776 Volkswagen Santana 2002 97 2003-02-18
L E F T OUTER JOIN
- Ou apenas LEFT JOIN: seleciona todas as tuplas da tabela à esquerda + tuplas da 
direita, desde que satisfaça a condição em ON.
- Isso permite que o lado direito tenha dados de valor NULL
- Exemplo: recupera todos os clientes e possíveis corridas que ele tenha feito
- Podemos ver que a consulta recuperar clientes que fizeram ou não corridas.
SELECT *
FROM cliente LEFT JOIN corrida ON cliid=id;
id nome cliid placa datapedido
1755 Doriana 1755 DAE6534 2003-02-15
97 Proj 97 JDM8776 2003-02-18
1532 Asdrúbal
93 DinoTech
1780 Quincas
L E F T OUTER JOIN
- Podemos adicionar cláusula WHERE para recuperar apenas dados da esquerda que 
não têm correspondência com a direita.
- Isto é, apenas os dados em que o lado direito é NULL
- Exemplo: recupera todos os clientes que não fizeram corridas
SELECT *
FROM cliente LEFT JOIN corrida ON cliid=id 
WHERE cliid IS NULL;
id nome cliid placa datapedido
1532 Asdrúbal
93 DinoTech
1780 Quincas
- Simétrico ao L E F T O U T E R J O I N
R I G H T O U T E R J O I N
F U L L OUTER JOIN
- Seleciona todas as tuplas que satisfazem a condição em ON + todas as tuplas das 
esquerda que não tiveram correspondências + todas as tuplas da direita que não 
tiveram correspondência
- Exemplo: recupera todos os clientes particulares, todas as corridas e associa 
corridas a clientes
SELECT *
FROM cliente_particular FULL OUTER JOIN corrida ON cliid=id;
- Podemos notar: o primeiro cliente_particular fez corrida; os demais (ids 1532 e
1780) nunca fizeram corrida; e ainda, existe uma corrida feita por algum cliente
(cliid 97) que não é particular (neste contexto, é uma empresa).
id cpf cliid placa datapedido
1755 567.387.387-44 1755 DAE6534 2003-02-15
97 JDM8776 2003-02-18
1532 448.754.253-44
1780 576.456.123-55
F U L L OUTER JOIN
 Similar ao LEFT e RIGHT JOIN podemos selecionar apenas as tuplas 
que não tem correspondência com o outro lado.
 Desta forma, permitiremos recuperar as tuplas que tem valores nulos ou 
na esquerda ou na direita.
 Exemplo: recupera corridas não feitas por clientes particulares e clientes 
particulares que não fizeram corridas
SELECT *
FROM cliente_particular FULL OUTER JOIN corrida ON cliid=id 
WHERE id IS NULL OR cliid IS NULL;
id cpf cliid placa datapedido
97 JDM8776 2003-02-18
1532 448.754.253-44
1780 576.456.123-55
Subconsultas ou Consultas Aninhadas
 Forma alternativa de especificar consultas 
envolvendo relacionamentos entre tabelas
 Otimização
– filtragens prévias de dados na subconsulta
• apenas tuplas/atributos de interesse são combinados com 
dados da(s) tabela(s) da consulta externa
 Cláusulas de subconsulta
– nome_atributo [NOT] IN (consulta_SQL)
– nome_atributo [ | >= | | !=] ANY
(consulta_SQL)
– nome_atributo [ | >= | | !=] ALL
(consulta_SQL)
Subconsultas com IN 
 Testam a relação de pertinência ou não-
pertinência elemento-conjunto
select lista_atributos
from tabela1 [...]
where atributo_ou_expressão [NOT] IN
(consulta_SQL)
Exemplos
SQL
Select nome
From Médicos
Where codm in
(select codm
from Consultas
where data = ‘06/11/13’)
Select CPF 
From Funcionários
Where CPF not in
(select CPF
from Pacientes)
Select CPF
From Médicos
Where CPF in
(select CPF
from Pacientes)
Subconsultas com ANY 
 Permitem outras comparações do tipo 
elemento-conjunto
– testa se um valor é >, |>=|| !=] 
ANY
(consulta_SQL)
Exemplos
SQL
Select nome
From Médicos
Where codm = any (ou in)
(select codm
from Consultas
where data = ‘06/11/13’)
Select nome
From Funcionários
Where idade |>=|| !=] 
ALL(consulta_SQL)
 Não tem mapeamento para a álgebra
relacional
– não é equivalente a divisão
• na divisão existe apenas comparação de igualdade
• dividendo deve ter mais atributos que o divisor
• não filtra automaticamente atributos do dividendo
Exemplos
Select nome
From Funcionários
Where salário > all
(Select salário
From Funcionários
Where departamento = ‘contábil’)
Select nome
From Funcionários
Where CPF all (or not in)
(Select CPF
From Pacientes)
Comparações Elemento-Elemento 
 Casos em que a subconsulta retorna 
apenas um elemento como resultado
– cardinalidade da subconsulta = 1
– não é utilizada nenhuma cláusula de 
subconsulta neste caso
select lista_atributos
from tabela1 [, ...]
where atributo_ou_expressão [=||>=|| 
!=] (consulta_SQL com um único 
elemento)
Exemplos
Select nome
From Funcionários
Where salário> 
(Select salário
From Funcionários
Where CPF = 22000200002)
select nome, CPF
from Médicos
where CPF 10000100001
and especialidade = 
(select especialidade
from Médicos
where CPF = 10000100001)
Subconsultas com EXISTS 
 Quantificador existencial do cálculo 
relacional
– testa se um predicado é V ou F na subconsulta
– para cada tupla da consulta externa a ser 
analisada, a subconsulta é executada
select lista_atributos
from tabela1 [, ...]
where [NOT] EXISTS (consulta_SQL)
Exemplos
SQL
Select nome
From Médicos m
Where exists
(Select *
From Consultas
Where data = ‘06/11/13’
and codm = m.codm)
Select f.nome
From Funcionários f
Where f.depto = ‘pessoal’
and not exists
(Select *
From Pacientes
Where CPF = f.CPF)
Exemplo
SQL
Select p.nome
From Pacientes p
Where not exists
(Select *
From Médicos m
Where not exists
(Select *
From Consultas c
Where c.codm = m.codm
and c.codp = p.codp))
Subconsulta na Cláusula FROM 
• Gera uma tabela derivada a partir de uma 
ou mais tabelas, para uso na consulta 
externa
– otimização: filtra linhas e colunas de uma 
tabela que são desejadas pela consulta 
externa
select lista_atributos
from (consulta_SQL) as 
nome_tabela_derivada
Exemplos
SQL
select Medicos.*, C.hora
from Medicos join
(select codm, hora 
from Consultas 
where data = '06/11/13') 
as C
on Médicos.codm = C.codm
select Amb.*
from (select nroa, andar from ambulatorios) as Amb
join 
(select nroa from Medicos 
where cidade = ‘Fpolis') 
as MFlo
on Amb.nroa = MFlo.nroa
Criando uma Tabela a Partir de uma 
Consulta
 SQL permite a criação 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);
Views
- é uma tabela virtual baseada em um conjunto de resultados de uma 
consulta SQL
- é uma tabela derivada de outras tabelas
- podemos usar visões para especificar tabelas que iremos usar com 
frequência
- Sintaxe:
CREATE VIEW view_name AS SELECT column1, 
column2, ... FROM table_name
WHERE condition (...);
Exemplo
- Para corridas realizadas, os nomes e id dos clientes, dados do carro e da
corrida.
CREATE VIEW cliTaxi AS SELECT *
FROM taxi NATURAL JOIN corrida JOIN cliente ON cliid=id;
- Como recuperar os dados dessa visão?
SELECT * FROM cliTaxi;
placa marca modelo anofab cliid datapedido id nome
DAE6534 Ford Fiesta 1999 1755 2003-02-15 1755 Doriana
JDM8776 Wolkswagen Santana 2002 97 2003-02-18 97 Proj
- Nomes dos clientes que fizeram corridas:
SELECT nome FROM clitaxi;
- modelos de carros que fizeram corridas: SELECT modelo FROM clitaxi;
- Data de corrida mais recente
SELECT max(datapedido) FROM clitaxi;
- CNPj de clientes que fizeram corrida:
SELECT cnpj FROM clitaxi AS t INNER JOIN cliente_empresa as c ON 
c.id=t.cliid;
Exemplo - Possíveis consultas
Código Armazenado no Banco de 
Dados
 O Modelo Relacional não previa, 
originalmente, a possibilidade de armazenar 
trechos de código no banco de dados. No 
entanto, foi adaptado para permitir a 
definição de
– Stored Procedures: trechos de código escritos em 
linguagem SQL, armazenados no BD, e que 
podem ser ativados a partir de aplicações-cliente, 
comandos SQL, outras stored procedures, etc.
– Triggers: trechos de código armazenados no BD 
ativados automaticamente após determinados 
eventos
Código Armazenado no Banco de 
Dados
 No Oracle, os trechos de código 
armazenado (triggers, stored 
procedures e stored functions) são 
criados utilizando-se a linguagem PL-
SQL
 PL-SQL é uma linguagem de 
programação de código 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
/
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 freqüentemente nas 
cláusulas WHERE ou em joins
 A coluna contém inúmeros valores 
distintos
 A coluna contém muitos NULL
 A tabela tem muitas linhas e as 
consultas normalmente retornam 
poucas linhas
Quando não Criar Índices?
 A tabela é pequena
 As colunas não aparecem em 
condições ou joins
 As consultas retornam muitas linhas
 A tabela é atualizada muito 
freqüentemente
Utilizando Sinônimos
 Sinônimos são nomes alternativos pelos 
quais podem ser conhecidos os objetos do 
banco de dados (tabelas, visões, sequences, 
stored procedures, etc.)
 Sinônimos podem ser públicos, acessíveis 
por todos os usuários, 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 sinônimo
Exercícios (MySQL)
1. Crie um BD com nome Clinica
2. Crie as seguintes tabelas neste BD, considerando que os atributos 
sublinhados são chaves primárias e os em itálico são chaves 
estrangeiras:
– Ambulatorios: nroa (int), andar (numeric(3)) (não nulo), 
capacidade (smallint)
– Medicos: codm (int), nome (varchar(40)) (não nulo), idade 
(smallint) (não nulo), especialidade (char(20)), CPF (numeric(11)) 
(único), cidade (varchar(30)), nroa (int) 
– Pacientes: codp (int), nome (varchar(40)) (não nulo), idade 
(smallint) (não nulo), cidade (char(30)), CPF (numeric(11)) (único), 
doenca (varchar(40)) (não nulo)
– Funcionarios: codf (int), nome (varchar(40)) (não nulo), idade 
(smallint), CPF (numeric(11)) (único), cidade (varchar(30)), salario 
(numeric(10)), cargo (varchar(20))
– Consultas: codm (int), codp (int), data (date), hora (time)
3. Crie a coluna nroa (int) na tabela Funcionarios
4. Crie os seguintes índices:
– Medicos: CPF (único)
– Pacientes: doenca
5. Remover o índice doenca em Pacientes 
6. Remover as colunas cargo e nroa da tabela de Funcionarios
Exercícios (MySQL)
Popular as tabelas:
Ambulatorios
nroa andar capacidade
1 1 30
2 1 50
3 2 40
4 2 25
5 2 55
Medicos
codm nome idade especialidade CPF cidade nroa
1 Joao 40 ortopedia 10000100000 Florianopolis 1
2 Maria 42 traumatologia 10000110000 Blumenau 2
3 Pedro 51 pediatria 11000100000 São José 2
4 Carlos 28 ortopedia 11000110000 Joinville
5 Marcia 33 neurologia 11000111000 Biguacu 3
Funcionarios
codf nome idade cidade salario CPF
1 Rita 32 Sao Jose 1200 20000100000
2 Maria 55 Palhoca 1220 30000110000
3 Caio 45 Florianopolis 1100 41000100000
4 Carlos 44 Florianopolis 1200 51000110000
5 Paula 33 Florianopolis 2500 61000111000
Pacientes
codp nome idade cidade CPF doenca
1 Ana 20 Florianopolis 20000200000 gripe
2 Paulo 24 Palhoca 20000220000 fratura
3 Lucia 30 Biguacu 22000200000 tendinite
4 Carlos 28 Joinville 11000110000 sarampo
Consultas
codm codp data hora
1 1 2006/06/12 14:00
1 4 2006/06/13 10:00
2 1 2006/06/13 9:00
2 2 2006/06/13 11:00
2 3 2006/06/14 14:00
2 4 2006/06/14 17:00
3 1 2006/06/19 18:00
3 3 2006/06/12 10:00
3 4 2006/06/19 13:00
4 4 2006/06/20 13:00
4 4 2006/06/22 19:30
Exercícios (MySQL)
1) O paciente Paulo mudou-se para Ilhota
2) A consulta do médico 1 com o paciente 4 passou 
para às 12:00 horas do dia 4 de Julho de 2006
3) A paciente Ana fez aniversário e sua doença agora é 
cancer
4) A consulta do médico Pedro (codf= 3) com o paciente 
Carlos (codf = 4) passou para uma hora e meia depois
5) O funcionário Carlos (codf = 4) deixou a clínica
6) As consultas marcadas após as 19 horas foram 
canceladas
7) Os pacientes com câncer ou idade inferior a 10 anos 
deixaram a clínica
8) Os médicos que residem em Biguacu e Palhoca 
deixaram a clínica
Realizar as seguintes atualizações no BD:
Exercícios
Realizar as seguintes consultas no BD:
1) Buscar o nome e o CPF dos médicos com menos de 40 anos ou com especialidade
diferente de traumatologia
2) Buscar todos os dados das consultas marcadas no período da tarde após o dia
19/06/2006
3) Buscar o nome e a idade dos pacientes que não residem em Florianópolis
4) Buscar a hora das consultas marcadas antes do dia 14/06/2006 e depois do dia
20/06/2006
5) Buscar o nome e a idade (em meses) dos pacientes
6) Em quais cidades residem os funcionários?
7) Qual o menor e o maior salário dos funcionários da Florianópolis?
10) Qual o horário da última consulta marcada para o dia 13/06/2006?
11) Qual a média de idade dos médicos e o total de ambulatórios atendidos por eles?
12) Buscar o código, o nome e o salário líquido dos funcionários. O salário líquido é
obtido pela diferença entre o salário cadastrado menos 20% deste mesmo salário
13) Buscar o nome dos funcionários que terminam com a letra “a”
14) Buscar o nome e CPF dos funcionários que não possuam a seqüência “00000” em
seus CPFs
15) Buscar o nome e a especialidade dos médicos cuja segunda e a última letra de
seus nomes seja a letra “o”
16) Buscar os códigos e nomes dos pacientes com mais de 25 anos que estão com
tendinite, fratura, gripe e sarampo
Exercícios
Defina cada uma das seguintes buscas através de um produto, de uma junção (e de uma 
junção natural, quando possível). Quando necessário, utilizar junção externa:
1) nome e CPF dos médicos que também são pacientes do hospital
2) pares (código, nome) de funcionários e de médicos que residem na mesma cidade
3) código e nome dos pacientes com consulta marcada para horários após às 14 horas 
4) número e andar dos ambulatórios utilizados por médicos ortopedistas
5) nome e CPF dos pacientes que têm consultas marcadas entre os dias 14 e 16 de junho 
de 2006
6) nome e idade dos médicos que têm consulta com a paciente Ana
7) código e nome dos médicos que atendem no mesmo ambulatório do médico Pedro e 
que possuem consultas marcadas para dia 14/06/2006
8) nome, CPF e idade dos pacientes que têm consultas marcadas com ortopedistas para 
dias anteriores ao dia 16
9) nome e salário dos funcionários que moram na mesma cidade do funcionário Carlos e 
possuem salário superior ao dele
10) dados de todos os ambulatórios e, para aqueles ambulatórios onde médicos dão 
atendimento, exibir também os seus códigos e nomes
11) CPF e nome de todos os médicos e, para aqueles médicos com consultas marcadas, 
exibir os CPFs e nomes dos seus pacientes e as datas das consultas
Exercícios
Resolva o que se pede utilizando subconsultas IN:
1) nome e CPF dos médicos que também são pacientes do hospital
2) código e nome dos pacientes com consulta marcada para horários após às 14 horas
3) nome e idade dos médicos que têm consulta com a paciente Ana
4) número e andar dos ambulatórios onde nenhum médico dá atendimento
5) nome, CPF e idade dos pacientes que têm consultas marcadas sempre para dias 
anteriores ao dia 16
Resolva o que se pede utilizando subconsultas ANY e/ou ALL:
1) números e andares de todos os ambulatórios, exceto o de menor capacidade
2) nome e idade dos médicos que têm consulta com a paciente Ana
3) nome e a idade do médico mais jovem (sem usar função MIN!)
4) nome e CPF dos pacientes com consultas marcadas para horários anteriores a todos 
os horários de consultas marcadas para o dia 12 de Novembro de 2006
5) nome e CPF dos médicos que não atendem em ambulatórios com capacidade 
superior à capacidade dos ambulatórios do segundo andar
Resolva o que se pede utilizando subconsultas EXISTS:
1) nome e CPF dos médicos que também são pacientes do hospital
2) nome e idade dos médicos que têm consulta com a paciente Ana
3) número do ambulatório com a maior capacidade (sem usar função MAX!)
4) nome e CPF dos médicos que têm consultas marcadas com todos os pacientes
5) nome e CPF dos médicos ortopedistas que têm consultas marcadas com todos os 
pacientes de Florianópolis
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_administrador) REFERENCES usuarios (cod_usuario))
/
ALTER TABLE clientes_enderecosADD ( CONSTRAINT FK_CLI_CLIEND FOREIGN KEY 
(cod_cliente) 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))
/

Mais conteúdos dessa disciplina