• Nenhum resultado encontrado

Para os operadores lógicos utilizaremos a seguinte convenção:

No documento Banco de Dados - Princípios e Prática (páginas 69-96)

álgebra relacional_

4. Para os operadores lógicos utilizaremos a seguinte convenção:

Quadro 3.1 – Operadores lógicos

Matemática Português Inglês

∧ e and

∨ ou or

¬ não not

[

projeção

]

A operação de projeção permite que façamos uma restrição em termos de atributos ou campos (ou mesmo colunas) de uma relação ou tabela – aplica uma restrição vertical. Assim, os atributos de maior relevância são escolhidos para que certa consulta seja feita ao banco de dados. A proje- ção é denotada pela letra grega pi (π), a qual aparece subscrita na lista de atributos ou campos desejados para a operação. Nesse procedimento, a

relação ou a tabela aparece, como na seleção, logo após entre parênte- ses. Assim, se quisermos da tabela anterior “Pedido” apenas os campos código e valor, fazemos a seguinte operação de projeção:

πcodigo,valor (pedido)

Com essa consulta, produzimos, então, a seguinte relação ou tabela de saída: codigo valor 1005 1.200,00 1008 960,00 1010 1.020,00 1015 755,00

[junção]

Também denominada de junção natural, tal operação caracteriza-se por ser binária, necessitando de duas relações ou tabelas. É também necessária a existência de atributos ou campos em comum entre as duas tabelas envolvidas. Por exemplo, suponhamos que a informação dos clientes que fizeram pedidos esteja na tabela “Clientes”. Assim, caso queiramos saber o nome do cliente que comprou certo pedido de determinado código, não dispomos de tal informação na tabela “Pedido”. No entanto, com a operação de junção, é possível obter- mos essa informação.

Ao compararmos as tabelas “Clientes” e “Pedido”, percebemos que os campos que se correlacionam são codigo na tabela “Clientes”, e codcli na tabela “Pedido”. Assim, é possível fazermos a junção das duas tabe- las através desses campos em comum. A tabela “Clientes” apresenta-se da seguinte forma:

69 A tabela “Clientes” apresenta-se da seguinte forma:

CLIENTES

codigo nome telefone limite_compra

202 Ernesto 3222-0809 1.500,00

221 Amélia 3233-2474 2.000,00

233 Luís Alberto 3323-0071 1.500,00

282 José Antonio 3343-9021 800,00

295 Carlos Silva 3224-5678 800,00

Agora, vamos observar a tabela “Pedido”:

PEDIDO

codigo codcli data valor

1005 202 10/03/2004 1.200,00

1008 221 13/03/2004 960,00

1010 233 17/03/2004 1.020,00

1015 282 20/03/2004 755,00

Nesse processo, expressamos a operação que foi efetuada através do símbolo , col ocando em subscrito à direita a igualdade entre os cam- pos em comum. Caso os campos venham a ter a mesma designação nas duas tabelas, omitimos a igualdade e colocamos apenas uma vez o nome do atributo ou campo.

pedidocodcli=codigo clientes

Note que na igualdade, o campo codcli está à esquerda, pois pertence à tabela “Pedido” e o campo codigo está à direita, pois pertence, por sua vez, à tabela “Clientes”. A tabela resultante da operação de junção, nesse caso, fica assim:

codigo codcli data valor nome telefone limite_compra 1005 202 10/03/2004 1.200,00 Ernesto 3222-0809 1.500,00 1008 221 13/03/2004 960,00 Amélia 3233-2474 2.000,00 1010 233 17/03/2004 1.020,00 Luis Alberto 3323-0071 1.500,00 1015 282 20/03/2004 755,00 José Antonio 3343-9021 800,00

Veja que a tabela de saída tem sete atributos e que o atributo em comum não é repetido*. Note também que na junção, os registros que não têm um correspondente na outra tabela desaparecem da tabela resultante (no caso, o cliente de código 295, Carlos Silva). Agora, é possível saber- mos pelo nome do cliente o pedido relacionado a ele.

A operação de junção é comutativa, ou seja, se trocarmos de lado as tabelas envolvidas,

clientescodigo=codcli pedido

produziremos uma tabela semelhante à obtida anteriormente, porém com os atributos dispostos de maneira diferente:

clientes. codigo

nome telefone limite_

compra pedido. codigo data valor 202 Ernesto 3222- 0809 1.500,00 1005 10/03/2004 1.200,00 221 Amélia 3233- 2474 2.000,00 1008 13/03/2004 960,00 233 Luís Alberto 3323- 0071 1.500,00 1010 17/03/2004 1.020,00 282 José Antonio 3343- 9021 800,00 1015 20/03/2004 755,00

* Em consultas na linguagem SQL, por exemplo, costumam aparecer os dois campos, precedidos do nome da relação ou tabela.

71

Veja que, agora, diferenciamos o atributo codigo da tabela “Clientes” colocando o prefixo referente ao nome da tabela logo após um ponto e o nome do atributo, o mesmo acontecendo com “Pedido”.

É também possível fazer junções de três ou mais tabelas, desde que res- peitados os critérios colocados para a operação de junção.

[

operações compostas

]

Com as três operações que já foram explicadas, já é possível fazermos

consultas compostas. Suponha que queiramos consultar apenas o código do cliente que comprou o pedido 1010. Assim, além de fazer- mos uma seleção, é necessário também realizarmos uma projeção para obtermos somente a informação do campo codcli, por exemplo:

πcodclicodigo=1010 (pedido))

Como a seleção produz uma tabela de saída, esta serve de entrada para a próxima operação que é a projeção. A tabela de saída após a proje- ção fica:

codcli

233

Devemos ter cuidado quando fizermos a operação de forma inversa: σcodigo=1010codcli (pedido))

Nesse caso, como a tabela resultante da projeção retorna apenas o atri- buto “codcli”, iremos perder o campo “código” envolvido na seleção logo a seguir, produzindo, desse modo, uma tabela nula:

codcli

Assim, devemos ter cuidado com a precedência das operações. Uma boa regra para seguir é fazermos a operação de junção seguida da seleção e apenas no final fazermos a projeção. Dessa forma, se quisermos obter ape- nas o nome do cliente referente ao pedido 1010, precisaremos da junção efe- tuada anteriormente, além de fazermos a operação de seleção apenas para o pedido 1010, para, depois, projetarmos para o atributo nome, ou seja:

πnomepedido.codigo=1010 (pedido codcli=codigo clientes)) Nesse processo, a tabela de saída tem a forma:

nome

Luís Alberto

[

união

]

A operação de união é binária e necessita de duas tabelas para operar. A restrição aqui colocada é: as tabelas envolvidas devem ter o mesmo conjunto de atributos. Assim, se tivermos duas tabelas relativas, uma à conta-corrente de clientes e outra às contas de poupança, e quiser- mos obter uma consulta recuperando todos os números de contas, não importando de que tipos sejam, é só fazermos a união das tabelas. Com as tabelas apresentadas, a seguir, vamos fazer o processo descrito acima.

CONTA_CORRENTE

conta nome telefone saldo

1123-8 Ernesto 3222-0809 750,00

2124-0 Amélia 3233-2474 (130,00)

3113-6 Luís Alberto 3323-0071 1.100,00

73

CONTA_POUPANÇA

conta nome telefone valor

1333-5 Luís Paulo 3222-0809 150,00

2124-0 Amélia 3233-2474 320,00

3243-6 Carlos Alberto 3323-0071 800,00

4563-7 José Antonio 3343-9021 330,00

A expressão de consulta, a seguir, retorna todas as contas, não impor- tando sua função, sem repetir registros existentes nas duas tabelas:

πconta (conta_corrente) U πconta (conta_poupanca) produzindo a seguinte tabela:

conta 1123-8 1333-5 2124-0 3113-6 3243-6 4563-7

[

diferença

]

A operação de diferença também é binária, de forma semelhante à união e à junção. Se quisermos, numa consulta, retirar registros ou linhas que sejam comuns às tabelas envolvidas, o fazemos através da operação de diferença. Se quisermos, dentro do mesmo contexto colo- cado para a união, excluir das contas correntes aquelas que também são contas de poupança, a expressão fica:

πconta (conta_corrente) − πconta (conta_poupanca) produzindo a seguinte tabela:

conta

1123-8

3113-6

Para a operação diferença, vale a restrição das tabelas envolvidas, com relação ao conjunto de atributos iguais, aplicada à operação de união.

[

interseção

]

A operação de interseção, como na teoria dos conjuntos, tem a finali- dade de retornar os registros em comum entre duas tabelas. Essa ope- ração é binária, necessitando de duas tabelas para ser efetuada. Para exemplificar, vamos considerar as tabelas, dos exemplos anterio- res, usadas para união e diferença.

CONTA_CORRENTE

conta nome telefone saldo

1123-8 Ernesto 3222-0809 750,00

2124-0 Amélia 3233-2474 (130,00)

3113-6 Luís Alberto 3323-0071 1.100,00

4563-7 José Antonio 3343-9021 (330,00)

CONTA_POUPANÇA

conta nome telefone valor

1333-5 Luís Paulo 3222-0809 150,00

2124-0 Amélia 3233-2474 320,00

3243-6 Carlos Alberto 3323-0071 800,00

4563-7 José Antonio 3343-9021 330,00

Caso queiramos obter as contas que aparecem tanto na relação “Conta_corrente” quanto na “Conta_poupança”, fazemos a operação de interseção:

75

πconta (conta_corrente) ∩ πconta (conta_poupanca) obtendo, assim, a seguinte tabela de saída:

conta

2124-0

4563-7

Dadas duas tabelas “r” e “s” quaisquer, a operação de interseção pode ser escrita utilizando somente a operação diferença:

r ∩ s = r − (r − s)

[

produto cartesiano

]

A operação produto cartesiano também é binária, sendo bastante semelhante ao produto cartesiano da teoria dos conjuntos. Enquanto a junção une duas tabelas de acordo com campos em comum, no pro- duto cartesiano não são considerados tais campos. Para cada registro de uma tabela, repetem-se todos os registros da outra. Assim ao fazer o segundo registro da tabela, repetem-se todos os registros da outra, e assim sucessivamente até o último registro da primeira tabela. Assim, para o produto cartesiano das tabelas do exemplo anterior referente às tabelas “Pedido” e “Clientes”, fazemos a operação “pedido × clientes”, o que resulta na seguinte tabela:

pedido.

codigo codcli data valor

clientes.

codigo nome telefone

limite_ compra 1005 202 10/03/2004 1.200,00 202 Ernesto 3222-0809 1.500,00 1005 202 10/03/2004 1.200,00 221 Amélia 3233-2474 2.000,00 1005 202 10/03/2004 1.200,00 233 Luís Alberto 3323-0071 1.500,00 1005 202 10/03/2004 1.200,00 282 José Antonio 3343-9021 800,00

pedido.

codigo codcli data valor

clientes.

codigo nome telefone

limite_ compra 1005 202 10/03/2004 1.200,00 295 Carlos Silva 3224-5678 800,00 1008 221 13/03/2004 960,00 202 Ernesto 3222-0809 1.500,00 1008 221 13/03/2004 960,00 221 Amélia 3233-2474 2.000,00 1008 221 13/03/2004 960,00 233 Luís Alberto 3323-0071 1.500,00 1008 221 13/03/2004 960,00 282 José Antonio 3343-9021 800,00 1008 221 13/03/2004 960,00 295 Carlos Silva 3224-5678 800,00 1010 233 17/03/2004 1.020,00 202 Ernesto 3222-0809 1.500,00 1010 233 17/03/2004 1.020,00 221 Amélia 3233-2474 2.000,00 1010 233 17/03/2004 1.020,00 233 Luís Alberto 3323-0071 1.500,00 1010 233 17/03/2004 1.020,00 282 José Antonio 3343-9021 800,00 1010 233 17/03/2004 1.020,00 295 Carlos Silva 3224-5678 800,00 1015 282 20/03/2004 755,00 202 Ernesto 3222-0809 1.500,00 1015 282 20/03/2004 755,00 221 Amélia 3233-2474 2.000,00 1015 282 20/03/2004 755,00 233 Luís Alberto 3323-0071 1.500,00 1015 282 20/03/2004 755,00 282 José Antonio 3343-9021 800,00 1015 282 20/03/2004 755,00 295 Carlos Silva 3224-5678 800,00

Nesse caso, podemos obter a consulta composta sobre a operação do produto cartesiano em vez da operação de junção, pois, desde que na operação de seleção façamos os campos comuns iguais entre si, é possí- vel operacionalizarmos:

πnome(pedido.codigo=1010) ∧ (codcli=clientes.codigo)(pedido × clientes)) Chegamos, assim, ao resultado da consulta que é:

77

A operação do produto cartesiano é dispendiosa. O número de registros da tabela resultante de uma operação de produto cartesiano é a mul- tiplicação do número de registros de cada uma das tabelas. No nosso exemplo, existem quatro registros na tabela “Pedido” e cinco registros na tabela “Clientes”, resultando 20 registros na tabela de saída da ope- ração do produto cartesiano.

[

renomeação (rename ou renaming)

]

Conforme vimos até aqui, com as consultas na álgebra relacional, o resultado de uma expressão não possui um nome que possa ser usado para referenciá-la. No entanto, em certos momentos, é útil dar um nome a uma tabela de saída. O operador de renomeação é represen- tado pela letra grega rho (ρ).

Assim, dada uma certa expressão da álgebra relacional E, a expressão a seguir:

ρr (E)

resulta a expressão E com o nome r.

Outra forma de utilizar a operação de renomeação é a forma que apre- sentamos a seguir, (isso, desde que tenhamos uma expressão E):

ρr(A1 ,A2 ,...,An) (E)

Nesse caso, retorna o resultado da expressão E pelo nome r, e os atribu tos, desta nova tabela, são alterados e recebem novos nomes A1, A2,..., An.

Vamos considerar o seguinte tipo de consulta2: “Qual o pedido de valor mais alto existente em uma tabela?”. Vamos considerar como ponto de partida a tabela utilizada anteriormente para as outras operações:

PEDIDO

codigo codcli data valor

1005 202 10/03/2004 1.200,00

1008 221 13/03/2004 960,00

1010 233 17/03/2004 1.020,00

1015 282 20/03/2004 755,00

A estratégia a ser adotada, nessa situação, consiste em primeiro esta- belecermos uma tabela temporária que irá conter os valores de pedidos que não são altos. A partir deste conjunto, obtemos, a seguir, a diferença entre a projeção da tabela original “Pedido” e essa tabela temporária. Para computar a tabela temporária, iremos comparar os valores de todos os pedidos existentes. Isso pode ser obtido a partir do produto carte- siano “pedido x pedido”, e aplicar uma seleção para comparar os valores de dois pedidos quaisquer que venham a aparecer em um registro. Preci- saremos, então, do mecanismo discutido aqui, para diferenciar entre dois campos valor. Utilizamos, na seqüência, a operação renomeação para mudar o nome da relação “pedido”, o que nos permite, dessa maneira, a referência à segunda relação sem problemas de duplicidade.

A tabela temporária, que consiste dos pedidos que não sejam os mais altos, pode ser expressa da seguinte forma:

πpedido.valorpedido.valor<q.valor (pedido × ρq (pedido)))

Assim, essa expressão irá fornecer os valores da tabela “Pedido” para os quais um alto valor aparece em qualquer parte da relação “pedido”, exceto o mais alto. O produto cartesiano:

pedido × ρq (pedido), contido na expressão, resulta em:

79 pedido. codigo pedido. codcli pedido. data pedido. valor q. codigo q.

codcli q.data q.valor

1005 202 10/03/2004 1.200,00 1005 202 10/03/2004 1.200,00 1005 202 10/03/2004 1.200,00 1008 221 13/03/2004 960,00 1005 202 10/03/2004 1.200,00 1010 233 17/03/2004 1.020,00 1005 202 10/03/2004 1.200,00 1015 282 20/03/2004 755,00 1008 221 13/03/2004 960,00 1005 202 10/03/2004 1.200,00 1008 221 13/03/2004 960,00 1008 221 13/03/2004 960,00 1008 221 13/03/2004 960,00 1010 233 17/03/2004 1.020,00 1008 221 13/03/2004 960,00 1015 282 20/03/2004 755,00 1010 233 17/03/2004 1.020,00 1005 202 10/03/2004 1.200,00 1010 233 17/03/2004 1.020,00 1008 221 13/03/2004 960,00 1010 233 17/03/2004 1.020,00 1010 233 17/03/2004 1.020,00 1010 233 17/03/2004 1.020,00 1015 282 20/03/2004 755,00 1015 282 20/03/2004 755,00 1005 202 10/03/2004 1.200,00 1015 282 20/03/2004 755,00 1008 221 13/03/2004 960,00 1015 282 20/03/2004 755,00 1010 233 17/03/2004 1.020,00 1015 282 20/03/2004 755,00 1015 282 20/03/2004 755,00

A seleção, (a seguir), operando sobre a tabela acima, restringe os valores: σpedido.valor<q.valor (pedido × ρq (pedido))

E tem como resultado a seguinte tabela:

pedido. codigo pedido. codcli pedido. data pedido. valor q. codigo q. codcli q.data q.valor 1008 221 13/03/2004 960,00 1005 202 10/03/2004 1.200,00 1008 221 13/03/2004 960,00 1010 233 17/03/2004 1.020,00 1010 233 17/03/2004 1.020,00 1005 202 10/03/2004 1.200,00 1015 282 20/03/2004 755,00 1005 202 10/03/2004 1.200,00 1015 282 20/03/2004 755,00 1008 221 13/03/2004 960,00 1015 282 20/03/2004 755,00 1010 233 17/03/2004 1.020,00

Quando realizamos a projeção final sobre toda a operação, πpedido.valorpedido.valor<q.valor (pedido × ρq (pedido)))

resulta na seguinte tabela: valor 960,00 960,00 1.020,00 755,00 755,00 755,00

Perceba que na projeção acima, o valor maior R$1.200,00 não está con- tido na tabela. Com a projeção sobre a tabela original “Pedido”, que é

πpedido.valor (pedido) e com os registros, que são:

valor

1.200,00

960,00

1.020,00

755,00

obtemos uma tabela temporária (acima) e, dessa forma, ao acrescentá-la aos dados (passos) que a antecederam, estamos em condições de repre- sentar a expressão da diferença,

πpedido.valor (pedido) − πpedido.valorpedido.valor<q.valor (pedido × ρq (pedido))), e conseqüentemente ao resultado,

valor

1.200,00

81

[

atribuição ou designação

]

É interessante, algumas vezes, utilizarmos a designação para uma tabela, de modo a usá-la como variável temporária. A operação de atri-

buição ou designação, denotada por ←, trabalha de maneira asseme- lhada à atribuição de variáveis nas linguagens de programação. Com essa operação, é possível fazer uma consulta de maneira seqüen- cial, consistindo de uma série de designações seguidas por uma expres- são cujo valor é exibido como o resultado daquela consulta.

Portanto, se quisermos representar o exemplo da operação de renomea- ção tratado anteriormente,

pedido.valor (pedido) − πpedido.valorpedido.valor<q.valor (pedido × ρq (pedido))) podemos fazer uso de designações para facilitar a expressão:

temp1 ← pedido × ρq (pedido)

temp2 ← πpedido.valorpedido.valor<q.valor (temp1))

resultado ← πpedido.valor (pedido) − temp2

Assim, resultado será a tabela de saída, sendo que cada passo da con- sulta é armazenado por designação nas variáveis temporárias “temp1” e “temp2”.

Divisão

A operação de divisão é similar à existente na álgebra numérica. Dadas duas tabelas “P” e “Q”, a divisão de “P” por “Q” é denotada por

onde “P” é o “dividendo” e “Q” é o “divisor”. A idéia por trás da ope- ração de divisão é obter o conjunto de registros em “P” que “casa” ou coincide com todos em “Q”. Ou seja, devem aparecer, como resultado da consulta, os registros de “P” que estão relacionados a todos os regis- tros em “Q”, ao mesmo tempo.

Digamos que as tabelas “P” e “Q” assumam o seguinte conteúdo:

P Q a b b a1 b1 b1 a1 b2 b2 a2 b1 b3 a2 b3 a1 b3 a3 b1 a3 b2

A operação P ÷ Q resulta em:

P ÷ Q

a

a1

Ou seja, o resultado ou quociente da divisão contém os atributos de “P” que não estão presentes em “Q”. Assim, o atributo “a” faz parte da tabela de resultado e o valor “a1” aparece como resultado na tabela quociente, em função de “Q” ter os valores que aparecem no atributo “b” e que se repetem no atributo “a” (ou seja, os pares (a1, b1), (a1, b2) e (a1, b3)) da tabela “P”.

83 S b b 1 b2

Então, a operação “P ÷ S” resulta, agora, em:

P ÷ S

a

a1

a3

Isso por existirem os pares (a1, b1), (a1, b2) e (a3, b1), (a3, b2) na tabela “P”.

E, por fim, se a tabela “T” assumir o seguinte conteúdo:

T

b

b1

a operação “P ÷ T” resulta em:

P ÷ T

a

a1

a2

a3

Isso em razão da existência de (a1, b1), (a2, b1) e (a3, b1) na tabela “P”.

Com um exemplo do modelo relacional já descrito anteriormente, a con- sulta seguinte irá necessitar da operação de divisão: “Qual é o código do fornecedor que fornece todos os produtos?”. Veja a operação:

A seguir a tabela “Prodfor”: PRODFOR codprod codfor 2001 130 2044 130 2050 141 2050 152 2050 184 2080 152 2001 152 2044 152 3020 163 3020 152 3033 184 3050 184 4101 163 4101 184 3033 152 3050 152 4101 152 E a tabela “Estoque”: ESTOQUE

codigo descricao qtd ptoped estmin custo prazoent

2001 Grade de Aço 150 70 30 80,00 15 2044 Bomba Injetora 5 2 1 320,00 30 2050 Multímetro 20 5 2 35,00 10 2080 Acoplador 4 6 2 280,00 30 3020 Quadro Padrão 3 8 4 140,00 20 3033 Esmeril 5 3 2 110,00 10 3050 Furadeira 9 5 3 85,00 10 4101 Serra Tico-Tico 6 4 2 75,00 10

85

A tabela resultado ou o quociente da divisão é:

codfor

152

Isso porque o fornecedor de código 152 fornece todos os produtos exis- tentes na tabela “Estoque”.

[

resto

]

A operação de divisão pode ser relacionada com o produto cartesiano, da mesma forma que na álgebra normal com a multiplicação e a divisão. Se, com a operação inteira 5 ÷ 3 = 1, quisermos fazer o inverso, multipli- cando 1 × 3, precisaremos do resto 2 para achar o valor original 5. Veri- ficando o exemplo abordado em divisão, depois de obter “P ÷ Q”, se, agora, quisermos reproduzir a tabela “P” a partir da operação inversa:

(P ÷ Q) × Q

Porém, o resultado desse produto cartesiano será:

(P ÷ Q) × Q

a b

a1 b1

a1 b2

a1 b3

Que, como você pode notar, é diferente da tabela “P” original. Assim, a operação “P ÷ Q” gerou um resto que são os registros que não fizeram parte da tabela quociente.

Para obtermos o resto, precisamos utilizar a operação de diferença: P − (P ÷ Q) × Q

Dessa forma, se fizermos “R = P − (P ÷ Q) × Q”, como sendo a tabela que contém o resto, de acordo com o exemplo anterior,

R a b a2 b1 a2 b3 a3 b1 a3 b2

é possível, nesse processo, restaurar a tabela “P” original fazendo a operação de união:

((P ÷ Q) × Q) U R

O resto não é entendido como sendo uma operação da álgebra que serve apenas para mostrar as relações existentes entre os operadores do produto cartesiano e da divisão.

No exemplo anterior de fornecedores, para saber os fornecedores que

não fornecem todos os produtos, basta obter o resto por meio da ope- ração de diferença:

πcodigo (prodfor) − (prodfor ÷ πcodigo (estoque))

PRODUZINDO codfor 130 141 163 184

Note que na operação de diferença, precisa-se respeitar o critério dos atributos comuns.

87

[

resumo

]

A “álgebra relacional” é uma linguagem de consultas procedural que consiste num conjunto de operações que são efetuadas sobre tabelas ou relações de entrada, produzindo uma nova relação ou tabela na saída. As operações da álgebra relacional são: seleção, projeção, produto car-

tesiano, junção, união, diferença, intersecção, divisão, renomeação e

atribuição ou designação. A operação de seleção extrai linhas ou regis- tros que satisfaçam uma determinada condição (restrição horizontal); por sua vez, a operação de projeção permite a extração de atributos ou colunas específicas de uma relação ou tabela (restrição vertical). A jun-

ção permite combinar duas tabelas que possuam um ou mais atributos em comum; enquanto a união combina as linhas de duas tabelas, desde que tenham o mesmo conjunto de atributos; já a intersecção retira as linhas comuns nessa mesma situação. A diferença permite a extração daqueles registros que são comuns a duas relações, permanecendo os registros da tabela que aparece representada à esquerda. O produto

cartesiano faz a combinação de uma linha de uma tabela com todas as linhas de outra e, assim, sucessivamente, não importando os atributos em comum. A renomeação permite a modificação de nomes de atri- butos nas expressões de consulta; sendo que a atribuição ou designa-

ção permite renomear tabelas resultantes de consultas, possibilitando uma melhor compreensão de um conjunto de consultas subseqüentes. A operação de divisão permite obter um conjunto de registros de uma tabela que se associam com outra tabela enquanto o resto é a opera- ção que obtém os registros que não se associam.

[

exercícios

]

Com base nas tabelas a seguir, expresse com as operações da álgebra relacional e mostre a tabela resultante para cada questão pedida.

PEDIDO

codigo codcli data valor

0001 100 03/10/2003 133,00 0002 102 04/10/2003 45,00 0003 105 05/11/2003 339,50 0004 110 10/11/2003 30,00 0005 100 12/11/2003 152,50 CLIENTE

codigo nome telefone cidade UF

100 Luís Paulo 3355-1027 Curitiba PR

102 José Antonio 3452-3528 Lapa PR

105 Carlos Lima 3233-3456 Joinville SC

110 Maria de Castro 3441-8930 Ponta Grossa PR

114 Danilo Silva 3353-4020 Curitiba PR

ITENS

codped coditem qtdped subtotal

0001 2.010 3 108,00 0001 2.020 10 25,00 0002 3.004 30 45,00 0003 4.011 2 50,00 0003 4.013 5 137,50 0003 4.025 4 152,00 0004 3.004 20 30,00 0005 3.004 10 15,00 0005 4.013 5 137,50

89

FORNECEDOR

codigo nome telefone cidade UF

501 ABC Cirúrgica 3772-4001 São Paulo SP

502 Thermo 3873-5030 Salvador BA

535 Distrib.Silva 3444-5523 Joinville SC

550 CLS 3352-2353 Curitiba PR

590 AKL Equip. 3330-8252 Porto Alegre RS

ESTOQUE

codigo descricao un preco qtd estmin ptoped codfor

2000 Termômetro un 12,00 36 5 15 501 2010 Termômetro Digital un 36,00 12 5 15 501 2020 Compressa Cirúrgica Pct c/10 2,50 40 10 50 535 3004 Esparadrapo Rl c/10m 1,50 130 20 100 535 4011 Agulha Desc. 10mmx1mm Cx. c/ 100 un 25,00 43 15 60 550 4013 Agulha Desc. 12mmx2mm Cx. c/ 100 un 27,50 43 15 60 550 4025 Agulha Desc. 15mmx1mm Cx. c/ 100 un 38,00 43 15 60 550 5001 Ap.Pressão un 205,00 6 1 5 590

1. Quais os itens que foram comprados pelo cliente de número 100? Mostre o código do item.

2. Quais os itens no estoque que estão abaixo do ponto de pedido? Apresente a descrição, a quanti- dade e o ponto de pedido.

3. Liste os pedidos efetuados pelo cliente Luís Paulo. 4. Dê o nome do cliente que comprou o produto mais caro. Apresente o nome e o telefone.

5. Quais os pedidos adquiridos no mês de novem- bro? Apresente o código.

6. Dê o código e a descrição dos produtos que estão abaixo do estoque mínimo.

7. Quais os itens no estoque que não foram compra- dos? Apresente código e descrição.

8. Quais clientes não efetuaram pedido? Mostre nome e telefone.

9. Faça uma lista de nomes e telefones de clientes e de fornecedores.

10. Qual o nome e o telefone dos fornecedores do pedido 0005?

Com base no conjunto de tabelas a seguir, efetue as consultas conforme a álgebra relacional:

CLIENTES

codigo nome telefone datanasc

1010 Carlos Alberto 3323-2090 12/05/1975

1012 Maria Albertina 3221-0304 15/07/1980

1015 João Carlos 3234-5678 10/04/1977

1021 Teresa Silva 3313-4455 23/02/1982

FILMES

codigo titulo duracao

300 Soldado Universal VI 2,10

303 Robin Hood 1,70

310 A Bela e a Fera 2,20

91

FITA

codigo codfilme valorloc

5110 300 1,50 5111 300 1,50 5112 303 1,70 5113 310 1,70 5117 330 2,00 5125 335 2,10 5127 335 2,10 LOCAÇÃO

codfita codcli dataloc dataent

5110 1021 10/04/2004 12/04/2004

5111 1015 10/04/2004

5113 1010 11/04/2004 13/04/2004

5127 1010 12/04/2004

11. Qual o código das fitas que não foram locadas? 12. Qual é o valor da locação do filme Titanic? 14. Qual o nome de quem locou a fita no dia do seu aniversário?

15. Quais clientes (nome e telefone) fazem aniversá- rio no mês de fevereiro?

16. Identifique (nome e telefone) os clientes que não locaram fitas.

standard_query

No documento Banco de Dados - Princípios e Prática (páginas 69-96)

Documentos relacionados