VII- Álgebra Relacional Um pequeno conjunto de operadores que nos permite manipular relações. Os...
Transcript of VII- Álgebra Relacional Um pequeno conjunto de operadores que nos permite manipular relações. Os...
VII- Álgebra RelacionalUm 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 THETA-JUNÇÃO
π PROJEÇÃO JUNÇÃO NATURAL
X PRODUTO CARTESIANO
U UNION
– DIFERENÇA
INTERSEÇÃO
Esquema Relacional
Depósito(filial, conta, cliente, saldo)
Cliente(cliente, rua, cidade)
Empréstimo(filial, no-empres, cliente, valor)
Filial(filial, ativo, cidade)
Empres Filial No-empres Cliente Valor
T1 Subúrbio 123 Fred 600 T2 Subúrbio 234 Saul 1200 T3 Subúrbio 235 Saul 1500 T4 Centro 612 Ana 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 π i1,...,im (R) 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 S R SA B C D D E F A B C D D' E F
Theta-JunçãoR = R1 C
R2
é equivalente a R = C(R1 R2).
grau(R) = r
grau(S) = s
grau (R S) = r + s
0 card(R S) card(R) card(S)
pode ser < > = ≠
Se igual (=), então é umEQUIJOIN
R S = (R S)R.A<S.D
R(A B C) S(C D E) T(A BC C’DE) 1 3 5 2 1 1 1 3 5 1 2 2 2 4 6 1 2 2 1 3 5 3 3 4 3 5 7 3 3 4 1 3 5 4 4 3 4 6 8 4 4 3 2 4 6 3 3 4 2 4 6 4 4 3 3 5 7 4 4 3
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’ (Depósito )) -
πcliente (filial = ‘Centro’ (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
ExemploEncontre 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 BagsSoma 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 bagsToma 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 bagsSubtrai 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.
ExemploR (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.
ExemploR =
A B1 23 41 2
(R) =A B1 23 4
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.
ExemploR = A B
1 33 45 2
B(R) = [(5,2), (1,3), (3,4)].
Projeção EstendidaPermite que as colunas na projeção sejam funções de uma ou
mais colunas da relação-argumento.
ExemploR = A B
1 23 4
A+B,A,A(R) =A+B A1 A23 1 17 3 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çãoe 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.
ExemploSeja R =
bar cerveja preço Alemão Bud 2,00
Alemão Skol 2,75Moraes Bud 2,50Moraes Brahma 3,00Tricolor Skol 3,25Rubronegro Brahma 3,00
Calcular cerveja,AVG(preço)(R).
1. Agrupar pelo(s) atributo(s) de agrupamento, cerveja neste caso:bar cerveja preçoAlemão Bud 2,00Moraes Bud 2,50Alemão Skol 2,75Tricolor Skol 3,25Moraes Brahma 3,00Rubronegro Brahma 3,00
2. Calcular a média de preço dentro dos grupos:
cerveja AVG(preço)
Bud 2.25
Skol 3.00
Brahma 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 B1 23 4
S = B C4 56 7
R o S = A B C3 4 5 junção natural1 2 junção externa direita 6 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)
ExemploQue cervejas são fabricadas por Anheuser-Busch?
Cerveja(nome, fab)
SELECT nomeFROM CervejaWHERE fab = 'Anheuser-Busch';
• Nota: aspas simples para cadeias de caracteres.nomeBudBud LiteMichelob
Semântica Formalde 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 EquivalenteImagine 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 CervejaWHERE fab = 'Anheuser-Busch';
nome fabBud Anheuser-BuschBud Lite Anheuser-BuschMichelob Anheuser-Busch
Renomeando Colunas
Cerveja(nome, fab)
SELECT nome AS cervejaFROM CervejaWHERE fab = 'Anheuser-Busch';
cervejaBudBud LiteMichelob
Colunas como ExpressõesVende(bar, cerveja, preço)
SELECT bar, cerveja, preço*120 AS preço_em_YenFROM Vende;
bar cerveja preço_em_YenTricolor Bud 300Rubronegro 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 GostaWHERE cerveja = 'Bud';
boêmio que_gosta_de_BudSalete gosta de BudFred 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.
ExemploEncontre os boêmios cujo código de telefone tem 72-.
Boêmio(nome, end, fone)
SELECT nomeFROM BoêmioWHERE 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).
Exemplobar cerveja preço
Rubronegro Brahma NULLSELECT barFROM VendeWHERE 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 Valoresverdade = 1; falso = 0, e desconhecido = 1/2. Então:• AND = min.• OR = max.• NOT(x) = 1 – x.
Algumas Leis não FuncionamExemplo: 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.
ExemploEncontre as cervejas que os freqüentadores do bar
Tricolor gostam.Gosta(boêmio, cerveja)Freqüenta(boêmio, bar)
SELECT cervejaFROM Freqüenta, GostaWHERE 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.
bar
Frequents
drinker beerdrinker
Likes
flSally
SallyJoe’s
Variáveis-Tupla ExplícitasAlgumas vezes necessitamos fazer referência a `cópias´ de uma
relação.• Use variáveis-tupla como sinônimos de relações.
ExemploEncontre pares de cerveja do mesmo fabricante.
Cerveja(nome, fab)
SELECT c1.nome, c2.nomeFROM Cerveja c1, Cerveja c2WHERE 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)).
SubconsultasO 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 barFROM VendaWHERE cerveja = ‘Boêmia' AND preço =
(SELECT preçoFROM VendeWHERE 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.
ExemploEncontre o nome e o fabricante das cervejas que Fred gosta.
Cerveja(nome, fab)Gosta(boêmio, cerveja)
SELECT *FROM CervejaWHERE nome IN
(SELECT cervejaFROM GostaWHERE boêmio = 'Fred’);
• Também: NOT IN.
EXISTS“[NOT]EXISTS(relação)” é verdade sss a relação [é] não é vazia.
ExemploEncontre os fabricantes que fornecem unicamente uma marca de
cerveja.Cerveja(nome, fab)
SELECT nomeFROM Cerveja c1WHERE 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.
QuantificadoresANY 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:
ExemploEncontre a(s) cerveja(s) vendida(s) pelo mais alto preço.
Vende(bar, cerveja, preço)
SELECT cervejaFROM Vende WHERE preço >= ALL(
SELECT preçoFROM Vende);
Em ClasseEncontre 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.
ExemploEncontre 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çoFROM Vende;• Força a semântica de bag com ALL depois
de UNION, etc.
Expressões Baseadas em JunçãoHá 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 SR JOIN S ON condition
i.e., condition: R.B=S.BR CROSS JOIN SR 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çõesSum, avg, min, max, e count aplicam-se a atributos/colunas.
Também, count(*) aplica-se a tuplas.• Usadas na lista do SELECT.
ExemploEncontre o preço médio da cerveja Bud.Vende(bar, cerveja, preço)
SELECT AVG(preço)FROM VendeWHERE cerveja = 'Bud';• Conta cada tupla (para cada bar que vende Bud) uma vez.
Em classeComo faria se Vende fosse um bag?
Eliminando DuplicatasAntes 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.
AgrupamentoSegue 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.
ExemploEncontre os preços médios de cada cerveja.Vende(bar, cerveja, preço)SELECT cerveja, AVG(preço)FROM VendeGROUP BY cerveja;
ExemploEncontre, 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, VendeWHERE cerveja = 'Bud' AND
Freqüenta.bar = Vende.barGROUP 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 VendeWHERE cerveja = 'Bud';• Isto é ilegal em SQL.
ProblemaComo 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.
ExemploEncontre 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 VendeGROUP BY cervejaHAVING COUNT(*) >= 3 OR
cerveja IN (SELECT nomeFROM CervejaWHERE 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, cervejafav)
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 TuplaINSERT 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.
ExemploGosta(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).
ExemploCriar 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çãoDELETE FROM relação WHERE condição.• Remove todas as tuplas da relação satisfazendo a condição.
ExemploSalete não gosta mais da cerveja Bud.
Gosta(boêmio, cerveja)
DELETE FROM Gosta
WHERE boêmio = 'Salete' AND
cerveja = 'Bud';
ExemploEsvaziar 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çõesUPDATE relação SET lista de atribuições WHERE condição.
ExemploO número de telefone do boêmio Fred é 555-1212.Boêmio(nome, end, telefone)
UPDATE BoêmioSET telefone = '555-1212'WHERE nome = 'Fred';
ExemploO preço máximo de uma cerveja é 4,00.• Atualiza muitas tuplas de uma vez.Vende(bar, cerveja, preço)
UPDATE VendeSET preço = 4,00WHERE preço > 4.00;
Definindo um Esquema de BDCREATE 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.
ExemploCREATE 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 ColunasAdicione 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 descreveuma tabela sem criá-la.
• A forma de definição de uma visão é:CREATE VIEW <nome> AS <consulta>;
ExemploA 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, cervejaFROM Frequenta, VendeWHERE Frequenta.bar = Vende.bar;
Consultando VisõesTrata a visão como uma relação materializada.
ExemploSELECT cervejaFROM PedeBeberWHERE boêmio = ‘Salete;
Semântica de Uso de Visões
Exemplo
Composição
Otimização da Consulta1. Empurra as seleções para baixo na árvore.
2. Elimina as projeções desnecessárias.