Vous êtes sur la page 1sur 13

lgebra e Clculo Relacional

Introduo

lgebra e Clculo Relacional so duas linguagens formais de consulta associadas ao Modelo Relacional. Consultas na lgebra Relacional so compostas de um conjunto de operadores, e cada consulta descreve um procedimento passo a passo para computar a resposta desejada, isto , as consultas so especicadas de maneira operacional. No Clculo Relacional, uma consulta descreve a resposta desejada sem especicar como essa resposta deve ser computada. Esse estilo de consulta no procedural chamado declarativo. Segue abaixo o modelo do banco de dados que ser utilizado nos exemplos das consultas. CodCarro a1 a2 a3 a4 Modelo Gol GTI Plio ELX Corsa Wind Marea Marca VW Fiat GM Fiat Cor Prata Branco Preto Preto

Tabela 1: Carro CodCli c1 c2 c3 c4 Nome Joo Jos Lus Silvio Idade 31 28 25 43 Cidade Porto Alegre Porto Alegre Novo Hamburgo Porto Alegre CodPaiCli c2 c4 c2

Tabela 2: Cliente CodCarro a1 a2 a3 a2 CodCli c1 c3 c1 c2 Data 01/01/2000 05/01/2000 01/02/2000 03/01/2000

Tabela 3: Reserva

lgebra Relacional

Consultas em lgebra relacional so feitas utilizando-se uma coleo de operadores. Cada operador possui uma tabela como argumento de entrada e retorna uma tabela como resultado. Sero estudados os operadores sobre conjuntos Unio,Interseo, Diferena, Produto Cartesiano, e os operadores especcos da lgebra relacional Seleo,Projeo, Juno,Diviso e Renomeao.

2.1

Seleo

Operador de seleo (): seleciona linhas de uma tabela. A seleo feita atravs da avaliao de uma condio de seleo. 1

Sintaxe <critrio de seleo> (<tabela>) onde <tabela> o nome de uma tabela ou de uma expresso de lgebra relacional que resulta em uma tabela e <critrio de seleo> uma expresso booleana que envolve literais e valores de atributos de tabelas. Exemplo 1 cor=Preto (Carro) Resulta em uma tabela que contm todos os carros de cor Preta. CodCarro a3 a4 Modelo Corsa Wind Marea Marca GM Fiat Cor Preto Preto

Figura 1: Exemplo 1 Exemplo 2 (idade > 30 and cidade=Porto Alegre) (Cliente) Resulta em uma tabela que contm todos os clientes com mais de 30 anos e que moram em Porto Alegre. CodCli c1 c4 Nome Joo Silvio Idade 31 43 Cidade Porto Alegre Porto Alegre CodPaiCli c2

Figura 2: Exemplo 2

2.2

Projeo

Operador de projeo (): projeta colunas no resultado. Sintaxe <lista de colunas> (<tabela>) onde <tabela> o nome de uma tabela ou de uma expresso de lgebra relacional que resulta em uma tabela e <lista de colunas> uma lista que contm os nomes das colunas a serem projetadas no resultado. Exemplo 3 CodCarro, Modelo (Carro) Resulta em uma tabela que contm os cdigos e os modelos dos carros. CodCarro a1 a2 a3 a4 Modelo Gol GTI Plio ELX Corsa Wind Marea

Figura 3: Exemplo 3

Exemplo 4 Marca (Carro) Resulta em uma tabela que contm as marcas dos carros. importante ressaltar que na projeo, as linhas duplicadas so eliminadas, ou seja, aparecem apenas uma vez no resultado. Isso ocorre porque uma tabela um conjunto de linhas, e conjuntos no podem ter elementos repetidos. 2

Marca VW Fiat GM Figura 4: Exemplo 4

Exemplo 5 CodCarro, Modelo ( cor=Preto (Carro)) Resulta em uma tabela que contm os cdigos e modelos dos carros de cor Preta. CodCarro a3 a4 Modelo Corsa Wind Marea

Figura 5: Exemplo 5

2.3

Operaes sobre Conjuntos

A lgebra relacional utiliza quatro operaes da teoria dos conjuntos. So elas: unio, interseo, diferena e produto cartesiano (). Unio (): A unio de duas tabelas produz como resultado uma tabela que possui todas as tuplas presentes na primeira, segunda ou em ambas as tabelas. Sintaxe: <tabela1> <tabela2> Interseo (): A interseo de duas tabelas produz como resultado uma tabela que possui as tuplas presentes na primeira e segunda tabela ao mesmo tempo. Sintaxe: <tabela1> <tabela2> Exemplo 6 Obter os cdigos dos automveis que possuem reservas. (CodCarro (Carro)) (CodCarro(Reserva)) CodCarro a1 a2 a3 Figura 6: Exemplo 6

Diferena (-): A diferena de duas tabelas produz como resultado uma tabela que possui as tuplas que esto presentes na primeira tabela, mas no na segunda. Sintaxe: <tabela1> - <tabela2> Exemplo 7 Obter os cdigos dos clientes que no possuem reservas. (CodCli (Cliente)) - (CodCli(Reserva)) Em todos os casos, as tabelas devem ser compatveis para unio, ou seja Devem ter o mesmo nmero de campos O domnio da i-sima coluna da primeira tabela deve ser igual ao domnio da da i-sima coluna da segunda tabela. 3

CodCli c4 Figura 7: Exemplo 7 Se os nomes das colunas forem diferentes, utiliza-se por conveno os nomes das colunas da primeira tabela. Produto Cartesiano (): O produto cartesiano de duas tabelas produz como resultado uma tabela que contm todos os campos da primeira tabela, seguidos de todos os campos da segunda tabela. Portanto, a tabela resultado possui: (nmero de colunas da primeira tabela + nmero de colunas da segunda tabela) colunas (nmero de linhas da primeira tabela x nmero de linhas da segunda tabela) linhas Sintaxe: <tabela1> <tabela2> Exemplo 8 Carro Reserva CodCarro a1 a1 a1 a1 a2 a2 a2 a2 a3 a3 a3 a3 a4 a4 a4 a4 Modelo Gol GTI Gol GTI Gol GTI Gol GTI Plio ELX Plio ELX Plio ELX Plio ELX Corsa Wind Corsa Wind Corsa Wind Corsa Wind Marea Marea Marea Marea Marca VW VW VW VW Fiat Fiat Fiat Fiat GM GM GM GM Fiat Fiat Fiat Fiat Cor Prata Prata Prata Prata Branco Branco Branco Branco Preto Preto Preto Preto Preto Preto Preto Preto CodCarro a1 a2 a3 a2 a1 a2 a3 a2 a1 a2 a3 a2 a1 a2 a3 a2 CodCli c1 c3 c1 c2 c1 c3 c1 c2 c1 c3 c1 c2 c1 c3 c1 c2 Data 01/01/2000 05/01/2000 01/02/2000 03/01/2000 01/01/2000 05/01/2000 01/02/2000 03/01/2000 01/01/2000 05/01/2000 01/02/2000 03/01/2000 01/01/2000 05/01/2000 01/02/2000 03/01/2000

Figura 8: Exemplo 8

Exemplo 9 Modelo, Marca ( Carro.CodCarro=Reserva.CodCarro (Carro Reserva)) Resulta em uma tabela que contm todos os modelos e marcas dos carros que possuem reserva. Modelo Gol GTI Plio ELX Corsa Wind Marca VW Fiat GM

Figura 9: Exemplo 9

Exemplo 10 Nome ( Carro.CodCarro=Reserva.CodCarro AND Reserva.CodCli=Cliente.CodCli AND Carro.Modelo=Plio ELX (Carro Reserva Cliente)) Resulta em uma tabela que contm os nomes dos clientes que reservaram o carro Modelo Plio ELX. Nome Jos Lus Figura 10: Exemplo 10

2.4

Renomeao

A operao de Renomeao permite dar um novo nome a uma tabela. Isso permite que expresses grandes possam ser quebradas vrios pedaos menores, cada subexpresso resultado recebe um nome para que possa ser referencia em outra subexpresso. Sintaxe <novo nome> (<tabela>) onde <tabela> o nome de uma tabela ou de uma expresso de lgebra relacional que resulta em uma tabela e <novo nome> o novo nome a ser atribudo. Exemplo 11 NovoCarro (Carro) Resulta em uma tabela NovoCarro que contm os mesmos dados da tabela Carro. Exemplo 12 Obter o nome do cliente seguido do nome de seu pai. Cliente.Nome, PaiCliente.Nome ( Cliente.CodPaiCli=PaiCliente.CodCli (Cliente PaiCliente(Cliente))) Cliente.Nome Joo Jos Lus PaiCliente.Nome Jos Silvio Jos

Figura 11: Exemplo 12

Exemplo 13 Obter o nome do cliente seguido do nome de seu av. Cliente.Nome, AvoCliente.Nome ( Cliente.CodPaiCli=PaiCliente.CodCli AND PaiCliente.CodPaiCli=AvoCliente.CodCli (Cliente PaiCliente(Cliente) AvoCliente(Cliente)))

Cliente.Nome Joo Lus

AvoCliente.Nome Silvio Silvio

Figura 12: Exemplo 13

2.5

Juno

Uma juno uma operao de seleo aplicada a uma operao de produto cartesiano. Como esta uma operao muito comum, foi criada para simplicar a sequncia de operaes necessrias para a realizao de uma consulta. Sintaxe <tabela1> 1 (<critrio>) <tabela2> onde <tabela> o nome de uma tabela ou de uma expresso de lgebra relacional que resulta em uma tabela e <critrio> uma expresso booleana que envolve literais e valores de atributos de tabelas. Exemplo 14 Reserva 1 (Reserva.CodCli = Cliente.CodCli) Cliente Resulta em uma tabela que associa cada reserva com seu cliente. Reserva CodCarro a1 a2 a3 a2 Cliente CodCli c1 c3 c1 c2

CodCli c1 c3 c1 c2

Data 01/01/2000 05/01/2000 01/02/2000 03/01/2000

Nome Joo Lus Joo Jos

Idade 31 25 31 28

Cidade Porto Alegre Novo Hamburgo Porto Alegre Porto Alegre

CodPaiCli c2 c2 c2 c4

Figura 13: Exemplo 14 A condio de juno pode utilizar outros operadores tais como <, >, =, etc. A operao de juno genrica (que envolve qualquer critrio de seleo) chamada de Juno Theta. Quando o critrio de seleo envolve apenas igualdade de atributos (como no Exemplo 14), a operao de juno chamada de Equijuno Equijuno: Sintaxe <tabela1> (<lista1>),(<lista2>) <tabela2> onde <tabela> o nome de uma tabela ou de uma expresso de lgebra relacional que resulta em uma tabela e <lista1> e <lista2> so listas dos nomes das colunas das tabelas 1 e 2 respectivamente, cujos valores so comparados um a um, para fazer a juno. A Equijuno elimina a segunda coluna em cada um dos pares que so comparados, j que os valores dessas colunas sempre sero iguais. Exemplo 15 Reserva (CodCli),(CodCli) Cliente Resulta em uma tabela que associa cada reserva com seu cliente. CodCarro a1 a2 a3 a2 CodCli c1 c3 c1 c2 Data 01/01/2000 05/01/2000 01/02/2000 03/01/2000 Nome Joo Lus Joo Jos Idade 31 25 31 28 Cidade Porto Alegre Novo Hamburgo Porto Alegre Porto Alegre CodPaiCli c2 c2 c2 c4

Figura 14: Exemplo 15

Quando os campos na Equijuno tiverem os mesmos nomes (como no exemplo acima), os nomes das colunas podem ser omitidos. Neste caso a juno chamada de Juno Natural. Juno Natural: Sintaxe <tabela1> <tabela2> onde <tabela> o nome de uma tabela ou de uma expresso de lgebra relacional que resulta em uma tabela. As colunas duplicadas tambm so eliminadas, do mesmo modo que na Equijuno. Exemplo 16 Reserva Cliente Resulta em uma tabela que associa cada reserva com seu cliente. Restries da Operao de Juno A operao de juno concatena duas linhas das tabelas que esto sendo juntadas com base no critrio de juno (normalmente por igualdade de valores de atributos). Sendo assim, uma linha que no possua nenhuma linha na outra tabela associada pelo critrio de juno no aparece na tabela resultado. H situaes em que necessrio garantir que todas as linhas de uma das tabelas de juno (ou de ambas) aparea no resultado. Exemplo 17 Obter o nome de todos os clientes junto com a data da reserva do veculo, caso ele possua alguma reserva. Essa consulta no pode ser resolvida com a Juno, j que apareceriam no resultado apenas os clientes que possuem reserva. Os que no possuem cariam fora do resultado. Para esses casos, existe a Juno Externa. Juno Externa: Sintaxe <tabela1> = (<critrio>) <tabela2> 1 onde <tabela> o nome de uma tabela ou de uma expresso de lgebra relacional que resulta em uma tabela e <critrio> uma expresso booleana que envolve literais e valores de atributos de tabelas. O operador = chamado de Juno Externa Esquerda (left outer-join). 1 A juno externa esquerda contm ao menos uma vez cada linha da tabela esquerda do operador. Esta linha aparece concatenada com uma linha vazia, caso o critrio de juno no seja verdadeiro para nenhuma linha da tabela direita do operador de juno. Exemplo 18 Obter o nome de todos os clientes junto com a data da reserva do veculo, caso ele possua alguma reserva. Cliente = (Cliente.CodCli=Reserva.CodCli) Reserva 1 CodCli c1 c1 c2 c3 c4 Nome Joo Joo Jos Lus Silvio Idade 31 31 28 25 43 Cidade Porto Alegre Porto Alegre Porto Alegre Novo Hamburgo Porto Alegre CodPaiCli c2 c2 c4 c2 CodCarro a1 a3 a2 a2 CodCli c1 c1 c2 c3 Data 01/01/2000 01/02/2000 03/01/2000 05/01/2000

Figura 15: Exemplo 18 De forma similar, podem ser denidas: < Juno externa direita (smbolo 1 ) = <) Juno externa plena (smbolo 1 Para cada tipo de juno podem ser denidas as junes externas direita, esquerda e plena, como mostra a tabela 4.

Juno Equijuno Juno Natural

Esquerda Juno Externa Esquerda Equijuno Esquerda Juno Natural Esquerda

Direita Juno Externa Direita Equijuno Direita Juno Natural Direita

Plena Juno Externa Plena Equijuno Plena Juno Natural Plena

Tabela 4: Junes Externas

2.6

Diviso

Sintaxe <tabela1> <tabela2> onde <tabela> o nome de uma tabela ou de uma expresso de lgebra relacional que resulta em uma tabela. Os nomes das colunas e respectivos domnios da <tabela2> (C2) devem estar contidos dentro dos nomes das colunas e respectivos domnios da <tabela1> (C1). A tabela resultante tem como nomes das colunas e domnios aqueles que aparecem na <tabela1>, mas no aparecem na <tabela2> (C1 - C2). Para que uma linha aparea no resultado, necessrio que a sua concatenao com cada linha da <tabela2> aparea tambm na <tabela1>. A operao de diviso til para responder questes como: Encontre os clientes que reservaram todos os carros. Exemplo 19 Reserva Carro Retorna os cdigos dos clientes que reservaram todos os carros. Reserva CodCarro a1 a2 a3 a4 a1 a2 a1 a2 a3 a4 a2 a4 CodCarro a1 a2 a3 a4 CodCliente c1 c3 CodCli c1 c1 c1 c1 c2 c2 c3 c3 c3 c3 c4 c4 CodCarro a2 a4

Carro

Reserva Carro

CodCliente c1 c3 c4

Figura 16: Exemplo 19

2.7

Poder de Expresso
Seleo Projeo Unio Diferena Produto Cartesiano

Existe um conjunto mnimo de operaes, das quais todas as demais podem ser derivadas:

As operaes da lgebra Relacional no so sucientes para expressar todas as consultas possveis sobre uma base de dados relacional, ou seja, seu poder de expresso limitado. As consultas abaixo no podem ser expressas em lgebra: Consultas que envolvem funes de agregao. Funes de agregao so funes que calculam dados sobre um conjunto de linhas de uma tabela. Por exemplo, contagem de linhas que atendem a um critrio ou soma de valores de uma coluna. Exemplo: Obter os nomes dos clientes que zeram mais de uma reserva de veculo. Consultas recursivas. Consultas recursivas envolvem obter um valor de atributo em uma linha, usando este valor para buscar outra linha na mesma tabela e a obter um novo valor, o qual usado para buscar outra linha e assim por diante recursivamente. Exemplo: em uma tabela com cdigos de empregados e com cdigos de seus gerentes, obter para determinado empregado todos os seus subordinados em todos os nveis hierrquicos.

3 Clculo Relacional
As consultas em clculo relacional so declarativas, ou seja, so feitas atravs da descrio do conjunto de resposta sem especicar como ele deve ser computado. Existem dois tipos de clculo: Clculo de Tuplas As variveis correm sobre as linhas das tabelas. A linguagem SQL sofreu inuncia do clculo de Tuplas, e incorporou algumas de suas idias. O clculo de Tuplas ser estudado aqui, e ser referenciado apenas como Clculo Relacional. Clculo de Domnio As variveis correm sobre o domnio dos atributos das tabelas. O clculo de domnio teve forte inuncia sobre a linguagem Query-by-Example (QBE) O poder de expresso do Clculo Relacional o mesmo da lgebra Relacional, ou seja, todas as consultas que podem ser resolvidas em lgebra Relacional tambm podem ser resolvidas em Clculo Relacional.

3.1

Clculo de Tuplas

Sintaxe Uma consulta em Clculo Relacional tem a forma T.A, T.B, ..., V.D, V.E [WHERE f] onde T, ..., V so variveis de tupla, isto , variveis denidas sobre as linhas de uma tabela. Antes de escrever a expresso necessrio denir o escopo de cada varivel. A, B, ..., D, E so nomes de colunas de tabelas (A o nome de uma coluna de T e E o nome de uma coluna de V). f uma expresso lgica sobre as variveis de tupla (T, ..., V) que pode envolver: Condies sobre valores de atributos e literais, como

T.A > T.B + 5 V.E = abcd Frmulas lgicas construdas sobre as condies usando combinaes (NOT, AND, OR, ...) ou usando quanticadores (universal e existencial). universal existencial T(f) T(f)

Modelo de Execuo da Consulta Em clculo Relacional, a execuo da consulta pode ser pensada da seguinte forma: 1. feito o produto cartesiano de todas as tabelas envolvidas (tabelas referenciadas por T, ..., V. 2. No produto cartesiano so selecionadas as linhas que tornam a frmula f verdadeira. 3. feita a projeo sobre as colunas A, B, ..., D, E. Nos exemplos a seguir, supe-se que a varivel Cliente esteja denida sobre a tabela Cliente, a varivel Carro esteja denida sobre a tabela Carro e a varivel Reserva esteja denida sobre a tabela Reserva. Exemplo 20 Cliente.Nome Resulta em uma tabela que contm os nomes de todos os clientes. Nome Joo Jos Lus Silvio Figura 17: Exemplo 20 Exemplo 21 Cliente.Nome WHERE Cliente.CodCli=c1 Resulta em uma tabela que contm todos os nomes dos clientes de cdigo c1. Nome Joo Figura 18: Exemplo 21 Exemplo 22 Obter o nome, idade e cidade dos clientes que tenham mais de 30 anos e que morem em Porto Alegre. Cliente.Nome, Cliente.Idade, Cliente.Cidade WHERE (Cliente.Idade > 30 AND Cliente.Cidade=Porto Alegre) Nome Joo Silvio Idade 31 43 Cidade Porto Alegre Porto Alegre

Figura 19: Exemplo 22 Exemplo 23 Obter o nome e cidade dos clientes, modelo do carro e data da reserva para cada reserva. 10

Cliente.Nome, Cliente.Cidade, Carro.Modelo, Reserva.Data WHERE (Cliente.CodCli=Reserva.CodCli AND Carro.CodCarro=Reserva.CodCarro) Nome Joo Lus Joo Jos Cidade Porto Alegre Novo Hamburgo Porto Alegre Porto Alegre Modelo Gol GTI Plio ELX Corsa Wind Plio ELX Data 01/01/2000 05/01/2000 01/02/2000 03/01/2000

Figura 20: Exemplo 23

Quanticador Existencial (existe) o quanticador existencial. A frmula T(f) verdadeira quando existe ao menos uma linha T que torna a frmula f verdadeira. O quanticador existencial usado para exigir que uma linha de uma tabela que vai para o resultado esteja associada de alguma forma (especicada pela frmula f) a uma linha de outra tabela (T) que no vai para o resultado. Exemplo 24 Obter o nome dos clientes para os quais existe pelo menos uma reserva. Cliente.Nome WHERE Reserva (Cliente.CodCli=Reserva.CodCli) Nome Joo Lus Jos Figura 21: Exemplo 24

Exemplo 25 Obter o nome dos clientes para os quais existe pelo menos uma reserva do carro Plio ELX. Cliente.Nome WHERE Reserva (Cliente.CodCli=Reserva.CodCli AND Carro (Carro.CodCarro=Reserva.CodCarro AND Carro.Modelo=Plio ELX)) Nome Lus Jos Figura 22: Exemplo 25

Exemplo 26 Obter o nome dos clientes para os quais no existe reserva do carro de cdigo a1. Cliente.Nome WHERE NOT Reserva 11

(Cliente.CodCli=Reserva.CodCli AND Reserva.CodCarro=a1) Nome Jos Lus Silvio Figura 23: Exemplo 26

Quanticador Universal (para todo) o quanticador universal. A frmula T(f) verdadeira quando para toda linha T a frmula f verdadeira. O quanticador universal usado para exigir que uma linha de uma tabela que vai para o resultado esteja associada de alguma forma (especicada pela frmula f) a um conjunto de linhas de outra tabela (T) que no vai para o resultado. O quanticador universal pode ser simulado usando o quanticador existencial. T(f) equivalente a NOT T (NOT f). O quanticador universal usado em consultas que, resolvidas com a lgebra relacional, utilizam o operador diviso. Exemplo 27 Obter os cdigos dos carros que foram reservados por todos os clientes de Porto Alegre ou Novo Hamburgo. Obter os cdigos dos carros tal que para todo cliente que seja de Novo Hamburgo ou de Porto Alegre exista uma reserva deste cliente para o carro em questo. Carro.CodCarro WHERE Cliente ((Cliente.Cidade=Porto Alegre OR Cliente.Cidade=Novo Hamburgo) IMPL Reserva (Reserva.CodCliente=Cliente.CodCliente AND Reserva.CodCarro=Carro.CodCarro )) CodCarro a2 Figura 24: Exemplo 27

Exemplo 28 Obter os cdigos dos carros que foram reservados por todos os clientes de Porto Alegre ou Novo Hamburgo. Obter os cdigos dos carros tal que no existe cliente que no seja de Novo Hamburgo ou de Porto Alegre para o qual no exista uma reserva deste cliente para o carro em questo. Carro.CodCarro WHERE NOT Cliente ((Cliente.Cidade=Porto Alegre OR Cliente.Cidade=Novo Hamburgo) AND NOT Reserva (Reserva.CodCliente=Cliente.CodCliente AND Carro.CodCarro=Reserva.CodCarro)) 12

CodCarro a2 Figura 25: Exemplo 28

O exemplo 28 ilustra como o operador pode ser usado para substituir o operador .

13

Vous aimerez peut-être aussi