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 RS 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.