Sistema de Banco de Dados, 5/E
Capítulo 3: SQL
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Capítulo 3: SQL
Definição de dados
Estrutura básica das consultas SQL
Operações de conjunto
Funções agregadas
Valores nulos
Subconsultas aninhadas
Consultas complexas
Views
Modificação do banco de dados
Relações juntadas **
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
História
Linguagem IBM Sequel desenvolvida como parte do projeto System R
no IBM San Jose Research Laboratory
Renomeada para Structured Query Language (SQL)
Padrão SQL ANSI e ISO:
SQL-86
SQL-89
SQL-92
SQL:1999 (nome da linguagem se tornou concordante com o Ano 2000!)
SQL:2003
Os sistemas comerciais oferecem a maioria, se não todos, os recursos
da SQL-92, além de conjuntos de recursos variáveis dos últimos
padrões e recursos proprietários especiais.
Nem todos os exemplos aqui podem funcionar em seu sistema
específico.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Linguagem de definição de dados
•
Permite a especificação não só de um conjunto de relações, mas
também de informações sobre cada relação, incluindo:
O esquema para cada relação
O domínio dos valores associados a cada atributo
As restrições de integridade
O conjunto dos índices a serem mantidos para cada
relação
As informações de segurança e autorização para cada
relação
A estrutura de armazenamento físico de cada relação no
disco
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Tipos de domínio na SQL
char(n). String de caracteres de tamanho fixo com tamanho n especificado pelo
usuário.
varchar(n). String de caracteres de tamanho variável com tamanho n máximo
especificado pelo usuário.
int. Inteiro (um subconjunto finito de inteiros que é dependente da máquina).
smallint. Inteiro pequeno (um subconjunto dependente da máquina do tipo de
domínio inteiro).
numeric(p,d). Número de ponto fixo, com precisão de p dígitos especificada pelo
usuário, com n dígitos à direita do ponto decimal.
real, double precision. Números de ponto flutuante e ponto flutuante de precisão
dupla com precisão dependente da máquina.
float(n). Número de ponto flutuante, com precisão de pelo menos n dígitos.
Mais são abordados no Capítulo 4.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Construção de Create Table
Uma relação SQL é definida usando o comando create table:
–
create table r (A1 D1, A2 D2, ..., An Dn,
(restrição-de-integridade1),
...,
(restrição-de-integridadek))
r é o nome da relação
cada Ai é o nome de um atributo no esquema da relação r
Di é o tipo de domínio dos valores no domínio do atributo Ai
Exemplo:
–
create table agência
(nome_agência
char(15) not null,
cidade_agência
char(30),
ativo
integer)
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Restrições de integridade em Create Table
not null
primary key (A1, ..., An )
•
Exemplo: Declare nome_agência como a chave primária para agência
e certifique-se de que os valores de ativo não sejam negativos.
•
create table agência
(nome_agência char(15),
cidade_agência char(30),
ativo
integer,
chave primária (nome_agência))
•
Declaração de chave primária em um atributo assegura not null
automaticamente na SQL-89 em diante; precisa ser declarada
explicitamente na SQL-89
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Construções Drop Table e Alter Table
O comando drop table exclui do banco de dados todas as
informações sobre a relação removida.
O comando alter table é usado para acrescentar atributos a uma
relação existente:
–
–
alter table r add A D
onde A é o nome do atributo a ser acrescentado à relação r e D
é o domínio de A.
A todas as tuplas na relação é atribuído nulo como o valor para o
novo atributo.
O comando alter table também pode ser usado para descartar
atributos de uma relação:
–
–
alter table r drop A
onde A é o nome de um atributo da relação r
O descarte de atributos não é aceito por muitos bancos de dados.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Estrutura básica das consultas
•
•
•
•
•
•
•
•
A SQL é baseada em operações de conjunto e relacionais
com certas modificações e melhorias
Uma componente SQL típica tem a forma:
select A1, A2, ..., An
from r1, r2, ..., rm
where P
Ai representa um atributo
Ri representa uma relação
P é um predicado.
Essa consulta é equivalente à expressão de álgebra
relacional.
A ,A ,,A ( P (r1 r2 rm ))
1
•
2
n
O resultado de uma consulta SQL é uma relação.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
A cláusula select
A cláusula select lista os atributos desejados no resultado de uma
consulta
corresponde à operação projeção da álgebra relacional
Exemplo: Encontre os nomes de todas as agências na relação
empréstimo:
select nome_agência
from empréstimo
Na álgebra relacional, a consulta seria:
–
Õnome_agência (empréstimo)
NOTA: Os nomes SQL não fazem distinção entre letras maiúsculas
e minúsculas.
Algumas pessoas usam maiúsculas sempre que usamos o
estilo negrito.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
A cláusula select (cont.)
A SQL permite duplicatas nas relações bem como nos resultados
de consulta.
Para forçar a eliminação de duplicatas, insira a palavra-chave
distinct após select.
Encontre os nomes de todas as agências na relação empréstimo e
remova as duplicatas.
–
select distinct nome_agência
from empréstimo
A palavra-chave all especifica que as duplicatas não são
removidas.
–
select all nome_agência
from empréstimo
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
A cláusula select (cont.)
Um asterisco na cláusula select indica “todos os atributos”
–
select *
from empréstimo
A cláusula select pode conter expressões aritméticas envolvendo
os operadores +,
tuplas.
, * e / operando em constantes ou atributos de
A consulta:
– select número_empréstimo, nome_agência, quantia * 100
from empréstimo
– retornará uma relação que é a mesma relação empréstimo, exceto
que o atributo quantia é multiplicado por 100.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
A cláusula where
A cláusula where especificam condições que o resultado precisa
satisfazer
Corresponde ao predicado de seleção da álgebra relacional.
Para encontrar todos os números de empréstimo para
empréstimos feitos na agência Perryridge com quantias
superiores a US$1200:
–
select número_empréstimo
from empréstimo
where nome_agência = ‘ Perryridge’ and quantia > 1200
Os resultados da comparação podem ser combinados usando os
conectivos lógicos and, or, e not.
As comparações podem ser aplicadas aos resultados das
expressões aritméticas.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
A cláusula where (cont.)
A SQL inclui um operador de comparação between
Exemplo: Encontre o número de empréstimo dos
empréstimos com quantias entre US$ 90.000 e US$ 100.000
(ou seja, US$ 90.000 and US$ 100.000)
– select número_empr
from empréstimo
where quantia between 90000 and 100000
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
A cláusula from
A cláusula from lista as relações envolvidas na consulta
Corresponde à operação de produto cartesiano da álgebra relacional.
Encontre o produto cartesiano tomador X empréstimo
–
select *
from tomador, empréstimo
Encontre os nomes de cliente, os números de empréstimo e as quantias de
empréstimo para todos os empréstimos da agência Perryridge
•
select nome_cliente, tomador.número_empréstimo, quantia
from tomador, empréstimo
where tomador.número_empréstimo =
empréstimo.número_empréstimo and
nome_agência = ‘Perryridge’
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
A operação de renomeação
A SQL permite renomear relações e atributos usando a cláusula
as:
–
nome-antigo as nome-novo
Encontre o nome, o número de empréstimo e a quantia de
empréstimo de todos os clientes; renomeie a coluna
número_empréstimo como empréstimo_id.
•
select nome_cliente, tomador.número_empréstimo as id_empréstimo,
quantia
from tomador, empréstimo
where tomador.número_empréstimo = empréstimo.número_empréstimo
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Variáveis de tupla
As variáveis de tupla são definidas na cláusula from por meio da
cláusula as.
Encontre os nomes de cliente, os números de empréstimo e a
quantia para todos os clientes que têm um empréstimo em alguma
agência.
•
select nome_cliente, T.número_empréstimo, S.quantia
from tomador as T, empréstimo as S
where T.número_empréstimo = S.número_empréstimo
Encontre os nomes de todas as agências que têm ativos maiores
do que pelo menos uma agência localizada em Brooklyn
•
select distinct T.nome_agência
from agência as T, agência as S
where T.ativo > S.ativo and S.cidade_agência = ‘Brooklyn’
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Operações de string
A SQL incui um operador de correspondência de string para comparações em strings de
caractere. O operação like usa padrões que são descritos usando dois caracteres
especiais:
Porcentagem (%): O caractere % corresponde a qualquer substring.
Sublinhado (_): O caractere _ corresponde a qualquer caractere.
Encontre os nomes de todos os clientes cujos endereços de rua incluem a substring
‘Main’.
–
Localize o nome “Main%”
–
select nome_cliente
from cliente
where rua_cliente like ‘%Main%’
like ‘Main\%’ escape ‘\’
A SQL aceita várias operações de string como
concatenação (usando “||”)
conversão de maiúscula em minúscula (e vice-versa)
localização do tamanho da string, extração de substrings etc.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Ordenação da exibição de tuplas
Liste em ordem alfabética todos os clientes que têm um empréstimo na
agência Perryridge
–
select distinct nome_cliente
from tomador, empréstimo
where tomador número_empréstimo = empréstimo.número_empréstimo
and
nome_agência = ‘Perryridge’
order by nome_cliente
Podemos especificar desc para ordem decrescente ou asc para ordem
crescente, para cada atributo; a ordem crescente é o padrão.
Exemplo: order by nome_cliente desc
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Duplicatas
Em relações com duplicatas, a SQL pode definir quantas cópias
das tuplas aparecem no resultado.
Versões multiconjunto de algumas operações de álgebra relacional
— dadas as relações multiconjunto r1 e r2,:
• 1. (r1): Se existem c1 cópias da tupla t1 em r1, e t1 satisfaz a
seleção então, existem c1 cópias de t1 em (r1).
• 2. A (r ): Para cada cópia da tupla t1 em r1, existe uma cópia
da tupla A(t1) em A(r1), onde A(t1) indica a projeção da tupla
única t1.
• 3. r1 x r2 : Se existem c1 cópias da tupla t1 em r1 e c2 cópias da
tupla t2 em r2, existem c1 * c2 cópias da tupla t1.t2 em r1 r2.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Duplicatas (cont.)
Exemplo: suponha que as relações r1 (A,B) e r2 (C) sejam as
seguintes:
–
r1 = {(1, a) (2,a)}
r2 = {(2), (3), (3)}
Então, B(r1) seria {(a), (a)}, enquanto B(r1) r2 seria
–
{(a,2), (a,2), (a,3), (a,3), (a,3), (a,3)}
A semântica da duplicata SQL:
–
select A1,, A2, ..., An
from r1, r2, ..., rm
where P
–
é equivalente à versão de multiconjunto da expressão:
–
A1, A2,..., An(
Korth • Silberschatz • Sundarshan
P(r1
r2 ... rm))
Sistema de Banco de Dados, 5/E
Operações de conjunto
As operações SQL union, intersect e except operam em relações e
correspondem às operações da álgebra relacional .
Cada uma das operações acima elimina automaticamente as
duplicatas; para menter todas as duplicatas, use as versões de
multiconjunto correspondentes union all, intersect all e except all.
Suponha que uma tupla ocorre m vezes em r e n vezes em s; então,
ela ocorre:
m + n vezes em r union all s
min(m,n) vezes em r intersect all s
max(0, m – n) vezes em r except all s
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Set Operations
Encontre todos os clientes do banco que possuem um empréstimo, uma
conta ou as duas coisas no banco:
•
(select nome_cliente from depositante)
union
(select nome_cliente from tomador)
Encontre todos os clientes que possuem um empréstimo e uma conta no
banco:
•
(select distinct nome_cliente from depositante)
intersect
(select distinct nome_cliente from tomador)
Encontre todos os clientes que possuem uma conta mas nenhum
empréstimo no banco:
•
(select distinct nome_cliente from depositante)
except
•
(select nome_cliente from tomador)
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Funções agregadas
Essas funções operam no multiconjunto dos valores de uma
coluna de uma relação e retornam um valor
–
avg: valor médio
min: valor mínimo
max: valor máximo
sum: soma dos valores
count: número de valores
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Funções agregadas (cont.)
Encontre o saldo médio das contas na agência Perryridge.
–
select avg (saldo)
from conta
where nome_agência = ‘Perryridge’
Encontre o número de tuplas na relação cliente:
–
select count (*)
from cliente
Encontre o número de depositantes do banco:
–
(select count (distinct nome_cliente)
from depositante
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Funções agregadas – group by
Encontre o número de depositantes de cada agência.
•
(select nome_agência, count (distinct nome_cliente)
from depositante, conta
where depositante.número_conta = conta.número_conta
group by nome_agência
•
Nota: Os atributos na cláusula select fora das funções agregadas
precisam aparecer na lista group by.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Funções agregadas – Cláusula having
Encontre o nome de todas as agências onde o saldo médio é
maior que US$ 1200:
•
select nome_agência, avg (saldo)
from conta
group by nome_agência
having avg (saldo) > 1200
•
Nota: Os predicados na cláusula having são aplicados após a formação de
grupos, enquanto os predicados na cláusula where são aplicados antes da
formação de grupos.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Valores nulos
É possível que as tuplas tenham um valor nulo, indicado por nulo,
para algum(ns) de seus atributos
nulo significa um valor desconhecido ou que um valor não existe.
O predicado is null pode ser usado para verificar a presença de valores
nulos.
Exemplo: Encontre todos os números de empréstimo na relação
empréstimo com valores nulos para quantia:
–
select número_empréstimo
from empréstimo
where quantia is null
O resultado de qualquer expressão aritmética envolvendo nulo é nulo
Exemplo: 5 + nulo retorna nulo
Entretanto, as funções aregadas simplesmente ignoram nulos
Mais no próximo slide
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Valores nulos e lógica de três valores
Qualquer comparação com nulo retorna desconhecido
Exemplo: 5 < nulo or nulo <> nulo
or
nulo = nulo
Lógica de três valores usando o valor de verdade desconhecido:
OR: (desconhecido or verdadeiro) = verdadeiro, (desconhecido or falso)
= desconhecido
(desconhecido or desconhecido) = desconhecido
AND: (verdadeiro and desconhecido) = desconhecido,
(falso and
desconhecido) = falso,
(desconhecido and desconhecido) = desconhecido
NOT: (not desconhecido) = desconhecido
“P is unknown” evaluates to true if predicate P evaluates to
desconhecido
Resultado do predicado da cláusula where é tratado como falso se
avaliar para desconhecido
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Valors nulos e aregados
Total das quantias de empréstimo
–
select sum (quantia )
from empréstimo
A instrução acima ignora quantias nulas
O resultado é nulo se não houver uma quantia não nula
Todas as operações agregadas exceto count(*) ignoram tuplas com
valores nulos nos atributos agregados.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Subconsultas aninhadas
A SQL fornece um mecanismo para aninhar subconsultas.
Uma subconsulta é uma expressão select-from-where que é
aninhada dentro de outra consulta.
Um uso comum das subconsultas é realizar testes para
participação de conjuntos, fazer comparações de conjuntos e
determinar cardinalidade de conjuntos.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Consulta de exemplo
Encontre todos os clientes que possuem uma conta e um
empréstimo no banco.
select distinct nome_cliente
from tomador
where nome_cliente in (select nome_cliente
from depositante)
Encontre todos os clientes que possuem um empréstimo no banco,
mas que não têm uma conta no banco.
select distinct nome_cliente
from tomador
where nome_cliente) not in (select nome_cliente
from depositante)
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Consulta de exemplo
Encontre todos os clientes que possuem uma conta e um
empréstimo na agência Perryridge
select distinct nome_cliente
from tomador, empréstimo
where tomador.número_cliente = empréstimo.número_empréstimo and
nome_agência = ‘Perryridge’ and
(nome_agência, nome_cliente) in
(select nome_agência, nome_cliente
from depositante, conta
where depositante.número_conta
= conta.número_conta)
Nota: A consulta acima pode ser escrita de uma maneira muito
mais simples. A formulação acima é simplesmente para ilustrar
os recursos da SQL.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Comparação de conjuntos
Encontre os nomes de todas as agências que possuem ativos maiores
do que o ativo de pelo menos uma agência localizada em Brooklyn.
select distinct T.nome_agência
from agência as T, agência as S
where T.ativo > S.ativo and
S.cidade_agência = ‘Brooklyn’
Mesma consulta usando a cláusula > some
– Select ome_agência
from agência
where ativo > some
(select ativo
from agência
where cidade_agência = ‘Brooklyn’)
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Definição da cláusula some
•
F <comp> some r t r tal que (F
<comp> t )
Onde <comp> pode ser:
(5 < some
•
(5 < some
•
(5 = some
•
(5 some
5)
0
5
6
0
5
0
5
0
5
) = verdadeiro
leia: 5 < alguma tupla na
relação)
) = falso
) = verdadeiro
) = verdadeiro (já que 0
•
(= some) in
•
Entretanto, ( some) not in
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Consulta de exemplo
Encontre os nomes de todas as agências que possuem ativos
maiores do que todas as agências localizadas em Brooklyn.
select nome_agência
from agência
where ativo > all (select ativo
from agência
where cidade_agência = ‘Brooklyn’)
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Definição da cláusula all
F <comp> all r t r (F <comp> t)
(5 < all
0
5
6
6
10
) = falso
•
(5 < all
•
(5 = all
•
(5 all
•
( all) not in
•
Entretanto, (= all) in
4
5
4
6
) = verdadeiro
) = falso
) = verdadeiro (já que 5 4 e 5 6)
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Teste para relações vazias
A construção exists retorna o valor true se a subconsulta
de argumento não é vazia.
exists r r Ø
not exists r r = Ø
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Consulta de exemplo
Encontre todos os clientes que têm uma conta em todas as agências
localizadas em Brooklyn.
select distinct S.nome_cliente
from depositante as S
where not exists ((select nome_agência
from agência
where cidade_agência = ‘Brooklyn’)
except
(select R.nome_agência
from depositante as T, conta as R
where T.número_conta = R.número_conta and
S.nome_cliente = T.nome_cliente))
Note que X – Y = Ø X Y
Nota: Não é possível escrever essa consulta usando = all e suas variantes.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Teste para ausência de tuplas duplicatas
A construção unique testa se uma subconsulta possui alguma
tupla duplicata em seu resultado.
Encontre todos os clientes que possuem pelo menos uma conta
na agência Perryridge.
– select T.nome_cliente
from depositante as T
where unique (select R.nome_cliente
from conta, depositante as R
where T.nome_cliente = R.nome_cliente and
R.número_conta = conta.número_conta and
conta.nome_agência = ‘Perryridge’
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Consulta de exemplo
Encontre todos os clientes que têm pelo menos duas contas na
agência Perryridge.
select distinct T.nome_cliente
from depositante as T
where not unique (select R.nome_cliente
from conta, depositante as R
where T.nome_cliente = R.nome_cliente and
R.número_conta = conta.número_conta and
conta.nome_agência = ‘Perryridge’
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Relações derivadas
A SQL permite que uma expressão de subconsulta seja usada
na cláusula from
Encontre o saldo médio das agências onde o saldo médio é
maior que US$1200.
– select nome_agência, saldo_médio
from (select nome_agência, avg (saldo)
from conta
group by nome_agência)
as média_agência (nome_agência, saldo_médio)
where saldo_médio > 1200
•
Note que não precisamos usar a cláusula having, já que a
subconsulta na cláusula from calcula o saldo médio e seu
resultado é nomeado como média_agência; podemos usar os
atributos de média_agência diretamente na cláusula where.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Cláusula With
A cláusula with fornece uma maneira de definir uma view
temporária cuja definição está disponível apenas para a
consulta onde a cláusula with ocorre.
Encontre todas as contas com o saldo máximo.
with saldo_máximo (valor) as
select max (saldo)
from conta
select número_conta
from conta, saldo_máximo
where conta.saldo = saldo_máximo.valor
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Consulta complexa usando a cláusula With
Encontre todas as agências onde o depósito em conta total é maior
do que a média dos depósitos totais em todas as agências.
with total_agência (nome_agência, valor) as
select nome_agência, sum (saldo)
from conta
group by nome_agência
with média_total_agência (valor) as
select avg (valor)
from total_agência
select nome_agência
from total_agência, média_total_agência
where total_agência.valor >= média_total_agência.valor
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Views
Em alguns casos, não é desejável que todos os usuários vejam o
modelo lógico inteiro (ou seja, todas as relações reais armazenadas no
banco de dados.)
Considere uma pessoa que precisa saber o número de empréstimo e o
nome da agência de um cliente, mas não precisa ver o valor do
empréstimo. Essa pessoa deve ver uma relação descrita, na SQL, por
(select nome_cliente, número_empréstimo
from tomador, empréstimo
where tomador.número_empréstimo =
empréstimo.número_empréstimo )
Uma view fornece um mecanismo para ocultar certos dados da visão de
certos usuários.
Qualquer relação que não seja do modelo conceitual mas é visível a um
usuário como uma “relação virtual” é chamada uma view.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Definição de view
Uma view é definida usando o comando create view, que tem a forma
– create view v as <expressão de consulta>
– onde <expressão de consulta> é qualquer expressão de consulta
válida. O nome da view é representado por v.
Uma vez uma view é definida, o nome da view pode ser usado para se
referir à relação virtual gerada por ela.
Definição de view não é o mesmo que criar uma nova relação
avaliando a expressão de consulta.
Em vez disso, uma definição de view causa o salvamento de uma
expressão; a expressão é substituída nas consultas usando a
view.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Consultas de exemplo
Uma view consistindo nas agências e seus clientes
create view todos_clientes as
(select nome_agência, nome_cliente
from depositante, conta
where depositante.número_conta = conta.número_conta)
union
(select nome_agência, nome_cliente
from tomador, empréstimo
where tomador.número_empréstimo = empréstimo.número_empréstimo
Encontre todos os clientes da agência Perryridge
select nome_cliente
from todos_clientes
where nome_agência = ‘Perryridge’
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Views definidas usando outras views
Uma view pode ser usada na expressão que define outra view
Diz-se que uma relação de view v1 depende diretamente de uma relação de
view v2 se v2 é usada na expressão que define v1
Diz-se que uma relação de view v1 depende da relação de view v2 se v1
depende diretamente de v2 ou se existe um caminho de dependências de v1 a
v2
Diz-se que uma relação de view v é recursiva se ela depende de si mesma.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Expansão de view
•
Uma forma de definir o significado das views definidas em termos de outras
views.
•
Façamos a view v1 ser definida por uma expressão e1 que pode, ela própria,
conter usos das relações de view.
•
A expansão de view de uma expressão repete o seguinte passo de
substituição:
repeat
•
Encontre qualquer relação de view vi em e1
•
Substitua a relação de view vi pela expressão que define vi
until (até que) nenhuma outra relação de view esteja presente em e1
•
Desde que as definições de view não são recursivas, esse loop irá terminar.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Modificação do banco de dados – exclusão
Exclua todas as tuplas conta na agência Perryridge
delete from conta
where nome_agência = ‘Perryridge’
Exclua todas as contas em cada agência localizada em Needham.
delete from conta
where nome_agência in (select nome_agência
from agência
where cidade_agência = ‘Needham’)
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Consulta de exemplo
Exclua os registros de todas as contas com saldos abaixo da média
no banco.
delete from conta
where saldo < (select avg (saldo)
from conta)
Problema: Conforme excluímos tuplas do depósito, o saldo médio é
modificado.
Solução usada na SQL:
1 Primeiro, calcule o saldo avg e encontre todas as tuplas a serem excluídas
2 Em seguida, exclua todas as tuplas encontradas acima (sem recalcular
avg ou retestar as tuplas)
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Modificação do banco de dados – inserção
Insira uma nova tupla em conta
– insert into conta
values (‘A-9732’, ‘Perryridge’, 1200)
ou equivalentemente
insert into conta (nome_agência, saldo, número_conta)
values (‘Perryridge’, 1200, ‘A-9732’)
Insira uma nova tupla em conta com saldo definido como nulo
–
insert into conta
values (‘A-777’,‘Perryridge’, nulo )
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Modificação do banco de dados – inserção
Ofereça uma nova conta de poupança no valor de US$ 200 como um presente
para todos os clientes de empréstimo da agência Perryridge Deixe que o
número de empréstimo sirva como o número de conta para a conta de
poupança.
–
insert into conta
select número_empréstimo, nome_agência, 200
from empréstimo
where nome_agência = ‘Perryridge’
insert into depositante
select nome_cliente, número_empréstimo
from tomador, empréstimo
where tomador.número_empréstimo = empréstimo.número_empréstimo and
nome_agência = ‘Perryridge’
A instrução select from where é avaliada totalmente antes de quaisquer dos seus
resultados serem inseridos na relação (caso contrário, consultas como
insert into tabela1 select * from tabela1
causariam problemas
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Modificação do banco de dados –
atualizações
Aumente todas as contas com saldos acima de US$ 10000 em 6 por cento,
enquanto todas as outras recebem 5 por cento.
Escreva duas instruções update:
update conta
set saldo = saldo * 1,06
where saldo >= 10000
update conta
set saldo = saldo * 1,05
where saldo <= 10000
A ordem é importante
•
Pode ser feito melhor usando a instrução case (próximo slide)
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Instrução case para atualizações
condicionais
Mesma consulta de antes: Aumente todas as contas com saldos
acima de US$10000 em 6 por cento, enquanto todas as outras
recebem 5 por cento.
update conta
set saldo = case
when saldo <= 10000 then saldo * 1,05
else saldo * 1,06
end
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Atualização de uma view
Crie uma view de todos os dados de empréstimo na relação
empréstimo, ocultando o atributo quantia
–
create view agência_empréstimo as
select nome_agência, número_empréstimo
from empréstimo
Insira uma nova tupla em agência_empréstimo
insert into agência_empréstimo
values (‘Perryridge’, ‘L-307’)
Essa inserção precisa ser representada pela inserção da tupla
(‘L-307’, ‘Perryridge’, nulo )
na relação empréstimo
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Atualizações através de Views (cont.)
Algumas atualizações através de views são impossíveis de se
traduzirem em atualizações nas relações de banco de dados
create view v as
select nome_agência from conta
–
insert into v values (‘L-99’, ‘ Downtown’, ‘23’)
Outras não podem ser traduzidas unicamente
insert into todos_clientes values (‘ Perryridge’, ‘John’)
Precisa escolher empréstimo ou conta, e criar um novo
número de empréstimo/conta!
A maioria das implementações SQL permite atualizações apenas em
views simples (sem agregados) definidas em uma única relação.
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Relações juntadas**
As operações de junção tomam duas relações e retornam como resultado outra relação.
Essas operações adicionais normalmente são usadas como expressões de subconsulta
na cláusula from.
Condição de junção – define que tuplas nas duas relações correspondem e que atributos
estão presentes no resultado da junção.
•
Tipo de junção – define como são tratadas as tuplas em cada relação que não
corresponde a qualquer tupla na outra relação (com base na condição de junção).
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Relações juntadas – datasets
para exemplos
Relação empréstimo
Relação tomador
Nota: Informações de tomador faltando para L-260 e informações
de empréstimo faltando para L-155
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Relações juntadas – Exemplos
empréstimo inner join tomador on
empréstimo.número_empréstimo = tomador.número_empréstimo
empréstimo left outer join tomador on
empréstimo.número_empréstimo = tomador.número_empréstimo
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Relações juntadas – Exemplos
empréstimo natural inner join tomador
empréstimo natural right outer join tomador
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Relações juntadas – Exemplos
empréstimo full outer join tomador using (número_empréstimo)
Encontre todos os clientes que possuem uma conta ou um empréstimo
(mas não ambos) no banco.
select nome_cliente
from (depositante natural full outer join tomador)
where número_conta is null or número_empréstimo is null
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Fim do Capítulo 3
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Figura 3.1: Esquema do banco de dados
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Figura 3.3: Tuplas inseridas
em empréstimo e tomador
Korth • Silberschatz • Sundarshan
Sistema de Banco de Dados, 5/E
Figura 3.4:
As relações empréstimo e tomador
Korth • Silberschatz • Sundarshan