Banco de Dados I 2007 - Computação Unioesteclodis/BDI/BDI_2007_Modulo3_1.pdf · Uma seqüência...
Transcript of Banco de Dados I 2007 - Computação Unioesteclodis/BDI/BDI_2007_Modulo3_1.pdf · Uma seqüência...
Conteúdo do Módulo:
� Linguagens de Consulta Formais
� Álgebra Relacional;
� Cálculo Relacional de Tupla;
� Cálculo Relacional de Domínio;
� Linguagens de Consulta Comerciais
� SQL (Structured Query Language);
� QBE (Query by Example).
Introdução
� Linguagem de consulta procedural (o usuário descreve os passos que devem ser executados para obter uma informação).
� As linguagens de consulta formais ilustram as técnicas fundamentais para extração de dados em um BD.
� Conjunto de operações que tomam como entrada uma ou duas relações produzindo como resultado uma nova relação.
� Uma seqüência de operações da álgebra relacional forma uma expressão em álgebra relacional cujo resultado também será uma relação. Esta relação representa o resultado de uma consulta ao BD.
� É utilizada como base para implementar e otimizar consultas em SGBD relacionais.
130016Perryridge
90011Round Hill
50093Mianus
150014Downtown
150015Perryridge
200023Redwood
100017Downtown
totalnúmero_empréstimonome-agência
Exemplo: Relação empréstimo
Esquema Agente_empréstimo: nome_cliente, nome_bancário e número_empréstimo.
Esquema Cliente: nome-cliente, rua, cidade
Esquema Conta: número_conta, nome_cliente, saldo
Operações Fundamentais� Select
� Operação unária
� Seleciona tuplas que satisfaçam um predicado
� Denotada pela letra grega σσσσ (sigma minúsculo)
� Exemplo:� Selecione (ou encontre) todas as tuplas da relação empréstimo,
cuja agência é “Perryridge”
σσσσ nome_agência = “Perryridge”(empréstimo)
130016Perryridge
150015Perryridge
totalnúmero_empréstimonome_agência
Operações Fundamentais
� Exemplos:
� Encontre todas as tuplas cujos totais são superiores a 1.200 reais.
σσσσ total > 1200 (empréstimo)
� Encontre as tuplas que contenham empréstimos acima de 1.200 reais, feitos na agência Perryridge.
σσσσ total > 1200 ∧ nome_agência = “Perryridge” (empréstimo)
� Todos os clientes que tenham o mesmo nome de seu agente bancário.
σσσσ nome_cliente = nome_agente(agente_cliente)
Operações Fundamentais� Considere o esquema Empregado:
SSN, Pnome, Minicial, Unome, DataNasc, Endereço, Sexo, Salario, SuperSSN, DNO
� Selecione as tuplas de EMPREGADO cujo departamento é 4, ou aquelas com salário superior a 30.000:
� σσσσ DNO=4 (EMPREGADO)
� σσσσ salario > 30000 (EMPREGADO)
� σσσσ DNO=4 ∨ salario > 30000 (EMPREGADO)
� Selecione as tuplas de todos os empregados que trabalham no departamento 4 e recebem acima de 25.000, ou trabalham no departamento 5 e recebem acima de 30.000.
� σσσσ (DNO=4 AND salario > 25000) OR (DNO=5 AND salario > 30000) (EMPREGADO)
� σσσσ (DNO=4 ∧ salario > 25000) ∨ (DNO=5 ∧ salario > 30000) (EMPREGADO)
Operações Fundamentais
� Observe que a operação de SELEÇÃO é comutativa:� σσσσ <cond1> (σσσσ <cond2> (R)) = σσσσ <cond2> (σσσσ <cond1> (R))
� Sempre é possível combinar uma propagação de operações de SELEÇÃO dentro de uma única operação de SELEÇÃO, com uma condição conjuntiva (AND), isto é:� σσσσ <cond1> (σσσσ <cond2> ( ... (σσσσ <condN> (R)) ...)) = σσσσ <cond1> AND <cond2> AND ... AND
<condN> (R)
� Uma seqüência de SELEÇÃO pode ser aplicada em qualquer ordem.
Operações Fundamentais
� Project
� Operação unária. Denotada pela legra grega ππππ (pi minúsculo).
� Retorna parte da relação deixando de fora os atributos que não foram solicitados. As linhas em duplicidade são eliminadas.
� Os atributos que desejamos no resultado, listamos de forma subscrita em ππππ.
�Exemplo:�Listar todos os números de empréstimos e totais desses empréstimos
ππππ número_empréstimo, total (empréstimo)
130016
90011
50093
150014
150015
200023
100017
totalnúmero-empréstimo
Operações Fundamentais
Operações Fundamentais
� Outro exemplo:� Lista o primeiro e o último nome e o salário de cada
empregado:� ππππ Unome, Pnome, Salário (EMPREGADO)
� O resultado da operação de PROJEÇÃO tem apenas os atributos especificados na <lista de atributos>, na mesma ordem em que eles aparecem na lista.
� O número de tuplas em uma relação resultante de uma operação de PROJEÇÃO é sempre menor ou igual ao número de tuplas em R. Se a lista escolhida for uma superchave de R, isto é, incluir alguma das chaves de R, a relação resultante terá o mesmo número de tuplas queR.
Operações Fundamentais
� ππππ <lista1> (ππππ <lista2> (R)) = ππππ <lista1> (R)
�Se a <lista 2> contiver os atributos da<lista1>; do contrário, a expressão do lado esquedro será incorreta.
�Também note que a comutatividade não se aplica na PROJEÇÃO.
Operações Fundamentais
� Encontre os clientes que moram em Harrison.
π nome_cliente (σσσσ cidade = “Harrison”(cliente))
� Encontre os saldos dos empréstimos feitos na agência “Perryridge”.
ππππ saldo (σσσσ nome_agência = “Perryridge”(empréstimo))
Operação Adicional
� Designação (RENAME – Navathe)
� Denotada pelo símbolo �.
� A aplicação de uma designação não resulta em uma relação mas associa o resultado de uma expressão ao uma variável do tipo relação.
Temp1 � π R-S (r)
Temp2 � Temp1 |x| π R-V (s)
Operação Adicional
� Deps_Emps � σσσσ DNO=4 (EMPREGADO)
� Resultados � ππππ Pnome, Unome, Salario (Deps_Emps)
� TEMP � σσσσ DNO=4 (EMPREGADO)
� R(Primeironome, Ultimonome, Salario) � ππππ Pnome,
Unome, Salario (TEMP)
� Pode-se renomear atributos, veremos mais àfrente.
Operações Fundamentais
� Union
�Operação binária�Realiza a união de duas relações�Requisitos: as relações envolvidas na
operação devem ser compatíveis.� As relações envolvidas devem possuir o mesmo
número de atributos� Os domínios do i-ésimo atributo de uma relação e
o i-ésimo atributo da outra relação devem ser os mesmos para todo i.
�Denotada pelo símbolo ∪∪∪∪.
Operações Fundamentais
� Encontre o nome de todos os clientes do banco que tenham uma conta ou um empréstimo ou ambos.
� Para encontrar todos os clientes com um empréstimo no banco:
ππππ nome_cliente (devedor)
� Para encontrar todos os clientes com uma conta no banco:
ππππ nome_cliente (depositante)
� Unindo as duas consultas acima em uma:ππππ nome_cliente (devedor) ∪ ππππ nome_cliente (depositante)
Operações Fundamentais
� Originalmente existiam sete devedores e seis depositantes.� Note que o resultado dessa consulta é uma relação com dez tuplas. � Esta diferença se deve ao fato de alguns clientes serem devedores e
depositantes.� Os valores repetidos são eliminados.
Adams
Williams
Curry
Jackson
Lindsay
Jones
Turner
Hayes
Smith
Johnson
nome-cliente
Operações Fundamentais
� Diferença entre conjuntos
� Operação binária. Denotada pelo símbolo -.
� Permite encontrar as tuplas que estão em uma relação mas não estão em outra.
� A expressão r – s resulta na relação que contém as tuplas que estão em r mas não estão em s.
� Exemplo:� Encontre todos os clientes do banco que possuem conta mas não
possuem empréstimos.
ππππ nome_cliente (depositante) - ππππ nome_cliente (devedor)
Lindsay
Turner
Johnson
nome-cliente
Operações Fundamentais
� Produto Cartesiano
� Operação binária. Denotada pelo símbolo x (r x s).� Permite combinar informações de duas relações
quaisquer.� Renomear para diferenciar: desde que um mesmo nome de atributo
pode aparecer tanto em r quanto em s, é preciso estabelecer um modo de diferenciá-los na relação resultante. Para isso pode-se anexar o nome da relação ao atributo que a ela pertence. Exemplo: devedor x empréstimo
(devedor.nome_cliente, devedor.número_empréstimo, empréstimo.nome_agência, empréstimo.nome_cliente,
empréstimo.total)ou
(nome_cliente, devedor.número_empréstimo, nome_agência, empréstimo.número_empréstimo, total)
Operações Fundamentais
� O Produto Cartesiano apresenta problemas quando as relações tem mesmo nome, quando se quer fazer o produto de uma relação com ela mesma ou quando o produto cartesiano está envolvido com a relação resultante de expressões. A operação rename resolve estes problemas.
� O produto cartesiano permite combinar duas relações construindo uma tupla da relação resultante por meio de cada par de tuplas possível: uma da relação r e outra da relação s.
� Exemplo: encontre os nomes de todos os clientes que tenham um empréstimo na agência Perryridge.
σσσσ nome_agência = “Perryridge” (devedor X empréstimo)σσσσ devedor.número_empréstimo = empréstimo.número_empréstimo (σσσσ nome_agência = “Perryridge”
(devedor X empréstimo))ππππ nome_cliente (σσσσ devedor.número_empréstimo = empréstimo.número_empréstimo (σσσσ nome_agência =
“Perryridge” (devedor X empréstimo)))
Operações Fundamentais
� Rename (atributos)
� Operação unária� O resultado de uma expressão em álgebra relacional
não possui um nome que possa ser usado para referenciá-lo.
� O operador rename permite dar nomes a eles.� É representado pela letra grega ρρρρ (rô minúsculo)
ρ X(E)Onde x é o nome do resultado da expressão E.
Exemplo: Encontre o saldo mais alto em uma conta do banco.
Operações Fundamentais
� Estratégia:
� Encontrar os saldos menores do que outros saldos:
π conta.saldo (σ conta.saldo < outros.saldo (conta x ρoutros(conta)))
� Subtrair este resultado da relação onde se encontram todos os saldos.
π saldo (conta) - π conta.saldo (σ conta.saldo < outros.saldo (conta x ρ
outros (conta)))
Operações Fundamentais
� Encontre os nomes de todos os clientes que moram na mesma rua e na mesma cidade que Smith.
� Estratégia:
� Obter a rua e a cidade de Smith
ππππ rua_cliente, cidade_cliente (σσσσ nome_cliente = “Smith” (cliente))
� Comparar as ruas dos demais clientes com a rua de Smith para terminar a consulta.
ππππ cliente.nome-cliente (σσσσ cliente.rua_cliente = Smith.rua ∧ cliente.cidade_cliente = Smith.cidade
(cliente X ρρρρ Smith(rua,cidade) (ππππ rua_cliente, cidade_cliente (σσσσ nome_cliente = “Smith”
(cliente)))))
Operações Adicionais
� Interseção
� Operação binária
� Permite encontrar as dados que pertencem à duas relações.
� Denotada pelo símbolo ∩∩∩∩
� Exemplo: encontre todos os clientes que possuam contas e também possuam empréstimos.
π nome_cliente (devedor) ∩∩∩∩ π nome_cliente (depositante)
Propriedades da União/Interseção/Diferença
� Tanto a União quanto a Interseção são operações comutativas:� R ∪ S = S ∪ R� R ∩ S = S ∩ R
� Tanto União quanto Interseção podem ser tratadas como operaçõesn-árias aplicáveis a qualquer número de relações, porque ambas são operações associativas, isto é:� R ∪ ( S ∪ T ) = (R ∪ S) ∪ T� (R ∩ S) ∩ T = R ∩ ( S ∩ T)
� A operação de Diferença não é comutativa:� R – S <> S - R
Operações Adicionais
� Junção Natural
� Operação binária
� Simplifica as expressões que envolvem um produto cartesiano seguido de uma seleção quanto à igualdade dos atributos comuns.
� Denotada pelo símbolo |x|.
� Encontre os nomes dos clientes que possuam um empréstimo no banco e o total de cada empréstimo.
π nome_cliente, empréstimo.número_empréstimo, total (σσσσ devedor.número_empréstimo =
empréstimo.número_empréstimo (devedor x empréstimo))
π nome_cliente, número_empréstimo, total (devedor |x| empréstimo)
Operações Adicionais
� Exemplos:� Encontre os nomes de todas as agências com
clientes que tenham contas no banco e morem em Harrison.
π nome_agência ( σ cliente_cidade = “Harrison” (cliente |x| conta |x| depositante))
� Encontre todos os clientes que tenham empréstimo e conta no banco.
π nome_cliente (devedor |x| depositante)
Obs: se as duas relações envolvidas em uma junção natural não têm atributos em comum, então a junção natural produz um resultado igual ao produzido pelo produto cartesiano.
Operações Adicionais
� A forma geral da operação de junção de duas relações R(A1, A2, ..., An) e S(B1, B2, ..., Bn) é:
R |X| <condição de junção> S
� Uma operação de junção com tal condição geral é chamada THETA JOIN.
� Tuplas cujos atributos de junção são nulos não aparecem no resultado.
� EQUIJOIN: junção onde somente operadores de comparação “=“ são utilizados.
� NATURAL JOIN: requer que os dois atributos de junção tenha o mesmo nome em ambas relações.