Cálculo Relacional
Outras Linguagens Relacionais Cálculo Relacional de Tupla Cálculo Relacional de Domínio
Exemplo: BD Empresa EMPREGADO DEPARTAMENTO PROJETO 28
Cálculo Relacional de Tupla Linguagem de consulta não-procedural, em que cada consulta assume a forma {t | P(t)}. {t | P(t)} representa o conjunto de todas as tuplas t onde o predicado P(t) é verdadeiro. t é uma variável de tupla. t.A representa o valor do atributo A em uma tupla t. R(t) indica que R é a relação-limite de t.
Empregados com salário maior do que 20 mil reais. Exemplo Empregados com salário maior do que 20 mil reais. {t | EMPREGADO(t) ^ t.Salário > 20000 } Recupera todos os atributos de t. {t.PNOME, t.SNOME | EMPREGADO(t) ^ t.Salário > 20000 } Recupera apenas os atributos PNOME e SNOME de t.
Átomos do Cálculo de Predicados R(t) t.A op t.B t.A op c ou c op t.B Cada um desses átomos possui um valor verdade para uma determinada combinação de tuplas t, isto é, um valor VERDADEIRO ou FALSO dependendo se a condição especificada no átomo é avaliada como VERDADEIRA ou FALSA para a combinação específica de tuplas.
Fórmula do Cálculo de Predicados Constituída por um ou mais átomos conectados pelos operadores lógicos AND, OR e NOT. Definida recursivamente da seguinte forma: Todo átomo é uma fórmula. Se F1 e F2 são fórmulas, então (F1 AND F2), (F1 OR F2), NOT(F1) e NOT(F2) também o são.
Quantificador Universal e Existencial (t)(F) existe uma tupla na relação-limite de t para a qual a fórmula F é verdadeira. (t)(F) para todas as tuplas da relação- limite de t, a fórmula F é verdadeira.
Variáveis Livres e Vinculadas Toda variável em uma fórmula F que é um átomo do cálculo de predicado é livre em F. Nas fórmulas F do tipo (F1 AND F2), (F1 OR F2), NOT(F1) e NOT(F2), a ocorrência de uma variável t será livre ou vinculada em F, dependendo se ela é livre ou vinculada em F1 e/ou F2. Todas as ocorrências livres de uma variável de tupla em F serão vinculadas em uma fórmula F’ = (t)(F) ou F’ = (t)(F) para o quantificador especificado em F’ .
Exemplo Nas fórmulas: F1 : d.DNOME = “Pesquisa” F2 : (t)(d.DNUMERO = t.DNO) F3 : (d)(d.GERSSN = “33344555”) d é livre em F1 e F2 ; d está vinculada ao quantificador universal em F3 ; e t está vinculada ao quantificador existencial em F2.
Definição de Fórmulas (cont) Se é F uma fórmula então (t)(F) é fórmula. (t)(F) será VERDADEIRA se F for VERDADEIRA para, pelo menos, uma ocorrência de t. Se é F uma fórmula então (t)(F) é fórmula. (t)(F) será VERDADEIRA se F for VERDADEIRA para todas as ocorrências de t.
Exemplos Nome e endereço de todos os empregados que trabalham para o departamento de Pesquisa: {t.Nome, t.SNome, t.Endereço | Empregado(t) AND (d)(Departamento(d) AND d.Nome = “Pesquisa” AND d.Sigla = t.Depto) } Para cada projeto localizado em “Brasília”, liste o código do projeto, a sigla do departamento responsável e o sobrenome, data de nascimento e endereço do gerente do departamento: {p.Código, p.Depto, m.Snome, m.DataNasc, m.Endereço | Projeto(p) AND p.Local = “Brasília” AND (d)(Departamento(d) AND d.Sigla = p.Depto AND (m) (Empregado(m) AND m.Matrícula = d.Gerente ) ) }
Exemplo: Banco agência (nome, cidade, ativos) cliente (nome, endereço, cidade) conta (número, agência, saldo) empréstimo (número, agência, valor) correntista (cliente, conta) tomador (cliente, empréstimo)
Consultas número, agência e valor dos empréstimos acima de 1200 reais: { e | empréstimo (e) e.valor 1200 } nome dos tomadores que tomaram empréstimos acima de 1200 reais: { t.nome | tomador (t) (e) ( empréstimo (e) e.número = t.empréstimo e.valor 1200 ) } Nome dos clientes que possuem uma conta e tomaram um empréstimo no banco: { c1.nome | cliente (c1) ( (c2) ( correntista (c2) c2.cliente = c1.nome ) (t) ( tomador (t) t.cliente = c1.nome ) ) }
Consultas nomes dos clientes que tomaram empréstimos na agência XYZ: { c.nome | cliente (c) ( (t) ( tomador (t) t.cliente = c.nome ) (e) ( empréstimo (e) e.número = t.empréstimo e.agência = “XYZ” ) ) } nomes dos clientes que tomaram empréstimos na agência XYZ, mas não possuem contas no Banco: { c1.nome | cliente (c1) ( (t) ( tomador (t) t.cliente = c1.nome ) (e) ( empréstimo (e) e.número = t.empréstimo e.agência = “XYZ” ) ) (c2) ( correntista (c2) c2.cliente = c1.nome ) ) }