Académique Documents
Professionnel Documents
Culture Documents
1!
Operaes de Juno!
As operaes de juno retornam uma relao como resultado
Condies de Juno"
inner join!
left outer join!
right outer join!
full outer join!
natural!
on <predicate>"
using (A1, A2, ..., An)"
!
2!
Operaes de Juno!
Tipos de Juno"
Condies de Juno"
inner join!
left outer join!
right outer join!
full outer join!
natural!
on <predicate>"
using (A1, A2, ..., An)"
!
3!
"
"select *
"from borrower natural inner join loan
"where branch_name = Perryridge"
A ltima separa claramente onde se coloca a origem dos dados de
onde se colocam as condies de filtragem (seleco)"
Esta separao no s torna a leitura mais fcil, como pode ser aproveitada
para implementaes."
Na ltima consulta no se pode colocar borrower.* aps o select pois
deixa de ser possvel utilizar o nome da tabela nas colunas usadas para
fazer a juno natural (isto , as comuns a ambas as tabelas)"
"
4!
Relaes de Exemplo!
Relao loan"
loan_number"
branch_name"
amount"
L-170 "
Downtown"
3000"
L-230"
Redwood"
4000"
L-260"
Perryridge"
1700"
Relao borrower"
customer_name" loan_number "
Jones"
L-170"
Smith"
L-230"
Hayes"
L-155
5!
loan_number" branch_name"
amount"
L-170 "
Downtown"
3000"
L-230"
Redwood"
Perryridge"
4000"
L-260"
customer_name"
Exemplos!
1700"
loan_number "
Jones"
L-170"
Smith"
L-230"
Hayes"
L-155
loan.loan_number = borrower.loan_number"
l.loan_number "
branch_name"
amount"
L-170"
Downtown"
3000"
Jones"
L-170"
L-230"
Redwood"
4000"
Smith"
L-230"
amount"
L-170"
Downtown"
3000"
Jones"
L-170"
L-230"
Redwood"
4000"
Smith"
L-230"
L-260
Perryridge"
1700"
null"
6!
null
loan_number" branch_name"
amount"
L-170 "
Downtown"
3000"
L-230"
Redwood"
Perryridge"
4000"
L-260"
customer_name"
Exemplos!
1700"
loan_number "
Jones"
L-170"
Smith"
L-230"
Hayes"
L-155
branch_name"
amount"
customer_name"
L-170"
Downtown"
3000"
Jones"
L-230"
Redwood"
4000"
Smith"
branch_name"
amount"
customer_name"
L-170"
Downtown"
3000"
Jones"
L-230"
Redwood"
4000"
Smith"
L-155
null "
null"
Hayes"
7!
loan_number" branch_name"
amount"
L-170 "
Downtown"
3000"
L-230"
Redwood"
Perryridge"
4000"
L-260"
customer_name"
Exemplos!
1700"
loan_number "
Jones"
L-170"
Smith"
L-230"
Hayes"
L-155
branch_name"
amount"
customer_name"
L-170"
Downtown"
3000"
Jones"
L-230"
Redwood"
4000"
Smith"
L-260"
Perryridge"
1700"
null"
L-155
null"
null"
8!
Hayes"
nome, cod_curso)
!
A interrogao
equivalente a
alunos.num_aluno
from cursos, alunos
where cursos.cod_curso = alunos.cod_curso and cursos.nome = alunos.nome
"
Enquanto que a interrogao
corresponde a
9!
10!
Exemplos!
Listar todos os clientes que tm uma conta e nenhum emprstimo"
!
!select customer_name
!from depositor left outer join borrower using(customer_name)
!where loan_number is null!
!select customer_name
!from depositor natural full outer join borrower
!where account_number is null or loan_number is null!
11!
Vistas!
Em certas circunstncias, no desejvel que todos os
12!
Vistas!
" Mesmo que no seja por razes de segurana, pode ser til apresentar
13!
Vistas!
Mecanismo que permite apresentar um modelo diferente do
"em que:"
<query expression> qualquer expresso SQL vlida"
O nome da vista v"
Em SQL do Oracle pode-se escrever"
!
!create or replace view v as <query expression>
14!
Exemplo!
Uma vista contendo todas as agncias e respectivos clientes"
"
"select customer_name
"from all_customer
"where branch_name = Perryridge"
15!
Definio de vistas!
Uma vista pode ser utilizada na expresso de definio de outra
"
"
entre v1 e v2 "
Uma vista v diz-se recursiva se depender dela prpria."
Em SQL no so permitidas vistas recursivas!"
16!
Expanso de vistas!
Forma de atribuir significado a vistas definidas em termos de
outras vistas."
Seja a vista v1 definida em termos de uma expresso e1 que
17!
! !select *
" "from perryridge_customer "
"
"
"
"where customer_name = John"
... inicialmente expandida para:"
! ! !select *
" "from (select customer_name
" "
"from all_customer
"
"
"
" "
"where branch_name = Perryridge)"
"
"where customer_name = John"
... que por sua vez expandida para:"
! ! !select *
" "from (select customer_name
" "
"from ( "(select branch_name, customer_name
" "
"
"from depositor natural inner join account)"
" " "
"
"union
! !
!
!(select branch_name, customer_name
" "
"
"from borrower natural inner join loan))
" "
"
"where branch_name = Perryridge)"
" "
"where customer_name = John"
18!
""
"
""
"
"
com a instruo"
"
!
"
19!
Exemplo de remoo!
Apagar todas as contas de todas as agncias na cidade de
Needham."
"delete from depositor
where account-number in
(select account-number
"
"from branch natural inner join account
"
"where branch-city = Needham)"
!delete from account
where branch-name in (select branch-name
"
"
" from branch
"
"
" where branch-city = Needham)
"
20!
Exemplo de remoo!
Remover todas as contas com saldos inferiores aos da mdia do
banco."
"
altera-se"
21!
instruo"
"
"insert into <tabela ou vista>"
!
!values <Conjunto de tuplos>"
ou"
"
"insert into <tabela ou vista>"
!
!select ..."
Adicionar um novo tuplo a account"
"
"insert into account
"
"values (A-9732, Perryridge,1200)
ou equivalentemente
22!
Exemplo de Insero!
Dar como bnus a todos os muturios da agncia de Perryride,
23!
com a instruo"
"
"update <tabela ou vista>"
!
!set <Atributo> = <Expresso>, <Atributo> =
<Expresso>, ... "
"
"where <Condio>"
Pagar juros de 1% a todas as contas da agncia Perryride."
"
"update account
"set balance = balance * 1.01
"where branch_name = Perryride"
"
24!
"update account
"set balance = balance * 1.06
"where balance > 10000"
"
"update account
"set balance = balance * 1.05
"where balance 10000"
"
25!
26!
"
"
"
27!
28!
!
"
!union "
"
"
"(select * from borrower)"
"
"
"
29!
Actualizao de vistas!
Uma view em SQL actualizvel (updatable) se todas as seguintes
condies se verificam:"
A clasula from s contm uma relao da base de dados;"
A clasula select apenas contm nomes de atributos da relao, no
contendo expresses, agregados, ou especificao de distinct;"
Qualquer atributo que no aparece na clasula select deve poder tomar o
valor null;"
A consulta no contm nenhuma clasula group by nem having."
A view "
"
!
"
!
!select acount_number,branch_name,balance
"from account"
!where branch-name = Downtown"
30!
Actualizao de vistas!
Em Oracle 11g possvel impedir as situaes anteriores por
ONLY"
"
31!
Recurso em SQL!
SQL:1999 permite definio recursiva de vistas"
Exemplo: encontrar todos os pares empregado-chefe, onde o
32!
O poder da recurso!
As vistas recursivas permitem a escrita de consultas, tais como
33!
empl (2 iter)!
!
"
!
"
"
empl (inicial)!
manager!
!
emp_name
"
man_name"
Antnio!
Bruno!
Bruno!
Eduardo!
Carla!
Duarte!
Duarte!
Joo!
Eduardo!
Joo!
Joo!
Lara!
Rita!
Lara!
empl (3 iter)!
emp_name"
man_name"
Ponto Fixo"
empl (4 iter)!
empl (5 iter)!
emp_name"
man_name"
emp_name"
man_name"
emp_name"
man_name"
emp_name"
man_name"
emp_name"
man_name"
Antnio!
Bruno!
Antnio!
Bruno!
Antnio!
Bruno!
Antnio!
Bruno!
Antnio!
Bruno!
Bruno!
Eduardo!
Bruno!
Eduardo!
Bruno!
Eduardo!
Bruno!
Eduardo!
Bruno!
Eduardo!
Carla!
Duarte!
Carla!
Duarte!
Carla!
Duarte!
Carla!
Duarte!
Carla!
Duarte!
Duarte!
Joo!
Duarte!
Joo!
Duarte!
Joo!
Duarte!
Joo!
Duarte!
Joo!
Eduardo!
Joo!
Eduardo!
Joo!
Eduardo!
Joo!
Eduardo!
Joo!
Eduardo!
Joo!
Joo!
Lara!
Joo!
Lara!
Joo!
Lara!
Joo!
Lara!
Joo!
Lara!
Rita!
Lara!
Rita!
Lara!
Rita!
Lara!
Rita!
Lara!
Rita!
Lara!
Antnio!
Eduardo!
Antnio!
Eduardo!
Antnio!
Eduardo!
Antnio!
Eduardo!
Bruno!
Joo!
Bruno!
Joo!
Bruno!
Joo!
Bruno!
Joo!
Carla!
Joo!
Carla!
Joo!
Carla!
Joo!
Carla!
Joo!
Duarte!
Lara!
Duarte!
Lara!
Duarte!
Lara!
Duarte!
Lara!
Eduardo!
Lara!
Eduardo!
Lara!
Eduardo!
Lara!
Eduardo!
Lara!
Antnio!
Joo!
Antnio!
Joo!
Antnio!
Joo!
Bruno!
Lara!
Bruno!
Lara!
Bruno!
Lara!
Carla!
Lara!
Carla!
Lara!
Carla!
Lara!
Antnio!
Lara!
Antnio!
Lara!
34!
manager"
1st iteration!
2nd iteration!
3rd iteration!
4th iteration!
5th iteration!
emp_name"
man_name"
Antnio!
Bruno!
Bruno!
Eduardo!
Carla!
Duarte!
Duarte!
Joo!
Eduardo!
Joo!
Joo!
Lara!
Rita!
Lara!
Antnio!
Eduardo!
Bruno!
Joo!
Carla!
Joo!
emp_name"
man_name"
Antnio!
Bruno!
Bruno!
Eduardo!
Duarte!
Lara!
Carla!
Duarte!
Eduardo!
Lara!
Duarte!
Joo!
Antnio!
Joo!
Eduardo!
Joo!
Bruno!
Lara!
Joo!
Lara!
Carla!
Lara!
Rita!
Lara!
Antnio!
Lara!
35!
Embedded SQL!
SQL fornece uma linguagem declarativa para manipulao de bases de
36!
Embedded SQL!
Permite acesso a bases e dados SQL, via outra linguagens de
programao."
Toda a parte de acesso e manipulao da base de dados feito
embutido"
" "EXEC SQL <embedded SQL statement > END-EXEC"
"Nota: Este formato varia de linguagem para linguagem. E.g. em
C usa-se ; em vez do END-EXEC. Em Java usa-se # SQL
{ . } ; "
37!
Cursores!
Para executar um comando SQL numa linguagem host
precedidas de :"
E.g. Encontrar os nome e cidades de clientes cujo saldo seja
superior a amount"
EXEC SQL"
"declare c cursor for
select customer-name, customer-city
from account natural inner join depositor"
"
"
" natural inner join customer
where account.balance > :amount"
END-EXEC"
38!
"
linguagem host."
"
39!
40!
Dynamic SQL!
Permite construir e (mandar) executar comandos SQL, em run-
time."
E.g. (chamando dynamic SQL, dentro de um programa em C)
41!
ODBC!
Standard Open DataBase Connectivity(ODBC)"
ODBC"
42!
ODBC (Cont.)!
Um sistema de bases de dados que suporte ODBC tem uma
driver library que tem que ser ligada com o programa cliente."
Quando o cliente faz uma chamada API ODBC, o cdigo da
um connection handle."
Para abrir uma ligao a uma BD, usa-se SQLConnect(). Os
parmetros so:"
connection handle,"
servidor onde ligar"
username, "
password "
43!
"{"
RETCODE error;"
HENV env; /* environment */ "
HDBC conn; /* database connection */ "
SQLAllocEnv(&env);"
SQLAllocConnect(env, &conn);"
SQLConnect(conn, "aura.bell-labs.com", SQL_NTS, "avi", SQL_NTS,
"avipasswd", SQL_NTS); "
{ . Manipulao propriamente dita }"
"
SQLDisconnect(conn); "
SQLFreeConnect(conn); "
SQLFreeEnv(env); "
}"
44!
ODBC (Cont.)!
Os programas enviam comandos SQL base de dados usando
SQLExecDirect"
Os tuplos resultado so obtidos via SQLFetch()"
SQLBindCol() liga variveis da linguagem a atributos do
resultado do SQL"
Quando um tuplo obtido com um fetch, os valores dos seus
atributos so automaticamente guardados nas ditas variveis."
"
45!
46!
JDBC!
JDBC uma API Java para comunicar com sistemas de bases
de dados"
O modelo de comunicao com a base de dados:"
47!
{"
try { "
Class.forName ("oracle.jdbc.driver.OracleDriver"); "
Connection conn =
DriverManager.getConnection( "jdbc:oracle:thin:@aura.belllabs.com:2000:bankdb", userid, passwd); "
Statement stmt = conn.createStatement(); "
Do Actual Work ."
stmt.close();
""
conn.close();
""
}" ""
catch (SQLException sqle) { "
""
System.out.println("SQLException : " + sqle); "
""
}" ""
}"
48!
49!
Linguagens proprietrias!
A maior parte dos sistemas comerciais incluem linguagens
50!
PL/SQL!
Extenso procedimental ao SQL, do Oracle."
Suporta:"
51!
Construtores procedimentais!
O SQL:1999 suporta uma grande variedade de construtores
procedimentais"
!
!
!
!
!
!repeat!
set n = n 1;"
!
!until n = 0;"
!
!end repeat!
Em Oracle, em vez de set var = usa-se var :=!
52!
53!
E.g. Soma dos saldos por categorias de contas (com saldo <1000, entre
1000 e 5000, > 5000)"
!
!if r.balance < 1000
" then set l = l + r.balance
"elseif r.balance =< 5000
" then set m = m + r.balance
"else set h = h + r.balance
"end if !
Assinalar condies de excepo e erros, e declarao de tratamento
de excepes"
!
!declare out_of_stock condition;
!declare exit handler for out_of_stock ;
"begin
!
.. signal out-of-stock;
"end!
Neste exemplo o tratamento da excepo exit sai do bloco beginend"
No Oracle em vez de signal usa-se raise!
54!
Funes e Procedimentos!
O SQL:1999 suporta funes e procedimentos"
55!
Funes SQL!
Definir uma funo que, dado o nome de um cliente, devolva o nmero
"
56!
resultado. "
Examplo: Devolver todas as contas de um dado cliente"
"create function accounts_of (customer_name char(20)"
"
"returns table ( "account_number char(10),
"
"
"branch_name char(15)
"
"
"balance numeric(12,2)))"
"return table
"(select account_number, branch_name, balance
" from account A
" where exists (
" select *
" from depositor D
" where D.customer_name=accounts_of.customer_name
"
and D.account_number = A.account_number ))"
Utilizao"
"
"select *
!from table (accounts_of (Smith))"
57!
O SQL:1999 permite que haja mais que uma funo ou procedimento com o
58!
seguinte forma:"
"create procedure account_count_proc(in customer_name
varchar(20),out count integer)
language C
external name /usr/avi/bin/account_count_proc
59!
60!
"
61!