Upload
vandung
View
219
Download
1
Embed Size (px)
Citation preview
Bases de Dados
Junção de relações
2IST ▪ DEI ▪ Bases de Dados
Junção de relações
� Tipicamente usadas na cláusula from
� SQL oferece várias possibilidades
• condição da junção – determina quais são os
atributos a comparar
• tipo de junção – determina como é que os tuplos
excedentes são tratados
3IST ▪ DEI ▪ Bases de Dados
Junção de relações – inner join
select *
from loan inner join borrower on
loan.loan_number = borrower.loan_number
4IST ▪ DEI ▪ Bases de Dados
Junção de relações – left outer join e right outer join
select *
from loan left outer join borrower on
loan.loan_number = borrower.loan_number
5IST ▪ DEI ▪ Bases de Dados
Junção de relações – natural inner join
select *
from loan natural inner join borrower
6IST ▪ DEI ▪ Bases de Dados
Junção de relações – natural outer join
select *
from loan natural right outer join borrower
7IST ▪ DEI ▪ Bases de Dados
Junção de relações – full outer join
select *
from loan full outer join borrower using (loan_number)
8IST ▪ DEI ▪ Bases de Dados
Junção de relações – exemplo
� Nomes dos clientes com conta ou empréstimo (mas
não ambos)
select customer_name
from (depositor natural full outer join borrower)
where account_number is null or loan_number is null
Bases de Dados
Exemplos de consultas SQL
10
Pergunta 1
� Obter os dados de todos os clientes
select * from customer;
11
Pergunta 2
� Nomes e cidades onde residem os clientes com
empréstimo
select distinct b.customer_name, c.customer_city
from borrower as b, customer as c
where b.customer_name = c.customer_name;
12
Pergunta 3
� Nomes e cidades dos clientes com empréstimo na
agência de Perryridge
select distinct c.customer_name, c.customer_city
from customer as c, borrower as b, loan as l
where c.customer_name = b.customer_name
and b.loan_number = l.loan_number
and l.branch_name = 'Perryridge';
13
Pergunta 4
� Números de todas as contas com saldo entre 700 e
900
select account_number
from account
where balance between 700 and 900;
14
Pergunta 5
� Nomes dos clientes que moram em ruas cujo nome
acaba em “Hill”
select customer_name
from customer
where customer_street like '%Hill';
15
Pergunta 6
� Nomes dos clientes com conta e empréstimo na
agência de Perryridge
select distinct b.customer_name
from borrower as b, loan as l
where b.loan_number = l.loan_number
and l.branch_name = 'Perryridge‘
and b.customer_name in
(select d.customer_name
from account as a, depositor as d
where a.account_number = d.account_number
and a.branch_name = 'Perryridge')
16
Pergunta 7
� Nomes dos clientes com contas na mesma agência
onde o cliente Hayes tem conta
select distinct d.customer_name
from depositor as d, account as a
where d.account_number = a.account_number
and a.branch_name in
(select a2.branch_name
from depositor as d2, account as a2
where d2.account_number = a2.account_number
and d2.customer_name = 'Hayes');
17
Pergunta 8
� Nomes das agências com activo superior a todas as
agências da cidade de Brooklyn
select branch_name
from branch
where assets > all
(select assets
from branch
where branch_city = 'Brooklyn');
18
Pergunta 9
� Nomes dos clientes com empréstimo na agência de
Perryridge, por ordem alfabética
select distinct customer_name
from borrower as b, loan as l
where b.loan_number = l.loan_number
and l.branch_name = 'Perryridge'
order by b.customer_name;
19
Pergunta 10
� Nomes das agências e número de clientes com conta
nessa agência
select a.branch_name, count(distinct d.customer_name)
from depositor as d, account as a
where d.account_number = a.account_number
group by a.branch_name;
20
Pergunta 11
� Nomes das agências e respectivo saldo médio, mas só
as agências com saldo médio superior a 700
select branch_name, avg(balance)
from account
group by branch_name
having avg(balance) > 700;
21
Pergunta 12
� Nome da agência (ou agências) com o maior saldo
médio
select branch_name
from account
group by branch_name
having avg(balance) >= all
(select avg(balance)
from account
group by branch_name);
22
Pergunta 13
� Número total de clientes do banco
select count(*) from customer;
23
Pergunta 14
� Saldo médio dos clientes que vivem na cidade de
Harrison e têm pelo menos 2 contas no banco
select avg(balance)
from depositor, account, customer
where depositor.customer_name = customer.customer_name
and depositor.account_number = account.account_number
and customer_city = 'Harrison'
group by depositor.customer_name
having count(distinct account.account_number) >= 2;
24
Pergunta 15
� Quem são os clientes com conta em todas as
agências da cidade de Brooklyn
select distinct customer_name
from depositor as d
where not exists (
(select branch_name
from branch
where branch_city = 'Brooklyn')
except
(select branch_name
from depositor as d2, account as a2
where d2.account_number = a2.account_number
and d2.customer_name = d.customer_name) );