Você está na página 1de 148

Universidade Federal do Ceará – UFC

Centro de Ciências
Departamento de Computação

Projeto de Bancos de Dados Relacionais

Disciplina: Fundamentos de Banco de Dados

Prof. João Paulo do Vale Madeiro

Prof. João Paulo do Vale


Fundamentos de Banco de Dados
Sumário

1. Introdução aos Sistemas de Banco de Dados


2. O Modelo Relacional
3. Modelo de Entidades e Relacionamentos (MER)
4. Projeto de Bancos de Dados Relacionais


5. A Linguagem SQL
6. Acesso a Bancos de Dados
7. Restrições de Integridade
8. Técnicas Avançadas de Projeto de BD’s Relacionais (Normalização)

2
4. Projeto de Bancos de Dados
- Fases -
Mini-mundo
(mundo real)

Análise de
Requisitos
Requisitos de dados

Projeto
Conceitual
Análise Esquema Conceitual (MER)
Independente Funcional
do SGBD Projeto Lógico
(mapeamento de
Específico para modelo de dados)
cada SGBD
Esquema Conceitual representado
no modelo de dados do SGBD
Projeto Projeto Físico
(Software) Estruturas de armazenamento
e caminhos de acesso (índices)

Implementação
Implementação
Expressões DDL e carga do BD

3
4. Projeto de Bancos de Dados
- Fases -

• Análise (especificação) de requisitos


• Projetista de banco de dados deve realizar entrevista com usuários
prospectivos do banco de dados
• Entender e documentar
• Requisitos de dados
• Projeto conceitual
• Com base nos requisitos de dados
• Criar um esquema conceitual para o banco de dados
• Modelo de dados conceitual
• MER
• Construir um DER
• Projeto lógico
• Com base no DER definido na fase anterior
• Criar um diagrama relacional
• Representação gráfica de um esquema relacional

4
4. Projeto de Bancos de Dados
- Fases -

• Projeto Físico
• Definir estruturas de armazenamento
• Como e onde devem ser armazenadas as tabelas
• Uma tabela em um arquivo
• Várias tabelas em um único arquivo
• Definir caminhos de acesso
• Definir índices
• Definir tipo de índice
• Ordenado
• Primário
• Secundário
• Hash
• Utilizar critérios de performance
• Específico por SGBD
• Implementação
• Com base no DR definido na fase 3 e as estruturas de armazenamento e caminhos de acesso
definidos na fase anterior
• Criar o banco de dados
• Expressões DDL
• Carregar o BD

5
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

• Ferramentas CASE
• Modelagem ER gráfica
• Geração automática de esquema (DDL)
• Algoritmo de mapeamento
• Sete passos

6
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

• Diagrama relacional (DR)


• Ferramenta gráfica utilizada para representar um
esquema de banco de dados relacional
• A partir de um DER, pode-se construir um DR como descrito a seguir
• Passo 1
• Para cada conjunto de entidades E, deve ser criada
uma tabela com todos os atributos de E
• Escolher uma chave candidata para ser a chave primária
da tabela
• Apenas os componentes atômicos de atributos
compostos devem ser incluídos
• Notação de tabela no DR
Nome da
Tabela
7
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

• Passo 2
• Para cada relacionamento binário 1:1 entre os
conjuntos de entidades E1 e E2
• Escolher uma das tabelas, por exemplo E2, e incluir
como chave estrangeira em E2 a chave primária da
outra tabela (E1)
• Critério de escolha
>> Entidade com participação total no relacionamento
• Atributos de relacionamentos devem ser incluídos na
tabela com chave estrangeira
• Notação
PK
E1 E2

PK

8
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

• Passo 2
• Para cada relacionamento binário 1:1 entre os conjuntos
de entidades E1 e E2

PK
Empregado Emp Dep
codigo
nome PK
matr dt_nasc

nome 1 PK
Departamento Dep Emp
1
gerência
PK
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

• Passo 2
• Para cada relacionamento binário 1:1 entre os conjuntos
de entidades E1 e E2
PK
Departamento Empregado

PK

Empregado Departamento
matr nome codigo codigo nome
1 RH
1 Gal NULL
2 Vendas
2 Gil NULL
3 Sá 1
4 Dé 2
5 Ana NULL
10
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

• Passo 2
• Para cada relacionamento binário 1:1 entre os conjuntos
de entidades E1 e E2
PK
Empregado Departamento

PK

Empregado Departamento
matr nome codigo nome matr
1 RH 3
1 Gal
2 Vendas 4
2 Gil
3 Sá
4 Dé Valores nulos não são armazenados….
5 Ana
11
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

• Passo 3
• Para cada relacionamento binário 1:N entre os
conjuntos de entidades E1 e E2
• Identificar o conjunto de entidades que participa do lado
N (suponha que seja E2)
• Incluir como chave estrangeira na tabela E2 a chave
primária da outra tabela (E1)
• Atributos de relacionamentos devem ser incluídos na
tabela com chave estrangeira
• Notação
PK
E1 E2

12
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

• Passo 4
• Para cada relacionamento binário N:N entre os
conjuntos de entidades E1 e E2
• Criar uma nova tabela auxiliar tab-aux para representar o
relacionamento
• Incluir como chaves estrangeiras na tabela tab-aux as
chaves primárias de E1 e E2
• Estes dois atributos comporão a chave primária de tab-aux
• Atributos de relacionamento devem ser incluídos na
tabela tab-aux
• Notação
PK-E1 PK-E2
E1 Tab-aux E2

PK-E1
PK-E2
13
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

• Passo 5
• Para relacionamento de grau maior que 2
• Criar uma nova tabela auxiliar tab-aux para representar o
relacionamento
• Incluir como chaves estrangeiras na tabela tab-aux as chaves
primárias das tabelas que participam do relacionamento
• Estes atributos comporão a chave primária de tab-aux
• Passo 6
• Para cada conjunto de entidades fracas F
• Cria uma tabela TFr com todos os atributos de F
• Incluir como chave estrangeira de TFr a chave primária da
tabela correspondente ao conjunto de entidades fortes R
• A chave primária de TFr será a chave parcial de F mais a
chave primária de R

14
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

• Passo 7
• Para cada atributo multivalorado A de um conjunto de
entidades E1
• Criar uma tabela T com o atributo A
• Incluir como chave estrangeira em T a chave primária de
E1
• A chave primária de T será composta do atributo A mais
a chave primária de E1

15
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

• Exercício
• Construa o DR para o seguinte DER
cod-ag nome ender gerente num-conta saldo

Agência 1 n Conta

n
data_abertura

cod-cliente n ender
CPF Cliente
data-nasc
nome
16
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

cod-ag nome ender gerente num-conta saldo

cod_ag
Agência Conta

cod-ag num-conta
data-abert

Cliente_Conta
cod-cliente
cod-cliente ender
CPF Cliente
data-nasc
nome

17
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

• Exercício
• Construa o DR para o DER do slide correspondente ao
MER da empresa com empregado, departamento,
vencimentos, descontos, dependentes.

18
UFC
CC
DC4. Projeto de Bancos de Dados
- Construção do Diagrama Relacional -
Construa o DR para o DER do slide 42
descrição
Cod_venc valor

dt_lotação
matr Emp_Venc Vencimento
nome Cod_venc
descrição
Em
pr Emp_Desc Descont0 valor
eg matr Cod_desc
Cod_Dep ad Cod_desc
Cod_Dep o

Departamento Fones Dependente


dt_nasc
nome
nome
ender matr_resp

Cod_Dep
©Angelo Brayner Fundamentos de Banco de Dados 1
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

cic N End
Sal
DN

Empregado

ISA ISA
Es

Piloto Técnico
B HV
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

Primeira Alternativa
• Uma tabela EMP
Atributos CIC, DN, N, End,Sal
Chave Primária CIC
• Uma tabela PILOTO
Atributos CIC, B,HV
Chave Primária CIC
Chave Estrangeira : CIC referencia EMP
• Uma tabela TEC
Atributos CIC, Es
Chave Primária CIC
Chave Estrangeira CIC referencia EMP
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

Segunda Alternativa
• Uma tabela PILOTO
Atributos CIC, DN, N, End,Sal, B,HV
Chave Primária CIC

• Uma tabela TEC


Atributos CIC, DN, N, End,Sal, Es
Chave Primária CIC
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

Vantagens e
Desvantagens
• Primeira Alternativa com 3 tabelas
• Mais geral
• Permite fazer consultas sobre empregados que não são
nem pilotos nem técnicos.
• Não é a adequada quando se quer consultar atributos
gerais de Pilotos e Técnicos: é preciso combinar as
tabelas PILOTO e TEC com a tabela EMP.
4. Projeto de Bancos de Dados
- Mapeamento do MER para um Banco de Dados Relacional -

Vantagens e
Desvantagens
• Segunda Alternativa com 2 tabelas
• É adequada quando se quer consultar somente
informações relacionadas a Pilotos ou Técnicos.
• Não é aplicável se tivermos empregados que não são
nem Pilotos nem Técnicos.
• Não é aplicável se existem Pilotos que também são
Técnicos e vice-versa : os dados deveriam ser
armazenados duas vezes !!!
• Uma consulta que pede para listar todos os
empregados deve varrer duas tabelas !!!
DP CREATE TABLE PAT
( DID char(4),
PID char(4),
PROJ PAT DEP DP DATE,
PRIMARY KEY (DID,PID),
FOREIGN KEY (PID)
REFERENCES PROJ,
MON DM FOREIGN KEY (DID)
REFERENCES DEP)

EMP CREATE TABLE MONITORA


( CIC integer,
DID char(4), PAT PROJ
PID char(4),
DM DATE,
PRIMARY KEY (CIC,DID,PID), DEP
FOREIGN KEY (CIC)
MONITORA
REFERENCES EMP,
FOREIGN KEY (DID,PID) EMP
REFERENCES PAT)
Sumário

1. Introdução aos Sistemas de Banco de Dados


2. O Modelo Relacional
3. Modelo de Entidades e Relacionamentos (MER)
4. Projeto de Bancos de Dados Relacionais
5. A Linguagem SQL
6. Acesso a Bancos de Dados

☞ 7.
8.
Restrições de Integridade
Técnicas Avançadas de Projeto de BD’s Relacionais (Normalização)

26
5. SQL
- Histórico -

• Structured Query Language - SQL


• Desenvolvida pela IBM
• Structured English Query Language - Sequel
• Linguagem de consulta para o sistema R
• Primeiro protótipo de SBD relacional
• Especificar consultas de forma interativa
• ad hoc queries
• Padrão
• ANSI
• SQL 86
• SQL 89
• SQL 92
• SQL 99
• Propriedade de SBDs objeto-relacional
27
5. SQL
- Componentes da Linguagem SQL -

• Structured Query Language - SQL


• Comandos DDL:
• CREATE TABLE
• DROP TABLE
• ALTER TABLE
• Comandos DML:
• INSERT
• DELETE
• UPDATE
• SELECT

28
5. SQL
- Comandos DDL -

• Criando tabelas
• Estrutura básica
• CREATE TABLE nome-tabela
(nome-coluna tipo-de-dados [not null],
[nome-coluna tipo-de-dados [not null] … ],
[CONSTRAINT nome-restrição]
UNIQUE nome-coluna
Especifica | PRIMARY KEY(nome-coluna {, nome-coluna})
chaves | FOREIGN KEY (nome-coluna {, nome-coluna})
candidatas
REFERENCES nome-tabela
[ON DELETE CASCADE |
SET NULL | NO ACTION ],
Definição
de restrições [ON UPDATE CASCADE],
| CHECK (predicado)
)

29
5. SQL
- Comandos DDL -

• Removendo tabelas
• Estrutura básica
• DROP TABLE nome-tabela [CASCADE | RESTRICT]
• Remove as tuplas da tabela e sua definição do catálogo
• CASCADE remove as restrições do tipo foreign key: tabelas que referenciam a
tabela removida
• Alterando tabelas
• Estrutura básica
• ALTER TABLE nome-tabela
[ADD nome-coluna tipo de dados]
[DROP nome-coluna ]
[ADD CONSTRAINT nome-restrição]
[DROP CONSTRAINT nome-restrição]
[DROP PRIMARY KEY]
[ repetir ADD ou DROP em qualquer ordem]

30
UFC
CC
5. SQL
DC

- Operações da DDL -
Alterando tabelas
ALTER TABLE nome-tabela
[ADD nome-coluna tipo-dado [not null]]
[ALTER COLUMN nome-coluna tipo-dado [not null] ]
[DROP column nome-coluna ]
[ADD CONSTRAINT nome-restrição]
[DROP CONSTRAINT nome-restrição]
[DROP PRIMARY KEY]
[ repetir ADD ou DROP em qualquer ordem]

©Angelo Brayner Fundamentos de Banco de Dados 31


5. SQL
- Comandos DDL -

• CREATE TABLE
• Alguns tipos de dados suportados pelo SQL 92
• char(n)
• String de caracteres de tamanho fixo n
• varchar(n)
• String de caracteres de tamanho variável (máximo n)
• integer
• smallint
• decimal(p,d)
• Numérico com p dígitos
• Dos p dígitos, d dígitos representam casas decimais após a
vírgula
• real ••
••
Alphabetic
Alphabeticdate
dateformats
formats( (‘April
‘April15,
15,1998’)
1998’)
Numeric date formats ( ‘4/15/1998’)
Numeric date formats ( ‘4/15/1998’)
• numérico ponto flutuante •• Unseparated
Unseparatedstring
stringformats
formats(‘19921225')
(‘19921225')
• date
• data de calendário 32
5. SQL
- Comandos DDL -

• CREATE TABLE
• Exemplo: Considere o seguinte esquema de banco de
dados
Departamento(codigo, dnome, ender)
Empregado(matr, enome, ender, cpf, salário, lotacao)
• Crie as tabelas Departamento e Empregado utilizando
a DDL do SQL:
• Vamos tentar no PostgreSQL???

33
5. SQL
- Comandos DML -

• Incluindo tuplas em uma tabela


• Cláusula INSERT
• Sintaxe
INSERT [INTO] nome_tabela    [(lista_de_colunas))]
        { VALUES ( {  DEFAULT |  NULL  |    expr }[,...n] )
        | subquery }    

• Removendo tuplas de uma tabela


• Cláusula DELETE
• Sintaxe
DELETE FROM nome_tabela
WHERE predicado
      

34
5. SQL
- Comandos DML -

• Exemplo prático para a instância Alunos:


      

35
5. SQL
- Comandos DML -

• Incluindo tuplas em uma tabela


• Cláusula INSERT

•   

• Removendo tuplas de uma tabela


• Cláusula DELETE

      

36
5. SQL
- Comandos DML -

• Atualizando tuplas de uma tabela


• Cláusula UPDATE
• Sintaxe
UPDATE nome_tabela
SET nome_coluna = {expr | NULL | (subquery) }
{, nome_coluna = {expr | NULL | (subquery) }}
WHERE predicado

• Vamos tentar no PostgreSQL???

37
5. SQL
- Comandos DML -

• Atualizando tuplas de uma tabela


• Cláusula UPDATE

38
5. SQL
- Comandos DDL -

• CREATE TABLE
• Desafio 1: Considere o seguinte esquema de banco de
dados
Departamento(cod_depart, nome, ender)
Empregado(matr, nome, ender, cpf,salário,lotação)
• Crie as tabelas Departamento e Empregado utilizando a
DDL do SQL com as seguintes restrições
• O salário de cada empregado deve ser maior que 2000
• Não podem existir valores de cpf repetidos
• Não se pode permitir a remoção de departamentos para os
quais ainda existam empregados lotados
• Ao alterar o código de de um departamento, alterar o valor
do atributo lotação para todos empregados do
departamento
39
UFC
CC
5. SQL
DC

- Operações da DDL -
• Criar o BD de lojas, com as seguintes restrições
– O salário de cada vendedor deve ser maior que 1000
– Não podem existir valores de cpf repetidos
– Não se pode permitir a remoção de filiais para os quais ainda existam
vendedores lotados
– Não se pode remover itens de estoque e nem vendedores, para os quais
existam vendas na tabela Histórico.

©Angelo Brayner Fundamentos de Banco de Dados 40


UFC
CC
2. Modelo Entidade-Relacionamento
DC

-
• Relembrando o BD lojas:
• Cada item de estoque possui um código, descrição, quantidade em
estoque, preço de compra, preço de venda e o fornecedor.
• Cada fornecedor terá um código, nome, endereço, telefones,
cidade e estado.
• Existem várias lojas (filiais) vendendo produtos da empresa X.
Cada loja tem um código identificador, nome, endereço, cidade de
localização e um gerente (um vendedor da loja).
• Cada vendedor terá uma matrícula, nome, RG, CPF, salário e filial
de lotação.
• Para cada venda efetuada (tabela histórico), deve ser identificado o
código do item vendido, a matrícula do vendedor que realizou a
venda, a quantidade vendida, o preço de venda, a data e hora da
venda.

©Angelo Brayner Fundamentos de Banco de Dados 4


UFC
CC
5. SQL
DC

- Operações da DDL -
Alterar o BD lojas, com as seguintes restrições
O salário de cada vendedor deve ser maior que 1200
Ao alterar o código de uma filial, o valor do atributo codfil para todos
empregados da filial deve ser automaticamente alterado
Incluir a coluna cnpj em Fornecedores e Filiais
Não podem existir valores de cnpj repetidos
cnpj não pode ser nulo

©Angelo Brayner Fundamentos de Banco de Dados 42


5. SQL
- Comandos DDL -

• ANALISANDO A INTEGRIDADE REFERENCIAL

43
5. SQL
- Comandos DDL -

• ANALISANDO A INTEGRIDADE REFERENCIAL

44
5. SQL
- Comandos DDL -

• ANALISANDO A INTEGRIDADE REFERENCIAL

45
5. SQL
- Comandos DDL -

• Estudo de Caso:

• Quando uma tupla de alunos é inserida, é feita uma verificação para


saber se o curso de distinção está na relação Cursos e, quando uma
tupla de Cursos é inserida, é feita uma verificação para saber se monitor
está na relação alunos.
• Como resolver ?? 46
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consultas simples sobre o banco de dados


• Estrutura básica
SELECT [ALL | DISTINCT] {* | expr [[AS] c_alias]
{, expr [[AS] c_alias] … }}
FROM nome-tabela [[AS] qualificador]
{, nome-tabela [[AS] qualificador] …}
WHERE predicado
• ALL
• Retorna todas as tuplas, inclusive repetidas (default)
• DISTINCT
• Retorna apenas tuplas não repetidas
• *
• Retorna todos os atributos da(s) tabela(s)
• expr
• Representa um atributo ou
• Expressão matemática envolvendo atributos das tabelas
• salario*1.40
47
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consultas simples sobre o banco de dados


48
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consultas simples sobre o banco de dados


• Também podemos combinar informações de duas tabelas, por
exemplo das relações Alunos e Matriculado:

• Esta consulta pode ser entendida como: “ Se houver uma tupla A de


Alunos e uma tupla M de Matriculado, tal que A.id-aluno = M.id-aluno
(de modo que A descreve o aluno matriculado em M) e M.nota = ‘A’,
então imprima o nome do aluno e a identificação do curso.

49
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consultas simples sobre o banco de dados (cont.)


• FROM
• Representa o produto cartesiano das tabelas referenciadas
• WHERE
• Corresponde ao predicado de seleção da álgebra relacional
• Exemplos: Considere o seguinte esquema de banco de dados
Departamento(cod_depart, nome, ender)
Empregado(matr, nome, ender, cpf,salário,lotação)
• Listar os funcionários com salário maior que 3000
• Listar funcionários com salários maior que 1000 e menor que 2000

• Listar nome dos funcionários com o nome de seu departamento de


lotação
• Listar nome dos funcionários com o nome de seu departamento de
lotação e uma simulação de seu salário com um aumento de 15%
50
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Exemplos: Considere o seguinte esquema de banco de dados

51
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Exemplos: Considere o seguinte esquema de banco de dados

52
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consultas simples sobre o banco de dados (cont.)

53
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consultas simples sobre o banco de dados (cont.)

54
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consultas simples sobre o banco de dados (cont.)

• A resposta a uma consulta é por si só uma relação:


• Estratégia de avaliação conceitual:

55
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consultas simples sobre o banco de dados (cont.)

56
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consultas simples sobre o banco de dados (cont.)

57
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consultas simples sobre o banco de dados (cont.)

58
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consultas simples sobre o banco de dados (cont.)

59
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consultas simples sobre o banco de dados (cont.)

60
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Expressões e Strings no comando SELECT

61
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Predicados com operações sobre strings


• Identificação de padrão
•%
• Casa com qualquer substring
•_
• Casa com qualquer caracter
• Operador
• like
• Exemplos
• nome like ‘inf%’
• Retorna strings que iniciam pelo substring inf
• nome like ‘%si_’
• Retorna strings que contenham ‘si’ como substring e terminem com um
caracter qualquer após ‘si’
• Listar todos empregados com sobrenome ‘brayner’
• Select nome from Empregado where nome like ‘%brayner%’
62
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Consultas com o operador de união
• UNION
• União de duas relações (consultas)
• Sem repetições
• UNION ALL
• União de duas relações
• Com repetições

63
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Consultas com o operador de união
• Exemplo
• Considere as seguintes relações

• Empregado(matr, nome, ender, dt_nasc, cpf, salário,


lotação)
• Dependente(nome_dep, data-nasc, matr_resp)

• Liste o nome e data de nascimento de todos os


funcionários e dependentes existentes na empresa
select nome,dt_nasc from Empregado
UNION
select nome_dep,data_nasc from Dependente

64
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consultas com o operador de interseção


• INTERSECT
• Interseção entre duas relações (consultas)
• Sem repetições
• INTERSECT ALL
• Interseção entre duas relações
• Com repetições
• Consultas com o operador de diferença
• EXCEPT
• Diferença entre duas relações (consultas)
• Sem repetições
• EXCEPT ALL
• Diferença entre duas relações (consultas)
• Com repetições

65
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Exercícios:

• Forma que acabamos de ver:

66
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Exercícios:

• Forma alternativa:

67
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Exercícios:

• Forma de consulta com o conteúdo que já vimos:

68
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Exercícios:

• Forma de consulta alternativa:

69
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Exercícios: Operação de Diferença de Conjuntos


• Encontre os marinheiros que não efetuaram nenhuma reserva:
• select * from
• (
• (select m.id_marin,m.nome,m.idade from marinheiros m order by m.idade
desc)
• except
• (select m.id_marin,m.nome,m.idade from marinheiros m, reservas r
• where m.id_marin = r.id_marin)
• ) as marins
• order by marins.idade desc

70
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Exercícios:

71
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Exercícios
• Listar matrícula dos empregados que não possuem dependentes
Select
Selecte.matr
e.matr
From
From empregadoee
empregado
EXCEPT
EXCEPT
Select
Selectd.matr-resp
d.matr-resp
From
Fromdependente
dependentedd

Select
Selecte.matr
e.matr
From
From empregadoee
empregado
• Listar matrícula INTERSECT
dos empregados
INTERSECT Select
Selectd.matr-resp
que possuem dependentes
d.matr-resp
Select
Selectd.matr-resp From
From
d.matr-resp Fromdependente
dependentedd
Fromdependente
dependentedd

72
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consultas com consultas ordenadas


ORDER BY coluna-resultado [ASC | DESC]
{, coluna-resultado [ASC | DESC] …}

• Listar empregados ordenados por salário na ordem


decrescente e por nome na ordem crescente
Select
Select**
From
Fromempregado
empregadoee
Order
OrderBy
Bysalário
salárioDESC,
DESC,nome
nomeAsc
Asc

73
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Funções Agregadas
• Funções embutidas (built-in) aplicadas sobre uma
coleção de valores (colunas) do banco de dados
• sum
• Retorna o somatório dos valores de uma coleção
• avg
• Retorna a média dos valores de uma coleção
• max
• Retorna o maior valor de uma coleção de valores
• min
• Retorna o menor valor de uma coleção
• count
• Retorna o número de elementos de uma coleção
• Sintaxe
• nome-da-função (ALL | DISTINCT nome-coluna) |
count(*)
• Não podem ser utilizados na cláusula WHERE
74
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Exercícios
• Encontre o número de empregados lotados no
departamento de Informática
select
selectcount(*)
count(*)
from
from Empregadoe,
Empregado e,Departamento
Departamentodd
where
wheree.lotacao=d.cod_dep
e.lotacao=d.cod_depand
andd.nome
d.nomelike
like
'_nform_tica'
'_nform_tica'
matr

select
selectsum(salario)
sum(salario)
from Empregado
• fromoEmpregado
Encontre montante da folha de pagamento da empresa

select
selectavg(distinct
avg(distinctsalario)
salario)
from Empregado
from Empregado

• Encontre o salário médio pago pela empresa 75


5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Agrupando tuplas no SQL


• Aplicar funções agregadas a diferentes grupos de tuplas
• Exemplo
• Listar a quantidade de empregados por departamento
• Cláusula
• GROUP BY
• Exemplo
select lotação, count(*) as quantidade_empregados
from Empregado
group by lotação
AAfunção
funçãocount
countééaplicada
aplicada
lotacao quantidade_empregado para
paraooconjunto
conjuntodedetuplas
tuplas
----------- -------------------- de cada grupo
1 4 de cada grupo
2 2

76
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Agrupando tuplas no SQL (cont.)
• Todas colunas que aparecem na cláusula select têm
que aparecer na cláusula group by
• Exceto os argumentos da funções agregadas

• Exemplo de sintaxe incorreta


select lotação, matr, count(*)
group by lotação

77
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Agrupando tuplas no SQL
select lotação, count(*) as quantidade_empregados
from Empregado
group by lotação AAfunção
funçãocount
countééaplicada
aplicada
para
paraooconjunto
conjuntode
detuplas
tuplas
Empregado de cada grupo
de cada grupo
matr nome cpf salário lotação
11 Bárbara 231 8000 2
lotação quantidade_empregados
21 André 451 9000 1
33 Sofia 472 3000 2 1 3
35 Lucas 549 500 2 2 3
37 Rebeca 465 400 3 3 1
40 Caio 555 800 1
57 Yasmin 800 400 1

78
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Agrupando tuplas no SQL
select lotação, sum(salário)
from Empregado
group by lotação
Empregado
matr nome cpf salário lotação lotação sum of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 1 10200
33 Sofia 472 3000 2 2 11500
35 Lucas 549 500 2 3 400
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1

79
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Agrupando tuplas no SQL
select lotação, sum(salário), max(salário)
from Empregado
group by lotação
Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 1 10200 9000
33 Sofia 472 3000 2 2 11500 8000
35 Lucas 549 500 2
3 400 400
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1

80
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Selecionando grupos
• Listar nome dos departamentos cuja média salarial seja
maior que 7000
• Cláusula having
• Filtro de grupos

• Exemplo
select d.nome, avg(salario)
from Departamento d, Empregado e
where d.cod_depart=e.lotacao
group by d.nome
having avg(e.salario)>7000
Funções
Agregadas =>
Podem ser
utilizados na
cláusula 81
HAVING
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Selecionando grupos
• Consulta com where e having
• predicado da cláusula where é avaliado primeiramente
• Tuplas que satisfazem o predicado são agrupadas pelo group by
• Predicado da cláusula having é avaliado
• Grupos que satisfazem o predicado aparecem no resultado

82
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Agrupando tuplas no SQL
select lotação, sum(salário), max(salário)
from Empregado
group by lotação
having lotação > 1

Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 2 11500 8000
33 Sofia 472 3000 2 3 400 400
35 Lucas 549 500 2
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1

83
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Agrupando tuplas no SQL
select lotação, sum(salário), max(salário)
from Empregado
group by lotação
having max(salario) > 500

Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 1 10200 9000
33 Sofia 472 3000 2 2 11500 8000
35 Lucas 549 500 2
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1

84
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Agrupando tuplas no SQL
select lotação, sum(salário), max(salário)
from Empregado
group by lotação
having count(*) > 1

Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 1 10200 9000
33 Sofia 472 3000 2 2 11500 8000
35 Lucas 549 500 2
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1

85
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Agrupando tuplas no SQL
select lotação, sum(salário), max(salário)
from Empregado
where salário > 1.000
group by lotação

Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 1 9000 9000
33 Sofia 472 3000 2 2 11.000 8000
35 Lucas 549 500 2
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1

86
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Agrupando tuplas no SQL
select lotação, sum(salário), max(salário)
from Empregado
where salario > 1.000
group by lotação
having count(*) > 1

Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 2 11.000 8000
33 Sofia 472 3000 2
35 Lucas 549 500 2
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1
87
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Agrupando tuplas no SQL (cont.)
• Exemplos
• Lista de todos dependentes com respectivos
responsáveis e nome do departamento de lotação
dos responsáveis.
• Agrupar o resultado por departamento e por
empregado
select
selectd.nome,
d.nome,e.nome,
e.nome,p.nome
p.nome
from
fromDepartamento
Departamentod,d,Empregado
Empregadoe,e,Dependente
Dependentepp
where
whered.cod_dep=e.lotacao
d.cod_dep=e.lotacaoand
ande.matr=p.matr_resp
e.matr=p.matr_resp
group
groupbybyd.nome,
d.nome,e.nome,
e.nome,p.nome
p.nome

GROUP
GROUPBY
BYDesnecessário
Desnecessário

88
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Agrupando tuplas no SQL (cont.)
• Exemplos (cont.)
• Listar para cada departamento o seu código, além do
maior e do menor salário
select
selectlotacao,
lotacao,max(salario)
max(salario)as
asMaior_Salario,
Maior_Salario,min(salario)
min(salario)as
as
Menor_Salario
Menor_Salario
from
fromEmpregado
Empregadoee
group
groupbybylotacao
lotacao

• Listar para cada departamento o seu nome, além do


select
selectd.nome,
maior e do max(e.salario)
menor
d.nome, salário
max(e.salario)as
asMaior_Salario,
Maior_Salario,min(e.salario)
min(e.salario)
as Menor_Salario
as Menor_Salario
from
fromDepartamento
Departamentod,
d,Empregado
Empregadoee
where
whered.cod_dep=e.lotacao
d.cod_dep=e.lotacao
group
groupby
byd.nome
d.nome

89
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Agrupando tuplas no SQL (cont.)
• Exemplos (cont.)
• Listar para cada departamento o seu nome, além do
maior e do menor salário

SELECT
SELECTd.nome,
d.nome,tab.Maior_Salario,
tab.Maior_Salario,tab.Menor_Salario
tab.Menor_Salario
FROM
FROM((
SELECT
SELECTlotacao,
lotacao,max(salario)
max(salario)as
asMaior_Salario,
Maior_Salario,
min(salario)
min(salario)as
asMenor_Salario
Menor_Salario
FROM empregado
FROM empregado e e
GROUP
GROUPBY BYlotacao
lotacao
)) AS
AStab,
tab,departamento
departamentodd
WHERE
WHEREtab.lotacao
tab.lotacao==d.cod_dep
d.cod_dep

90
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Agrupando tuplas no SQL (cont.)
• Exemplos (cont.)
• Listar para cada departamento o seu nome, além do
maior e do menor salário

select
selectlotacao,
lotacao,max(salario)
max(salario)as
asMaior_Salario,
Maior_Salario,min(salario)
min(salario)as
as
Menor_Salario
Menor_Salario
from
fromEmpregado
Empregadoee
group
groupbybylotacao
lotacao

91
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Selecionando grupos
select lotação, count(*) as quantidade_empregados
from Empregado
group by lotação
Empregado
matr nome cpf salário lotação lotação quantidade_empregados
11 Bárbara 231 8000 2 1 3
21 André 451 9000 1
33 Sofia 472 3000 2 2 3
35 Lucas 549 500 2 3 1
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1
select lotação, count(*) as quantidade_empregados
from Empregado
group by lotação lotação quantidade_empregados
having count(*) > 1 1 3
2 3

92
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Selecionando grupos
select lotação, count(*) as quantidade_empregados
from Empregado
group by lotação
Empregado
matr nome cpf salário lotação lotação quantidade_empregados
11 Bárbara 231 8000 2 1 3
21 André 451 9000 1
33 Sofia 472 3000 2 2 3
35 Lucas 549 500 2 3 1
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1

select lotação lotação


from Empregado 1
group by lotação 2
having count(*) > 1
93
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Selecionando grupos
select lotação, sum(salário), max(salário)
from Empregado
group by lotação
Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 1 10200 9000
33 Sofia 472 3000 2 2 11500 8000
35 Lucas 549 500 2
3 400 400
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1
select lotação , lotação sum of salário
sum(salário) 1 10200
from Empregado 2 11500
group by lotação
having max(salário) > 500 94
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Selecionando grupos
select lotação, sum(salário), max(salário)
from Empregado
group by lotação
Empregado
matr nome cpf salário lotação lotação sum of salário max of salário
11 Bárbara 231 8000 2
21 André 451 9000 1 1 10200 9000
33 Sofia 472 3000 2 2 11500 8000
35 Lucas 549 500 2
3 400 400
37 Rebeca 465 400 3
40 Caio 555 800 1
57 Yasmin 800 400 1
select lotação , lotação sum of salário
sum(salário) 1 10200
from Empregado 2 11500
group by lotação
having count(*) > 2 95
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Selecionando grupos (cont.)
• Exemplos
• Listar nome e média salarial dos departamentos que
possuem mais de 10 empregados lotados
select
selectd.nome,
d.nome,avg(e.salario)
avg(e.salario)as
asMédia_Salarial
Média_Salarial
from
fromDepartamento
Departamentod,d,Empregado
Empregadoee
where
whered.cod_dep=e.lotacao
d.cod_dep=e.lotacao
group
groupbybyd.nome
d.nome
having
havingcount(matr)>=11
count(matr)>=11
• Listar nome e quantidade de empregados dos
departamentos cuja média salarial é maior que 5000
select
selectd.nome,
d.nome,count(*)
count(*)as
asNúmero_Empregados
Número_Empregados
from
fromDepartamento
Departamentod, d,Empregado
Empregadoee
where
whered.cod_dep=e.lotacao
d.cod_dep=e.lotacao
group
groupbybyd.nome
d.nome
having
havingavg(e.salario)>=5000
avg(e.salario)>=5000
96
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Agrupando tuplas no SQL (cont.)
• Exemplos (cont.)
• Totalizar a quantidade de itens vendidos por vendedor
e por item, considerando o seguinte esquema
• Vendedor(matr, nome, salário)
• Vendas(matr,cod_item,qtde, pr-venda,dt-hora-venda)
• Estoque(cod_item, referência, pr_compra,pr_venda,qtde)

select
selectv.nome,
v.nome,e.referência,
e.referência,sum(d.qtde)
sum(d.qtde)as
astotal
total
from
fromEstoque
Estoquee,e,Vendedor
Vendedorv,v,Vendas
Vendasdd
where
wheree.cod_item=d.cod_item
e.cod_item=d.cod_itemand andv.matr=d.matr
v.matr=d.matr
group
groupbybyv.nome,
v.nome,e.referência
e.referência

97
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Selecionando grupos (cont.)
• Exemplos
• Listar nome de vendedores e quantidade de vendas
efetuadas dos vendedores com volume de vendas superior
a R$ 10000 (classificado em ordem decrescente por
quantidade de vendas), considerando o seguinte esquema:
• Vendedor(matr, nome, salário)
• Vendas(matr,cod_item,qtde, pr-venda,dt-hora-venda)
• Estoque(cod_item, referência, pr_compra,pr_venda,qtde)

select
selectv.nome,
v.nome,count(*)
count(*)as
astotal_de_vendas
total_de_vendas
from
fromVendedor
Vendedorv,v,Vendas
Vendasdd
where
wherev.matr=d.matr
v.matr=d.matr
group
groupbybyv.nome
v.nome
having
havingsum(d.qtde*d.pr_venda)
sum(d.qtde*d.pr_venda)>>10000
10000
order
orderbybycount(*)
count(*)DESC
DESC

98
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Checando valores nulos


• Predicado IS NULL
• Exemplo
select * from Empregado
where dt-nasc is null

99
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (subconsulta)


• Consulta SQL especificada dentro de uma outra consulta
SQL
• Exemplo
• Listar todos os empregados que têm salário maior que
a média salarial da empresa
select
selecte.nome
e.nome
from
fromEmpregado
Empregadoee
where
wheresalário
salário>>(select
(selectavg(salário)
avg(salário)from
from
Empregado)
Empregado)

A subconsulta retorna um conjunto de valores para


a consulta mais externa (executada primeiro)

Neste caso específico, a subconsulta deve retornar


exatamente um único valor.

10
0
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Listar o primeiro e segundo maiores salários da
empresa
select
selectmax(salário)
max(salário)
from
fromEmpregado
Empregado
union
union
select
selectmax(salario)
max(salario)
from
fromEmpregado
Empregado
where
wheresalário
salário<>
<>(select
(selectmax(salário)
max(salário)from
fromEmpregado)
Empregado)

select
selectd.nome
d.nome
• from Departamento
Listar nome dos
from Departamento d,
d,Empregado
Empregadoee com média salarial
departamentos
where
whered.cod_depart=e.lotação
d.cod_depart=e.lotação
maior
group que a média salarial da empresa
group byd.nome
by d.nome
having
havingavg(e.salário)
avg(e.salário)>>(select
(selectavg(salário)
avg(salário)from
fromEmpregado)
Empregado)

subconsulta na cláusula having


10
1
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Consulta SQL aninhada (cont.)
• Consulta correlacionada
• Listar todos os empregado que possuem salário
maior que a média salarial de seus departamentos
select nome
from Empregado
where salário > (
select avg(salário)
from Empregado
where lotação=?????
)

A subconsulta precisa utilizar o valor do atributo


lotação de cada tupla da consulta mais externa como
parâmetro de entrada

10
2
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Consulta SQL aninhada (cont.)
• Consulta correlacionada
• Listar todos os empregado que possuem salário
maior que a média salarial de seus departamentos
• Variável de correlação
• Variável da consulta mais externa utilizada pela consulta
mais interna

select e.nome
from Empregado e
where salário > (
select avg(salário)
from Empregado
where lotação=e.lotação
)

Executado para cada tupla da


consulta mais externa

10
3
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Consulta SQL aninhada (cont.)
• Predicado IN
• Verifica a pertinência de elementos em um conjunto

• Sintaxe
• expr [NOT] IN (subconsulta) | expr [NOT] IN (val [,val
…])

• Exemplo
select nome
from Empregado
where matr in (1,5,8,9)

10
4
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Consulta SQL aninhada (cont.)
• Exemplo:
• Listar os empregados lotados nos departamentos
localizados em Fortaleza, considerando o seguinte
esquema
Departamento(cod_depart, nome, ender,cidade)
Empregado(matr, nome, ender, cpf,salário,lotação)

select
selectnome
nome
from Empregado
from Empregado
where
wherelotação
lotaçãoin
in((
select
selectcod_depart
cod_depart
from Departamento
from Departamento
where
wherecidade=‘Fortaleza'
cidade=‘Fortaleza'
))

10
5
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Predicado IN
• Listar os empregados lotados nos departamentos
localizados em Fortaleza, considerando o seguinte
esquema
Departamento(cod_depart, nome, ender,cidade)
Empregado(matr, nome, ender, cpf,salário,lotação)
select
selectnome
nome
from Empregado
from Empregado
where
wherelotação
lotaçãoin
in(select
(selectcod_depart
cod_departfrom
fromDepartamento
Departamento
where cidade='Fortaleza' )
where cidade='Fortaleza' )

select
selectnome
nome
from
from Empregadoe,
Empregado e,Departamento
Departamentodd
where
wheree.lotação
e.lotação==d.cod_depart
d.cod_depart
and d.cidade='Fortaleza'
and d.cidade='Fortaleza'

10
6
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Consulta SQL aninhada (cont.)
• Listar os empregados lotados nos departamentos
localizados em Fortaleza, considerando o seguinte
esquema
Departamento(cod_depart, nome, ender,cidade)
Empregado(matr, nome, ender, cpf,salário,lotação)

select
selectnome
nome
from Empregado
from Empregado
where
wherelotação
lotaçãoin
in(select
(selectcod_depart
cod_departfrom
fromDepartamento
Departamento
where cidade='Fortaleza' or cidade='Natal')
where cidade='Fortaleza' or cidade='Natal')

select
selecte.nome
e.nome
from
fromEmpregado
Empregado e,e,Departamento
Departamento dd
where
wheree.lotacao
e.lotacao ==d.cod_depart
d.cod_depart
and
and (d.cidade==‘Fortaleza'
(d.cidade ‘Fortaleza'or
ord.cidade=‘Natal')
d.cidade=‘Natal')

10
7
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Predicados SOME, ANY e ALL
• Listar empregados que ganham salários maior ou igual
a média salarial de um departamento
• Sintaxe
• expr q {SOME | ANY | ALL} (subconsulta)
• q Î {<, <=,>, >=, =, <>}

select
selectnome
nome
from Empregado
from Empregado
where
wheresalário
salário>=some
>=some((select
selectavg(salário)
avg(salário)
from
fromEmpregado
Empregado
group by lotação
group by lotação
))

10
8
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Predicados SOME, ANY e ALL (cont.)
• q SOME (subconsulta) e q ANY (subconsulta)
• Retornam verdade se e somente se
• Para pelo menos um elemento s retornado pela
subconsulta, expr q s é verdade
• São equivalentes

• qALL (subconsulta)
• Retorna verdade se e somente se,
• Para todo elemento s retornado pela subconsulta,
expr q s é verdade

10
9
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Predicados SOME, ANY e ALL (cont.)
• Listar empregados que ganham salários maior ou igual
a média salarial de cada departamento

select
selectnome
nome
from Empregado
from Empregado
where
wheresalário
salário>=all
>=all((
select
selectavg(salário)
avg(salário)
from Empregado
from Empregado
group
groupbybylotação
lotação
))

11
0
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Predicados SOME, ANY e ALL (cont.)
• Listar o departamento com maior média salarial
• Não é permitido função agregada composta
select
selectd.nome
d.nome
from
fromEmpregado
Empregadoe,
e,Departamento
Departamentodd
where
whered.cod_depart=e.lotação
d.cod_depart=e.lotação
group
groupby
byd.nome
d.nome
having
havingavg(salário)
avg(salário)>=all
>=all((
select
selectavg(salário)
avg(salário)
from
fromEmpregado
Empregado
group
groupby
bylotação
lotação
))

11
1
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Predicado EXISTS
• Verifica se o conjunto retornado por uma subconjunto é
vazio ou não
• Listar empregados que possuem dependentes

select
selecte.nome
e.nome
from
fromEmpregado
Empregadoee
where
whereexists
exists((
select
select**from
fromDependente
Dependente
where
wherematr_resp=e.matr
matr_resp=e.matr
))

11
2
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)

• Predicado EXISTS
• Listar empregados que possuem dependentes

select
selecte.nome
e.nome
from
fromEmpregado
Empregadoee
where
whereexists
exists(select
(select**from
fromDependente
Dependentewhere
where
matr_resp=e.matr)
matr_resp=e.matr)
select
selectDISTINCT
DISTINCTe.nome
e.nome
from
fromEmpregado
Empregadoe,e,Dependente
Dependentedd
where
wheree.matr
e.matr==d.matr_resp
d.matr_resp
select
selecte.nome
e.nome
from
fromEmpregado
Empregadoee
where
wheree.matr
e.matrIN
IN(select
(select d.matr_resp
d.matr_respfrom
fromDependente
Dependented)
d)
11
3
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Consulta SQL aninhada (cont.)
• Predicado EXISTS (cont.)
• Sintaxe
• [NOT] EXISTS (subconsulta)
• EXISTS (subconsulta)
• Retorna verdade se e somente se
• O conjunto retornado por subconsulta não é vazio
• NOT EXISTS (subconsulta)
• Retorna verdade se e somente se
• O conjunto retornado por subconsulta é vazio
• Listar empregados que NÃO possuem dependentes

select
selecte.nome
e.nome
from
fromEmpregado
Empregadoee
where
wherenot
notexists
exists(select
(select**from
fromDependente
Dependentewhere
where
matr_resp=e.matr)
matr_resp=e.matr)

11
4
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Consulta SQL aninhada (cont.)

• Listar nome de departamentos com empregados ganhando


duas vezes mais que a média do departamento

select
selectd.nome
d.nome
from
fromDepartamento
Departamentodd
where
whereexists
exists(select
(select**from
fromEmpregado
Empregadoee
where
wheree.lotacao=d.cod_depart
e.lotacao=d.cod_departand
and
salário
salário>>(2*(select
(2*(selectavg(salário)
avg(salário)
from
fromEmpregado
Empregadoe2
e2
where
wheree2.lotação=e.lotação)))
e2.lotação=e.lotação)))

11
5
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Consulta SQL aninhada (cont.)

• Listar nome de departamentos com empregados ganhando


duas vezes mais que a média do departamento

select
selectd.nome
d.nome
from
fromDepartamento
Departamentodd
where
whereexists
exists(select
(select**from
fromEmpregado
Empregadoee
where
wheree.lotacao=d.cod_depart
e.lotacao=d.cod_departand
and
salário
salário>>(2*(select
(2*(selectavg(salário)
avg(salário)
from
fromEmpregado
Empregadoe2
e2
where
wheree2.lotação=d.cod_depart)))
e2.lotação=d.cod_depart)))

11
6
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Consulta SQL aninhada (cont.)

• Listar nome de departamentos com empregados ganhando


duas vezes mais que a média do departamento
select
selectd.nome
d.nome
from
fromDepartamento
Departamentodd
where
wherecod_depart
cod_departIN
IN((
select
selectlotação
lotaçãofrom
fromEmpregado
Empregadoe,e,
((
select
selectlotacao,
lotacao,avg(salário)
avg(salário)as
as
media
media
from
fromEmpregado
Empregado
group
groupby
bylotação
lotação
))as
astab
tab
where
wheree.lotacao
e.lotacao==tab.lotacao
tab.lotacao
11
and
ande.salario
e.salario>>2*tab.media
2*tab.media 7
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Consulta SQL aninhada (cont.)

• Listar nome de departamentos com empregados ganhando


duas vezes mais que a média do departamento
select
selectDISTINCT
DISTINCTd.nome
d.nome
from
fromdepartamento
departamentod,
d,empregado
empregadoe,e,
((
select
selectlotacao,
lotacao,avg(salário)
avg(salário)as
as
media
media
from
fromEmpregado
Empregado
group
groupby
bylotação
lotação
))as
astab
tab
where
whered.cod_depart
d.cod_depart==e.lotacao
e.lotacaoand
ande.lotacao
e.lotacao==tab.lotacao
tab.lotacao
and
ande.salario
e.salario>>2*tab.media
2*tab.media

11
8
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Consulta SQL aninhada (cont.)


• Subconsulta escalar
• Subconsulta que retorna apenas um valor
• Pode aparecer na lista de argumentos da cláusula
select e na cláusula where
• Exemplo
• Listar nome dos empregados com a quantidade de
dependentes de cada empregado
select
selecte.nome,
e.nome,(select
(selectcount(*)
count(*)From
Fromdependente
dependentewhere
where
matr_resp=e.matr)
matr_resp=e.matr)
from
fromEmpregado
Empregadoee

11
9
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Consulta SQL aninhada (cont.)
• Subconsulta escalar
• Exemplo
• Listar nome dos empregados com a quantidade de
dependentes de cada empregado
select
selecte.nome,
e.nome,(select
(selectcount(*)
count(*)From
Fromdependente
dependentewhere
where
matr_resp=e.matr)
matr_resp=e.matr)
from
fromEmpregado
Empregadoee
select
selecte.nome,
e.nome,count(*)
count(*)as
asqtd_dep
qtd_depProblema: Falha no caso de homônimos
from
from Empregado e, Dependentedd
Empregado e, Dependente
where
wheree.matr
e.matr==d.matr_resp
d.matr_resp
group by e.nome
group by e.nome
select
selecte.nome,
e.nome,t.qtd_dep
t.qtd_dep
from
fromEmpregado
Empregadoe,e,(( select
selectmatr_resp,
matr_resp,count(*)
count(*)as
asqtd_dep
qtd_dep
from Dependente
from Dependente
group
groupbybymatr_resp
matr_resp
))as t
as t
e.matr=t.matr_resp
e.matr=t.matr_resp

12
0
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Predicado Between
• Sintaxe
• expr1 [NOT] BETWEEN expr2 and expr3
• Exemplo
• matr between 2 and 10 Û matr >= 2 and matr<=10
• Em geral, between é mais eficiente

select
selecte.nome
e.nome
from
fromempregado
empregadoee
where
wheresalario
salariobetween
between10000
10000and
and20000
20000
select
selecte.nome
e.nome
from
fromempregado
empregadoee
where
wheresalario
salario>=
>=10000
10000and
andsalario
salario<=
<=20000
20000

12
1
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado


• Listar nome dos departamentos que possuem
empregados projeção
select d.nome produto cartesiano

from Empregado e, Departamento d


where d.cod_depart=e.lotação seleção

Pd.nome(sd.cod_depart=e.lotação(Departamento x Empregado))

Pd.nome( Departamento
Û
d.cod_depart=e.lotação
Empregado )

12
2
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Formas de Junção em SQL Avançado (cont.)
• Sintaxe da cláusula FROM (cont.)
• Tipos de junção
• Junção theta
• INNER JOIN
• Junção externa à esquerda
• LEFT OUTER JOIN
• Junção externa à direita
• RIGHT OUTER JOIN
• Junção externa completa
• FULL OUTER JOIN

12
3
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Formas de Junção em SQL Avançado (cont.)
• Junção theta
• Exemplo
• Listar nome dos empregados com o nome do
respectivo departamento
select
selecte.nome,
e.nome,d.nome
d.nome select
selecte.nome,
e.nome,d.nome
d.nome
from Empregado e, Departamento from
from Empregado e, Departamento
from
dd Empregado e, Departamento dd Empregado e, Departamento
where
wheree.lotação
e.lotação==d.cod_depart
d.cod_depart where
whered.cod_depart
d.cod_depart ==e.lotação
e.lotação
select
selecte.nome,
e.nome,d.nome
d.nome
from
from Empregadoeeinner
Empregado innerjoin
joinDepartamento
Departamentoddon
one.lotação=d.cod_depart
e.lotação=d.cod_depart

12
4
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Formas de Junção em SQL Avançado (cont.)
• Junção theta
• Exemplo
• Listar nome dos empregados com o nome do
SQLServer respectivo departamento. Listar os empregados
mesmo que estes não estejam lotados em nenhum Oracle
departamento.
select e.enome, d.dnome select e.enome, d.dnome
select e.enome, d.dnome select e.enome, d.dnome
from
fromeempresa.empregado
eempresa.empregadoe,e, from
fromeempresa.empregado
eempresa.empregadoe,e,
eempresa.departamento
eempresa.departamentodd eempresa.departamento
eempresa.departamentodd
where
wheree.cdep
e.cdep*=
*=d.codigo
d.codigo where
wheree.cdep
e.cdep(+)=
(+)=d.codigo
d.codigo
select
selecte.enome,
e.enome,d.dnome
d.dnome
from
fromeempresa.empregado
eempresa.empregadoeeleft
leftouter
outerjoin
joineempresa.departamento
eempresa.departamento
dd
on
one.cdep
e.cdep==d.codigo
d.codigo
12
5
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Formas de Junção em SQL Avançado (cont.)
• Junção theta
• Exemplo
• Listar nome dos empregados com o nome do
SQLServer respectivo departamento. Listar os departamentos
mesmo que estes não possuam nenhum empregado.Oracle
select
selecte.enome,
e.enome,d.dnome
d.dnome select
selecte.enome,
e.enome,d.dnome
d.dnome
from
fromeempresa.empregado
eempresa.empregadoe,e, from
fromeempresa.empregado
eempresa.empregadoe,e,
eempresa.departamento
eempresa.departamentodd eempresa.departamento
eempresa.departamentodd
where
wheree.cdep
e.cdep=*
=*d.codigo
d.codigo where
wheree.cdep
e.cdep=(+)
=(+)d.codigo
d.codigo
select
selecte.enome,
e.enome,d.dnome
d.dnome
from
fromeempresa.empregado
eempresa.empregadoeeright
rightouter
outerjoin
joineempresa.departamento
eempresa.departamento
dd
on
one.cdep
e.cdep==d.codigo
d.codigo
12
6
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Formas de Junção em SQL Avançado (cont.)
• Junção theta
• Exemplo
• Listar nome dos empregados com o nome do respectivo
departamento. Listar os empregados mesmo que estes não
SQLServer estejam lotados em nenhum departamento e os departamentos
mesmo que estes não possuam nenhum empregado. Oracle
select
selecte.enome,
e.enome,d.dnome
d.dnome select
selecte.enome,
e.enome,d.dnome
d.dnome
from
fromeempresa.empregado
eempresa.empregadoe,
e, from
fromeempresa.empregado
eempresa.empregadoe,e,
eempresa.departamento
eempresa.departamentodd eempresa.departamento
eempresa.departamentodd
where
wheree.cdep
e.cdep*=*
*=*d.codigo
d.codigo where
wheree.cdep
e.cdep(+)=(+)
(+)=(+)d.codigo
d.codigo
select
selecte.enome,
e.enome,d.dnome
d.dnome
from
fromeempresa.empregado
eempresa.empregadoeefull
fullouter
outerjoin
joineempresa.departamento
eempresa.departamento
dd
on
one.cdep
e.cdep==d.codigo
d.codigo
12
7
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• Sintaxe da cláusula FROM
[ FROM {<tabela_fonte>} [,...n] ]
<table_fonte> ::=
   nome_tabela [ [AS] qualificador ] [ WITH ( <table_hint> [,...n]) ]
   | nome_tabela [ [AS] qualificador ] [ (column_alias [,...n] ) ]
Pode ser
  | (subquery) [AS] qualificador [ (column_alias [,...n] ) ]
uma visão
(view)
   | <tabela_fonte> <tipo_junção> <tabela_fonte> ON
<condição_junção>

<tipo_junção> ::=
    [ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ] [ <join_hint> ]
    JOIN

12
8
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• Sintaxe da cláusula FROM (cont.)
• WITH (<table_hint> [,...n]) ])
• Especifica estratégias (dicas) para o otimizador de consultas
• Índices
• tipo e granularidade de bloqueio (lock)
• (column_alias [,...n] )
• Especifica alias para colunas retornadas de
• uma tabela (não suportado pelo SQL Server 7.0) ou
• subconsulta
• Um alias para cada coluna especificada na lista do select da
subconsulta
• join_hint
• Indica para o otimizador de consulta qual o algoritmo de
junção deve ser executado
• Nested loop join, merge join ou hash join (SQL Server 7.0)

12
9
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• Junção theta (INNER JOIN)
• Exemplo
• Para os empregados que têm salário maior que
15000, listar nome com o nome do respectivo
departamento,
select
selecte.enome,
e.enome,d.dnome
d.dnome
from
fromeempresa.empregado
eempresa.empregadoeeinner
innerjoin
joineempresa.departamento
eempresa.departamento
ddon
one.cdep
e.cdep==d.codigo
d.codigo
where
wheree.salario
e.salario>>15000
15000

13
0
5. SQL
- Conjunto de Operações para Manipulação de Dados -
• Formas de Junção em SQL Avançado (cont.)
• Junção theta (INNER JOIN)
select
selecte.enome,
e.enome,d.dnome
d.dnome
from
fromeempresa.empregado
eempresa.empregadoeeinner
innerjoin
joineempresa.departamento
eempresa.departamento
ddon
one.cdep
e.cdep==d.codigo
d.codigo
where
wheree.salario
e.salario>>15000
15000
select
selecte.enome,
e.enome,d.dnome
d.dnome
from
fromeempresa.departamento
eempresa.departamentodd
inner
innerjoin
join(select
(select**from
fromeempresa.empregado
eempresa.empregadowhere
wheresalario
salario>>15000)
15000)ee
on
ond.codigo
d.codigo==e.cdep
e.cdep
select
selecte.enome,
e.enome,d.dnome
d.dnome
from
from(select
(select**from
fromeempresa.empregado
eempresa.empregadowhere
wheresalario
salario>>15000)
15000)ee
inner
innerjoin
join eempresa.departamento
eempresa.departamentodd
on
ond.codigo
d.codigo==e.cdep
e.cdep
13
1
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• Junção theta (INNER JOIN)
• Exemplo
• Para os empregados que têm salário maior que 700,
listar nome com o nome do respectivo departamento,
select
selectnome_empregado,
nome_empregado,d.nome
d.nomefrom
fromDepartamento
Departamentoddinner
inner
join
join
(select
(selectnome,
nome,lotação
lotaçãofrom
fromEmpregado
Empregadowhere
where salário>15000)
salário>15000)ee
(nome_empregado,departamento_lotação)
(nome_empregado,departamento_lotação)
on
ondepartamento_lotação=d.cod_depart
departamento_lotação=d.cod_depart

13
2
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• LEFT OUTER JOIN
• Calcula o resultado da junção
• Adiciona ao resultado da junção
• Tuplas da relação à esquerda que não satisfazem a
condição de junção
• Atribui valores nulos aos atributos não definidos para estas
tuplas
• Exemplo
• Listar o histórico de vendas de cada vendedor,
considerando o seguinte esquema
• Vendedor(matr, nome, salário)
• Vendas(matr,cod_item,qtde, pr-venda,dt-hora-venda)
• Estoque(cod_item, referência, pr_compra,pr_venda,qtde)
select
selectv.nome,
v.nome,e.referência,
e.referência,d.qtde,d.qtde*d.pr_venda
d.qtde,d.qtde*d.pr_venda
from
from Vendedor v left outer join(Vendas
Vendedor v left outer join (Vendasddinner
innerjoin
joinEstoque
Estoqueee
on
ond.cod_item=e.cod_
d.cod_item=e.cod_item)
item)ononv.matr=d.matr
v.matr=d.matr

13
3
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• RIGHT OUTER JOIN
• Calcula o resultado da junção
• Adiciona ao resultado da junção
• Tuplas da relação à direita que não satisfazem a condição
de junção
• Atribui valores nulos aos atributos não definidos para estas
tuplas
• Exemplo
• Para cada empregado, listar nome do empregado, nome
do departamento e nome dos dependentes

select
selecte.nome,
e.nome,d.nome,
d.nome,p.nome
p.nome
from
from Departamento d innerjoin
Departamento d inner join(Dependente
(Dependenteppright
rightouter
outerjoin
join
Empregado e on p.matr_resp=e.matr) on d.cod_dep=e.lotação
Empregado e on p.matr_resp=e.matr) on d.cod_dep=e.lotação

13
4
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Formas de Junção em SQL Avançado (cont.)


• FULL OUTER JOIN
• Calcula o resultado da junção
• Adiciona ao resultado da junção
• Tuplas das relações envolvidas na junção que não
satisfazem a condição de junção
• Atribui valores nulos aos atributos não definidos para estas
tuplas
• Incluindo tuplas em uma tabela
• Cláusula Insert
• Sintaxe
INSERT [INTO] nome_tabela    [(lista_de_colunas))]
        { VALUES ( {  DEFAULT |  NULL  |    expr }[,...n] )
        | subquery }    
      

13
5
5. SQL
- Conjunto de Operações para Manipulação de Dados -

• Atualizando tuplas de uma tabela


• Cláusula Update
• Sintaxe
UPDATE nome_tabela
SET nome_coluna = {expr | NULL | (subquery) }
{, nome_coluna = {expr | NULL | (subquery) }}
WHERE predicado
• Removendo tuplas de uma tabela
• Cláusula Delete
• Sintaxe
DELETE FROM nome_tabela
WHERE predicado

13
6
5. SQL
- Visões -

• Acesso a um banco de dados


• Requer conhecimento do esquema
• Indesejável
• Para usuários inexperientes
• Desenvolvedores de aplicativos que acessam o BD
• Por questões de segurança e privacidade
• Grupos de usuários devem ter acesso a dados de
interesse
• O acesso a todo o banco de dados é perigoso
• Janelas sobre o banco de dados
• Cada janela mostra parte do banco de dados
• Diferentes visões
• Visões (views)
• Definidas sobre tabelas do banco de dados
• Tabelas base

13
7
5. SQL
- Visões -

• Tipos de visões
• Visão virtual
• A definição da visão é armazenada
• Dados da visão não são persistentes
• Sempre que referenciada
• Os dados são materializados
• Custo praticamente igual a cada materialização
• Quanto ao acesso
• Somente leitura
• Visões que só permitem acesso de leitura
• Permitem atualização
• Visões que permitem atualizações nas tabelas base

13
8
5. SQL
- Visões -

• Tipos de visões (cont.)


• Visão materializada
• Dados e definição são persistentes
• Problema de atualização dos dados da visão
• Sempre que há uma atualização nas tabelas base da visão
• Recalculada
• Atualizada
• Com intervenção humana
• Automática
• Reduz custos de materialização de resultado
• Visões somente para leitura
• Aplicações
• Implementação Data Warehouse
• Integração de fontes de dados heterogêneas

1
3
5. SQL
- Visões -

• Definição de visões em SQL


CREATE VIEW nome_da_visão
[(nome_coluna {, nome_coluna …})]
AS
subquery [WITH CHECK OPTION]
• WITH CHECK OPTION
• Especifica que atualizações (INSERT ou UPDATE) na
tabela base só serão permitidas se
• resultam em tuplas visíveis para a visão

14
0
Renomeias as
5. SQL colunas da visão
- Visões -
• Exemplos
create
createview
vieweempresa.v1
eempresa.v1(nome_departamento,
(nome_departamento,nome_empregado)
nome_empregado)
as
as
select
selectd.dnome,
d.dnome,e.enome
e.enome
from
fromeempresa.departamento
eempresa.departamentoddinner
innerjoin
joineempresa.empregado
eempresa.empregadoee
on
ond.codigo
d.codigo==e.cdep
e.cdep
select
select**from
fromeempresa.v1
eempresa.v1
select
select** O mesmo
comando SQL
from
from(( que define a visão
select v1
selectd.dnome,
d.dnome,e.enome
e.enome
from
fromeempresa.departamento
eempresa.departamentoddinner
innerjoin
join
eempresa.empregado
eempresa.empregadoee
on
ond.codigo
d.codigo==e.cdep
e.cdep
))as
astab
tab 14
1
Renomeias as
5. SQL colunas da visão
- Visões -
• Exemplos
create
createview
vieweempresa.v1
eempresa.v1(nome_departamento,
(nome_departamento,nome_empregado)
nome_empregado)
as
as
select
selectd.dnome,
d.dnome,e.enome
e.enome
from
fromeempresa.departamento
eempresa.departamentoddinner
innerjoin
joineempresa.empregado
eempresa.empregadoee
on
ond.codigo
d.codigo==e.cdep
e.cdep
select
selectnome_empregado
nome_empregado
from
fromeempresa.v1
eempresa.v1
where
wherenome_departamento
nome_departamento=='Marketing'
'Marketing'

14
2
Renomeias as
5. SQL colunas da visão
- Visões -
• Exemplos
create
createview
vieweempresa.v2
eempresa.v2(nome_empregado,
(nome_empregado,
numero_de_dependentes)
numero_de_dependentes)
as
as
select
selecte.enome,
e.enome,(select
(selectcount(*)
count(*)from
fromeempresa.dependente
eempresa.dependenteddwhere
where
d.cpf_responsavel
d.cpf_responsavel==e.cpf)
e.cpf)
from
fromeempresa.empregado
eempresa.empregado ee
select * from eempresa.v2
select * from eempresa.v2
select
select**
from
fromeempresa.v2
eempresa.v2
where
wherenumero_de_dependentes
numero_de_dependentes>>00

14
3
Renomeias as
5. SQL colunas da visão
- Visões -
• Exemplos
create
createview
vieweempresa.v3
eempresa.v3(nome_empregado,
(nome_empregado,salario)
salario)
as
as
select
selectenome,
enome,salario
salario
from
fromeempresa.empregado
eempresa.empregadoee
where
wheresalario
salario<<15000
15000with
withcheck
checkoption
option
select
select**from
fromeempresa.v3
eempresa.v3
select
select**
from
fromeempresa.v3
eempresa.v3
where
wheresalario
salario>>10000
10000

14
4
Renomeias as
5. SQL colunas da visão
- Visões -
• Exemplos
create
createview
vieweempresa.v3
eempresa.v3(nome_empregado,
(nome_empregado,salario)
salario)
as
as
select
selectenome,
enome,salario
salario
from
fromeempresa.empregado
eempresa.empregadoee
where
wheresalario
salario<<15000
15000with
withcheck
checkoption
option
update
updateeempresa.v3
eempresa.v3
set
setsalario
salario==salario
salario++1000
1000
select
select**from
fromeempresa.v3
eempresa.v3
update
updateeempresa.v3
eempresa.v3
set
setsalario
salario==salario
salario++1500
1500
select
select**from
fromeempresa.empregado
eempresa.empregado
14
5
5. SQL
- Visões -
• Exemplos
• Acessando o banco de dados através de visões
select * from V3

nome_empregado salário
----------------------------------- ------------------------
caio 10000
rebeca 13000

• Atualizando o banco de dados através de visões


update v3 set salário=salário+1000
select * from V3
matrícula salário
----------------------------------- ------------------------
caio 11000
rebeca 14000 Erro,
Erro,pois
poisas
astuplas
tuplasaaserem
serem
alteradas
alteradasvão
vãodeixar
deixarde
deser
servisíveis
visíveis
para V3 (where salario < 15000)
para V3 (where salario < 15000)
update v3 set salário=salário+1500
matrícula salário
----------------------------------- ------------------------
caio 12500
rebeca 15500

14
6
5. SQL
- Visões -

• Visões que permitem atualizações apresentam as seguintes restrições na


subconsulta
• A cláusula FROM deve possuir apenas uma tabela
• Tabela base
• Visão
• Deve permitir atualização
• Não estão especificadas as cláusulas group by e having
• A palavra reservada distinct não está especificada
• A cláusula where não contém subconsulta que referencia
qualquer tabela na cláusula from diretamente ou
indiretamente (via visões)
Restrição
Restriçãonão
nãoexistente
existenteno
noSQL
SQLServer
Server7.0
• Todas as colunas da subconsulta são colunas simples 7.0
• Não são permitidas colunas do tipo avg(salário) ou
expressões aritméticas

14
7
5. SQL
- Visões -

• Visões que permitem atualizações apresentam as seguintes restrições na


subconsulta
• ORACLE permite atualização em visões com junção de
duas tabelas
• Desde que a junção seja entre tabelas com
relacionamento 1:N
• A tabela do lado N tenha chave primária
• A atualização só pode ser feita em colunas da tabela
do lado N
• Exceto o atributo de junção

14
8