VII- Álgebra Relacional
Um pequeno conjunto de operadores que nos
permite manipular relações. Os operadores são:
1.União, interseção, e diferença. Como os
operadores da teoria dos conjuntos.
– Restrição: os esquemas de relação devem ser os
mesmos.
2.Seleção: Somente certas linhas de uma relação.
3.Projeção: Somente certas colunas.
4.Produto e Junção: Juntando duas relações de uma
maneira útil.
Algebra Relacional
• Poder de expressão limitado (subconjunto de todas as consultas
possíveis)
• Pode ser otimizada (isto é, as operações para uma consulta podem ser
colocadas em uma ordem ótima, visando diminuir os custos do
processamento da consulta)
• Mesmo limitada, é rica o bastante para expressar muitas consultas
úteis
Notação:
 SELEÇÃO
π PROJEÇÃO
X PRODUTO CARTESIANO
U UNION
– DIFERENÇA
 INTERSEÇÃO
 THETA-JUNÇÃO
JUNÇÃO NATURAL
Esquema Relacional
Depósito(filial, conta, cliente, saldo)
Cliente(cliente, rua, cidade)
Empréstimo(filial, no-empres, cliente, valor)
Filial(filial, ativo, cidade)
Empres
T1
T2
T3
T4
Filial
Subúrbio
Subúrbio
Subúrbio
Centro
No-empres Cliente
123
234
235
612
Fred
Saul
Saul
Ana
Valor
600
1200
1500
2000
SELECÃO

(R)
grau((R)) = grau(R)
0  card((R))  card(R)
(R) (R)
 é uma condição de seleção: termos da forma: atributo op
valor[atributo]
op é um de < = >  ≠ ≥
exemplo de termo: filial = ‘Subúrbio’
termos são conectados por
, , 
filial = ‘Subúrbio’  valor > 1000 (Emprestimo)
Subúrbio 234 Saul 1200
Subúrbio 235 Saul 1500
PROJEÇÃO
π i ,...,i (R)
1
m
0  card (π A (R))  card (R)
grau (π A (R)) = m  grau(R) = n
(R)
1  ij  n atributos
produz um conjunto de m-tuplas a1,...,am
tal que n-tupla b1,...,bn em R em que aj = bij para j = 1,...,m
π filial, cliente
(Emprestimo)
Subúrbio
Fred
Subúrbio
Saul
Centro
Ana
Produto
R = R1  R2
combina cada tupla t1 de R1 com cada tupla t2
de R2 e coloca em R a tupla t1t2.
Produto Cartesiano ()
grau(R) = k1
grau(R  S) = k1 + k2
grau(S) = k2
card(R  S) = card(R)  card(S)
R  S é o conjunto de todas as possíveis (k1 + k2)-tuplas
cujos primeiros k1 atributos são uma tupla em R
últimos k2 atributes são uma tupla em S
R
A B C D
S
D E F
RS
A B C D D' E F
Theta-Junção
R = R1 C R2
é equivalente a R = C(R1  R2).
grau(R) = r
R  S=
(R  S)
R.A<S.D
grau(S) = s
grau (R  S) = r + s
0  card(R  S) card(R)  card(S)
 pode ser < > = ≠ 
Se igual (=), então é
um EQUIJOIN
R(A B C) S(C D E) T(A BC C’DE)
135
211
135122
246
122
135334
357
334
135443
468
443
246334
246443
357443
União (R  S) grau(R) = grau(S) = grau(R  S)
max(card(R),card(S)) card(R  S)card(R) + card(S)
Conjunto de tuplas em R ou S ou ambas
R R  S
S R  S
Encontrar os clientes da filial `Centro´
πCliente ( Filial = “Centro" ( Empréstimo  Depósito) )
Diferença(R S)
grau(R) = grau(S) = grau(R – S)
0 card(R – S)card(R)
R – S R
tuplas em R não em S
Depositantes da agência `Centro´ que não pediram empréstimo
πcliente ( filial = ‘Centro’
(Deposito – Emprestimo)
Deposito
< Centro, 36, Patricia, 500 >
Deposito
< Centro, 71, Saul, 1000 >
Emprestimo
< Centro, 72, Patrícia, 10000 >
πcliente (filial = ‘Centro’
πcliente (filial = ‘Centro’
(Depósito )) (Empréstimo))
(π (D)  π (E)) funciona?
Combinando as Operações
Álgebra =
1. Argumentos +
2. Maneiras de se construir expressões algébricas.
Para a álgebra relacional:
1. Argumentos = variáveis-relações + constantes
(instâncias finitas de relações).
2. Expressões: operadores + parênteses
• Consulta = expressão de álgebra relacional.
Notação Linear p/ Expressões
• Inventar novos nomes para relações intermediárias, e
atribuir a elas valores que são expressões algébricas.
• Inventar nomes convenientes para os atributos das relações
intermediárias
Exemplo
Encontre os bares que estão ou na Avenida Oceânica ou
vendem Bud por menos de 3,00.
Vende(bar, cerveja, preço)
Bar(nome, end)
R1(nome) := nome( end = `Av. Oceânica´ (Bar))
R2(nome) := bar( cerveja = `Bud´ AND preço < 3,00
(Vende))
R3(nome) := R1  R2
Semântica de Bags
Uma relação (em SQL, ao menos) é realmente um
bag ou multiset, em vez de um conjunto
• Pode conter a mesma tupla mais de uma vez,
embora não haja uma ordem específica.
• Exemplo: {1,2,1,3} é um bag e não um conjunto.
• Selecão, projecão, e junção trabalham para bags
tão bem como para sets.
– Trabalham tupla-a-tupla, e não eliminam duplicatas.
União de Bags
Soma as vezes em que um elemento aparece nos dois bags.
• Exemplo: {1,2,1}  {1,2,3,3} = {1,1,1,2,2,3,3}.
Interseção de bags
Toma o mínimo de ocorrências em cada bag.
• Exemplo: {1,2,2,1}  {1,2,2,3,3} = {1,2,2}.
Diferença de bags
Subtrai o número de ocorrências nos dois bags.
• Exemplo: {1,2,1} – {1,2,3,3} = {1}.
Leis para Bags Diferem de Leis para
Conjuntos
• Algumas leis familiares continuam valendo para bags.
– Exemplos: união e interseção são ainda comutativas e
associativas.
• Mas outras leis que valem para conjuntos não valem para
bags.
Exemplo
R  (S  T)  (R  S)  (R  T) vale para conjuntos.
• Sejam R, S, e T cada um o bag {1}.
• Lado esquerdo: S  T = {1,1}; R  (S  T) = {1}.
• Lado direito: R  S = R  T = {1};
(R  S)  (R  T) = {1}  {1} = {1,1}  {1}.
Álgebra Relacional Estendida (“Não
Clássica")
Trata com bags.
1. Operator  de eliminação de duplicatas.
2. Projeção estendida.
3. Operador  de classificação.
4. Operador  de agrupamento e agregação.
5. Operador o de junção externa.
Eliminação de Duplicatas
(R) = relação com uma cópia de cada tupla que aparece uma
ou mais vezes em R.
Exemplo
R=
A
1
3
1
B
2
4
2
A
1
3
B
2
4
(R) =
Classificação
• L(R) = lista de tuplas de R, ordenada segundo os
atributos na lista L.
• Note que o resultado não é nem bag e nem
conjunto. É lista ou array.
– Conseqüência:  não pode ser seguido por quaisquer
outros operadores relacionais.
Exemplo
R= A
B
1
3
3
4
5
2
B(R) = [(5,2), (1,3), (3,4)].
Projeção Estendida
Permite que as colunas na projeção sejam funções de
uma ou mais colunas da relação-argumento.
Exemplo
R=
A
B
1
2
3
4
A+B,A,A(R) =
A+B
A1
3
1
7
3
A2
1
3
Operadores de Agregação
• Não há operadores relacionais; em vez
disso eles sumarizam os valores de uma ou
mais colunas de alguma forma.
• Os 5 operadores-padrão de agregação:
Sum, Average, Count, Min, e Max.
Operadores de Agrupamento
L(R), onde L é uma lista de elementos que são ou
a) Atributos individuais (grupos) ou
b) Da forma (X), em que  é um operador de agregação
e X o atributo ao qual ele é aplicado
É calculado assim:
1. Agrupar R segundo os grupos definidos na lista L.
2. Dentro de cada grupo, calcular (X), para cada (X) na
lista L.
3. O resultado é a relação cujas colunas consistem de cada
elemento da lista L sendo uma linha para cada grupo.
Exemplo
Seja R =
bar
cerveja
Alemão
Bud
Alemão
Skol
Moraes
Bud
Moraes
Brahma
Tricolor
Skol
Rubronegro Brahma
preço
2,00
2,75
2,50
3,00
3,25
3,00
Calcular cerveja,AVG(preço)(R).
1. Agrupar pelo(s) atributo(s) de agrupamento, cerveja neste caso:
bar
cerveja preço
Alemão
Bud
2,00
Moraes
Bud
2,50
Alemão
Skol
2,75
Tricolor
Skol
3,25
Moraes
Brahma 3,00
Rubronegro Brahma 3,00
2. Calcular a média de preço dentro dos grupos:
cerveja
Bud
Skol
Brahma
AVG(preço)
2.25
3.00
3.00
Junção Externa
A junção normal pode “perder” informação, isto é, as
tuplas que não casam com as condições de junção.
• O valor null  pode ser usado para fazer aparecer
as tuplas não casadas.
• Isto é feito pelo operação junção externa o
("outerjoin")
• Variações: theta-junção externa, junções externas
esquerda e direita.
Exemplo
R=
A
1
3
B
2
4
S=
B
4
6
C
5
7
A
3
1

B
4
2
6
R
o
S=
C
5 junção natural
 junção externa direita
7 junção externa esquerda
VIII- A Linguagem SQL
• Uma maquilagem na álgebra relacional,
para torná-la mais palatável ao programador
• Forma Principal:
SELECT atributos desejados
FROM variáveis do tipo tupla varrendo relações
WHERE condições sobre as variáveis-tupla;
Esquema-Exemplo
Esquema relacional:
Cerveja(nome, fab)
Bar(nome, end, alvará)
Boêmio(nome, end, telefone,
cervejafav)
Gosta_de(boêmio, cerveja)
Vende(bar, cerveja, preço)
Frequenta(boêmio, bar)
Exemplo
Que cervejas são fabricadas por Anheuser-Busch?
Cerveja(nome, fab)
SELECT nome
FROM Cerveja
WHERE fab = 'Anheuser-Busch';
• Nota: aspas simples para cadeias de caracteres.
nome
Bud
Bud Lite
Michelob
Semântica Formal
de Consultas SQL a uma Relação Simples
1. Comece com a relação na cláusula FROM.
2. Aplique , usando a condição como a cláusula
WHERE (bag) .
3. Aplique , usando os atributos como a cláusula
SELECT (projeção estendida, bag) .
Semântica Operacional Equivalente
Imagine uma variável tupla varrendo todas as tuplas
da relação. Para cada tupla:
• Verifique se ela satisfaz a cláusula WHERE.
• Exiba os (alguns) valores em termos de um
SELECT.
Listar todos os Atributos
Cerveja(nome, fab)
SELECT *
FROM Cerveja
WHERE fab = 'Anheuser-Busch';
nome
Bud
Bud Lite
Michelob
fab
Anheuser-Busch
Anheuser-Busch
Anheuser-Busch
Renomeando Colunas
Cerveja(nome, fab)
SELECT nome AS cerveja
FROM Cerveja
WHERE fab = 'Anheuser-Busch';
cerveja
Bud
Bud Lite
Michelob
Colunas como Expressões
Vende(bar, cerveja, preço)
SELECT bar, cerveja,
preço*120 AS preço_em_Yen
FROM Vende;
bar
Tricolor
Rubronegro
…
…
cerveja preço_em_Yen
Bud
300
Miller 360
…
• Note: sem a cláusula WHERE (OK).
• Dica: insira constantes na cláusula SELECT, se
isto fizer sentido.
Gosta(boêmio, cerveja)
SELECT boêmio,
‘gosta de Bud' AS que_gosta_de_Bud
FROM Gosta
WHERE cerveja = 'Bud';
boêmio
Salete
Fred
…
que_gosta_de_Bud
gosta de Bud
gosta de Bud
…
Padrões
• % significa qualquer cadeia de caracteres.
• _ significa qualquer caractere.
• “Atributo LIKE padrão” é uma condição que é verdadeira
se o valor do atributo (uma cadeia de caracteres) casar com
o padrão.
– Também NOT LIKE para negação.
Exemplo
Encontre os boêmios cujo código de telefone tem 72-.
Boêmio(nome, end, fone)
SELECT nome
FROM Boêmio
WHERE fone LIKE '%72-_ _ _ _ _ _ _’;
• Os padrões devem vir entre aspas, como para cadeias de
caracteres.
Nulls
Em lugar de um valor de um componente de uma
tupla.
• A interpretação não é exatamente “valor faltando.”
• Podia ser também “valor não apropriado.”
Lógica de Nulls
• Terceiro valor booleano DESCONHECIDO.
• Uma consulta somente produz valores se a
condição da cláusula WHERE for VERDADE
(DESCONHECIDO não é suficiente).
Exemplo
bar
cerveja
Rubronegro Brahma
preço
NULL
SELECT bar
FROM Vende
WHERE preço < 2,00 OR preço >= 2,00;
DESCONHECIDO
DESCONHECIDO
DESCONHECIDO
• O bar Tricolor não é selecionado, mesmo se a
cláusula WHERE é uma tautologia.
Lógica dos 3 Valores
verdade = 1; falso = 0, e desconhecido = 1/2. Então:
• AND = min.
• OR = max.
• NOT(x) = 1 – x.
Algumas Leis não Funcionam
Exemplo: p OR NOT p = verdade
• Para a lógica dos 3-valores: se p = desc., então
lado esquerdo = max(1/2,(1–1/2)) = 1/2 ≠ 1.
• Como a álgebra para bags, a lógica dos 3 valores
tem a sua própria lógica.
Teste de NULL
• A condição atributo = NULL é avaliada sempre
como DESCONHECIDO, mesmo se o valor do
atributo é NULL!
• Use atributo IS NULL ou atributo IS
NOT NULL se você quiser testar para NULL.
Consultas a mais de uma Relação
• Lista das relações na cláusula FROM.
• A notação relação-ponto-atributo remove a ambigüidade se
duas relações têm atributos com o mesmo nome.
Exemplo
Encontre as cervejas que os freqüentadores do bar
Tricolor gostam.
Gosta(boêmio, cerveja)
Freqüenta(boêmio, bar)
SELECT cerveja
FROM Freqüenta, Gosta
WHERE bar = ‘Tricolor AND
Freqüenta.boêmio = Gosta.boêmio;
Semântica Formal de Consultas a mais de
uma Relação
Comece com o produto das relações na cláusula FROM.
Considere uma variável-tupla para cada relação da cláusula
FROM.
• Imagine essas variáveis-tupla cada uma apontando para
uma tupla de sua relação, em todas as combinações.
• Se para uma dessas combinações o valor da cláusula
WHERE é verdade, então exiba os valores dos atributos do
SELECT para a combinação.
drinker bar
f
Sally
Joe’s
drinker beer
Sally
Likes
Frequents
l
Variáveis-Tupla Explícitas
Algumas vezes necessitamos fazer referência a `cópias´ de uma
relação.
• Use variáveis-tupla como sinônimos de relações.
Exemplo
Encontre pares de cerveja do mesmo fabricante.
Cerveja(nome, fab)
SELECT c1.nome, c2.nome
FROM Cerveja c1, Cerveja c2
WHERE c1.fab = c2.fab AND
c1.nome < c2.nome;
• SQL permite AS entre uma relação e sua variável-tupla;
Oracle não.
• Note que c1.nome < c2.nome é necessária para evitar
produzir (Bud, Bud), ou ((Bud, Brahma), (Brahma, Bud)).
Subconsultas
O resultado de um Select-From-Where pode ser usado na cláusula Where de
uma outra consulta.
Caso mais simples: a subconsulta retorna uma única
tupla, de grau um
Encontre os bares que servem Boêmia com o preço da Brahma no bar
Tricolor.
Vende(bar, cerveja, preço)
SELECT bar
FROM Venda
WHERE cerveja = ‘Boêmia' AND preço =
(SELECT preço
FROM Vende
WHERE bar = `Tricolor´ AND
cerveja = `Brahma´;
• Note a regra de escopo: um atributo refere-se à subconsulta mais próxima,
que produz um valor do mesmo.
• Parentetização das subconsultas é essencial.
O Operador IN
“Tupla IN relação” é verdade sss a tupla está na relação.
Exemplo
Encontre o nome e o fabricante das cervejas que Fred gosta.
Cerveja(nome, fab)
Gosta(boêmio, cerveja)
SELECT *
FROM Cerveja
WHERE nome IN
(SELECT cerveja
FROM Gosta
WHERE boêmio = 'Fred’);
• Também: NOT IN.
EXISTS
“[NOT]EXISTS(relação)” é verdade sss a relação [é] não é vazia.
Exemplo
Encontre os fabricantes que fornecem unicamente uma marca de
cerveja.
Cerveja(nome, fab)
SELECT nome
FROM Cerveja c1
WHERE NOT EXISTS
(SELECT *
FROM Cerveja
WHERE fab = c1.fab AND
nome <> c1.nome);
• Note a regra de escopo: para se referir a Cerveja na
subconsulta, c1 é passada como parâmetro.
• Desta forma, a subconsulta é uma subconsulta correlacionada.
Quantificadores
ANY e ALL comportam-se como quantificadores existencial ("ao
menos um") e universal, respectivamente.
• Em linguagem comum, “any” e “all” parecem sinônimos, i.e.,
“Eu sou mais gordo que qualquer um de vocês” vs. “Eu sou
mais gordo que todos vocês” Mas em SQL:
Exemplo
Encontre a(s) cerveja(s) vendida(s) pelo mais alto preço.
Vende(bar, cerveja, preço)
SELECT cerveja
FROM Vende
WHERE preço >= ALL(
SELECT preço
FROM Vende);
Em Classe
Encontre a(s) cerveja(s) que não é(são) vendida(s) pelo mais alto
preço.
União, Interseção, Diferença
“(subconsulta) UNION (subconsulta)” produz a união das duas relações.
• Similaridade para INTERSECT, EXCEPT = interseção e diferença de
conjuntos.
– Mas: em Oracle diferença de conjuntos é MINUS, não EXCEPT.
Exemplo
Encontre os boêmios e cervejas tais que o boêmio gosta da cerveja e
freqüenta o bar que a serve.
Gosta(boêmio, cerveja)
Vende(bar, cerveja, preço)
Freqüenta(boêmio, bar)
(SELECT * FROM Gosta)
INTERSECT
(SELECT boêmio, cerveja
FROM Vende, Freqüenta
WHERE Freqüenta.bar = Vende.bar);
Forçando a Semântica de Set/Bag
• O default para select-from-where é bag; o
default para união, interseção, e diferença é
conjunto.
– Por que? Salva tempo quando não se compara
as tuplas geradas.
– Entretanto, é preciso comparar para união,
interseção e diferença.
• Para forçar conjunto em select-from-where
usa-se DISTINCT depois do SELECT.
– Leve em conta o custo.
Exemplo
Encontre os diferentes preços das cervejas.
Vende(bar, cerveja preço)
SELECT DISTINCT preço
FROM Vende;
• Força a semântica de bag com ALL depois
de UNION, etc.
Expressões Baseadas em Junção
Há várias maneiras possíveis.
• Podem ser usadas ou “stand-alone” (em lugar de um
select-from-where) ou para definir uma relação na
cláusula FROM.
R NATURAL JOIN S
R JOIN S ON condition
i.e., condition: R.B=S.B
R CROSS JOIN S
R OUTER JOIN S
• Outerjoin pode ser modificada por:
1. NATURAL na frente.
2. ON condition no fim.
3. LEFT, RIGHT, ou FULL (default) antes de OUTER.
–
LEFT = preenche (com NULL) tuplas de R somente; RIGHT =
preenche tuplas de S somente.
Agregações
Sum, avg, min, max, e count aplicam-se a atributos/colunas.
Também, count(*) aplica-se a tuplas.
• Usadas na lista do SELECT.
Exemplo
Encontre o preço médio da cerveja Bud.
Vende(bar, cerveja, preço)
SELECT AVG(preço)
FROM Vende
WHERE cerveja = 'Bud';
• Conta cada tupla (para cada bar que vende Bud) uma vez.
Em classe
Como faria se Vende fosse um bag?
Eliminando Duplicatas
Antes da Agregação
Encontrar os diferentes preços da cerveja Bud.
Vende(bar, cerveja, preço)
SELECT COUNT(DISTINCT preço)
FROM Vende
WHERE cerveja = 'Bud';
• DISTINCT pode ser usada em qq agregação,
mas tipicamente só faz sentido com COUNT.
Agrupamento
Segue select-from-where com GROUP BY uma lista
de atributos.
• A relação que é o resultado das cláusulas FROM e
WHERE é agrupada segundo os valores desses
atributos, com as agregações tomando lugar somente
dentro de um grupo.
Exemplo
Encontre os preços médios de cada cerveja.
Vende(bar, cerveja, preço)
SELECT cerveja, AVG(preço)
FROM Vende
GROUP BY cerveja;
Exemplo
Encontre, para cada boêmio, o preço médio da
cerveja Bud nos bares que eles freqüentam.
Vende(bar, cerveja, preço)
Freqüenta(boêmio, bar)
SELECT boêmio, AVG(preço)
FROM Freqüenta, Vende
WHERE cerveja = 'Bud' AND
Freqüenta.bar = Vende.bar
GROUP BY boêmio;
• Note: agrupamento ocorre depois das operações 
e .
Restrições na Lista de SELECT com Agregação
Se uma agregação é usada, então cada elemento do SELECT ou é
um agregado, ou deve aparecer na cláusula group-by.
Exemplo
• Uma forma tentadora de fazer as coisas:
Vende(bar, cerveja, preço)
SELECT bar, MIN(preço)
FROM Vende
WHERE cerveja = 'Bud';
• Isto é ilegal em SQL.
Problema
Como devemos encontrar esse(s) bar(es)?
Cláusula HAVING
Cláusulas HAVING são seleções em grupos, como
cláusulas WHERE o são para tuplas.
A condição pode usar qq variável-tupla ou relação
da cláusula FROM, justo como a cláusula
WHERE.
– Mas as variáveis-tupla varrem somente um grupo.
– Os atributos também só fazem sentido dentro de um
grupo.
Exemplo
Encontre a média de preços das cervejas que ou são servidas
em ao menos 3 bares ou são fabricadas pela Ambev.
Cerveja(nome, fab)
Vende(bar, cerveja, preço)
SELECT cerveja, AVG(preço)
FROM Vende
GROUP BY cerveja
HAVING COUNT(*) >= 3 OR
cerveja IN (
SELECT nome
FROM Cerveja
WHERE fab = 'Ambev'
);
Exercício por Equipe
• Qual a cerveja que é mais vezes a favorita
dos boêmios?
– Note que pode ser mais de uma.
Boemio(nome, end, telefone, cervej
Gabarito
Select cervejafav as
'a_favorita'
From Boemio
Group by cervejafav
Having count(*)  ALL
(Select count(*)
From Boemio
Group by cervejafav);
Manutenção de BD
• Modificação = insert + delete + update.
Inserção de uma Tupla
INSERT INTO relação VALUES (lista de valores).
• Insere a tupla = lista de valores, associando os valores com
os atributos na ordem em que os atributos foram
declarados.
– Esqueceu a ordem? Liste os atributos como argumentos da
relação.
Exemplo
Gosta(boêmio, cerveja)
Insira o fato de que Salete gosta de Antarctica.
INSERT INTO Gosta(boêmio, cerveja)
VALUES('Salete, `Antarctica´);
Inserção do Resultado de uma
Consulta
INSERT INTO relação (subconsulta).
Exemplo
Criar uma tabela de todos os potenciais companheiros de Salete, i.e., as
pessoas que freqüentam os bares que Salete também freqüenta.
Freqüenta(boêmio, bar)
CREATE TABLE Amigos_da_cerveja(
nome char(30)
);
INSERT INTO Amigos_da_cerveja
(SELECT DISTINCT f2.boêmio
FROM Freqüenta f1, Freqüenta f2
WHERE f1.boêmio= `Salete´´ AND
f2.boêmio <> `Salete‘´ AND
f1.bar = f2.bar
);
Remoção
DELETE FROM relação WHERE condição.
• Remove todas as tuplas da relação satisfazendo a condição.
Exemplo
Salete não gosta mais da cerveja Bud.
Gosta(boêmio, cerveja)
DELETE FROM Gosta
WHERE boêmio = 'Salete' AND
cerveja = 'Bud';
Exemplo
Esvaziar a relação Gosta.
DELETE FROM Gosta;
Exemplo
• Remova todas as cervejas para as quais há outras
cervejas do mesmo fabricante.
Cerveja(nome, fab)
DELETE FROM Cerveja c
WHERE EXISTS
(SELECT nome
FROM Cerveja
WHERE fab = c.fab AND
nome <> b.nome
);
• Semântica enganadora! Se a Ambev faz
Brahma e Antarctica (somente), a remoção
da Brahma faz a Antarctica não satisfazer a
condição?
• Semântica da SQL: todas as condições
devem ser avaliadas primeiro.
– No exemplo Brahma/Antarctica, deve-se
primeiro identicar as duas como alvo, e
remover ambas.
Atualizações
UPDATE relação SET lista de atribuições WHERE condição.
Exemplo
O número de telefone do boêmio Fred é 555-1212.
Boêmio(nome, end, telefone)
UPDATE Boêmio
SET telefone = '555-1212'
WHERE nome = 'Fred';
Exemplo
O preço máximo de uma cerveja é 4,00.
• Atualiza muitas tuplas de uma vez.
Vende(bar, cerveja, preço)
UPDATE Vende
SET preço = 4,00
WHERE preço > 4.00;
Definindo um Esquema de BD
CREATE TABLE nome (lista de elements).
• Os principais elementos são os atributos e seus tipos, mas
declarações de chave e restrições também aparecem.
• Comandos similares CREATE X para outros objetos X:
visões, índices, asserções, “triggers”.
• “DROP X nome” remove o objeto criado do tipo X com
aquele nome.
Exemplo
CREATE TABLE Vende(
bar CHAR(20),
cerveja VARCHAR(20),
preço REAL
);
DROP TABLE Vende;
Tipos
1. INT ou INTEGER.
2. REAL ou FLOAT.
3. CHAR(n) = cadeia de caracters de
tamanho fixo, preenchida com brancos, se
for o caso.
4. VARCHAR(n) = cadeia de caracteres de
tamanho variável (até n characteres).
– Oracle usa VARCHAR2(n) também.
5. NUMERIC(precision, decimal) é um número com
precision dígitos com o ponto decimal a decimal
dígitos a partir da direita. NUMERIC(10,2) pode
armazenar ±99.999.999,99
6. DATE. A forma SQL é DATE 'yyyy-mm-dd'
•
Oracle usa um formato diferente.
7. TIME. A forma é TIME 'hh:mm:ss[.ss…]' em
SQL.
8. DATETIME ou TIMESTAMP. A forma é TIMESTAMP
'yyyy-mm-dd hh:mm:ss[.ss…]' em SQL.
Declarando Chaves
Use PRIMARY KEY ou UNIQUE.
• Somente uma chave primária, muitos UNIQUE.
• Implementações de SQL criam um índice
automático (“index”) em resposta a PRIMARY
KEY somente.
– Mas Oracle também cria índice para UNIQUE.
• SQL não permite NULL na chave primária, mas
em colunas “unique” pode (dois ou mais NULL,
mas não repetidos valores não-nulos).
Declarando Chaves
Dois lugares para declarar:
1. Depois de um tipo de atributo, se o
atributo é a própria chave.
2. Como um elemento separado.
– Essencial se a chave é composta de mais de
um atributo.
Exemplo
CREATE TABLE Vende (
bar CHAR(20),
cerveja VARCHAR(20),
preço REAL,
PRIMARY KEY(bar, cerveja)
);
Exemplo
CREATE TABLE Vende(
bar CHAR(20),
cerveja VARCHAR(20),
preço REAL,
UNIQUE(bar, cerveja)
);
é diferente de:
CREATE TABLE Vende (
bar CHAR(20) UNIQUE,
cerveja VARCHAR(20) UNIQUE,
preço REAL
);
Outras Propriedades de Atributos
1. NOT NULL.
2. Valor DEFAULT.
Exemplo
CREATE TABLE Boêmio (
nome CHAR(30) PRIMARY KEY,
end CHAR(50)
DEFAULT ‘Rua do Bar',
telefone CHAR(16)
);
INSERT INTO Boêmio(nome, end)
VALUES('Salete', 'Av. Sete,
2001')
Resulta na seguinte tupla:
nome end
telefone
Salete Av. Sete, 2001.
NULL
• Primary key é por default not NULL.
• Esta inserção é legal.
• Mas se tivéssemos declarado
telefone CHAR(16) NOT NULL
então a inserção não podia ser feita.
Defaults Interessantes
• DEFAULT CURRENT_TIMESTAMP
• SEQUENCE
CREATE SEQUENCE seq_cliente;
CREATE TABLE Cliente(
clienteID INTEGER
DEFAULT nextval(‘seq_cliente'),
nome VARCHAR(30)
);
Mudando Colunas
Adicione um atributo da relação R com
ALTER TABLE R ADD <declaração_coluna>;
Exemplo
ALTER TABLE Bar ADD telefone
CHAR(16)
DEFAULT ‘fora da lista';
• Colunas podem também ser removidas.
ALTER TABLE Bar DROP alvara;
Visões
Uma expressão que descreve
uma tabela sem criá-la.
• A forma de definição de uma visão é:
CREATE VIEW <nome> AS <consulta>;
Exemplo
A visão PodeBeber é o conjunto de pares boêmio-cerveja tais
que o boêmio freqüenta ao menos um bar que serve a
cerveja.
CREATE VIEW PodeBeber AS
SELECT boêmio, cerveja
FROM Frequenta, Vende
WHERE Frequenta.bar = Vende.bar;
Consultando Visões
Trata a visão como uma relação materializada.
Exemplo
SELECT cerveja
FROM PedeBeber
WHERE boêmio = ‘Salete;
Semântica de Uso de Visões
Exemplo
Composição
Otimização da Consulta
1. Empurra as seleções para baixo na árvore.
2. Elimina as projeções desnecessárias.
Download

AlgRelaSampa