©silberschatz, korth and sudarshan (modificado)4.2.1database system concepts capítulo 4: sql...
TRANSCRIPT
©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts
Capítulo 4: SQLCapítulo 4: SQL
Estrutura básica Operações com conjuntos Funções de agregação Valores nulos Junções Subconsultas embebidas Relações derivadas Vistas Modificação da Base de Dados Embedded SQL Linguagem de Definição de Dados
©Silberschatz, Korth and Sudarshan (modificado)4.2.2Database System Concepts
Valores NulosValores Nulos Os tuplos podem conter valores nulos, denotado por null,
nalguns dos seus atributos. null significa um valor desconhecido ou que não existe. O predicado is null pode ser utilizado para testar a existência
de valores nulos. E.g. mostrar todos os números de empréstimos com um valor nulo
na coluna amount.
select loan_numberfrom loanwhere amount is null
O resultado de uma expressão aritmética com null é null E.g. 5 + null devolve null
Contudo, as funções de agregação ignoram os nulos A seguir será analisado este assunto mais detalhadamente
©Silberschatz, Korth and Sudarshan (modificado)4.2.3Database System Concepts
Valores Nulos e Lógica TrivalenteValores Nulos e Lógica Trivalente Qualquer comparação com null retorna unknown
E.g. 5 < null ou null <> null ou null = null Lógica trivalente usando o valor lógico unknown:
OR: (unknown or true) = true, (unknown or false) = unknown (unknown or unknown) = unknown
AND: (true and unknown) = unknown, (false and unknown) = false, (unknown and unknown) = unknown
NOT: (not unknown) = unknown “P is unknown” é verdade se o valor de P é unknown
Resultado da condição da cláusula where é tratado como false quando o seu valor é unknown
©Silberschatz, Korth and Sudarshan (modificado)4.2.4Database System Concepts
Valores Nulos e AgregadosValores Nulos e Agregados Calcule o total de todos os montantes dos empréstimos
select sum (amount)from loan
A instrução acima ignora montantes nulos Resultado é null se não existir nenhum montante não-nulo
Todas as funções de agregação excepto count(*) ignoram tuplos com valores nulos nos atributos agregados.
©Silberschatz, Korth and Sudarshan (modificado)4.2.5Database System Concepts
Operações de JunçãoOperações de Junção As operações de junção retornam uma relação como resultado
da combinação de duas outras relações. Estas operações adicionais são utilizadas habitualmente em
subconsultas na cláusula from Condição de junção – define quais os tuplos que são
combinados nas duas relações, assim como quais os atributos que aparecem no resultado da junção.
Tipo de junção – define como tratar os tuplos que não estão relacionados entre si (basedados na condição de junção).
Tipos de Junçãoinner joinleft outer joinright outer joinfull outer join
Condições de Junçãonaturalon <predicate>using (A1, A2, ..., An)
©Silberschatz, Korth and Sudarshan (modificado)4.2.6Database System Concepts
Junção versus Produto CartesianoJunção versus Produto Cartesiano Listar o nome, número de empréstimo e montante de todos os
clientes que efectuaram um empréstimo na agência de Perryridge.
select borrower.*, amountfrom borrower, loanwhere borrower.loan_number = loan.loan_number and
branch_name = ‘Perryridge’ Versus
select borrower.*, amountfrom borrower natural inner join loanwhere branch_name = ‘Perryridge’
A última separa claramente onde ir buscar os dados de onde se colocam condições “de filtragem” (selecção) Esta separação não só torna a leitura mais fácil, como pode ser
aproveitada para implementações.
©Silberschatz, Korth and Sudarshan (modificado)4.2.7Database System Concepts
Relações de ExemploRelações de Exemplo Relação loan
amount
3000
4000
1700
Relação borrower
customer_name loan_number
JonesSmithHayes
L-170
L-230
L-155
branch_name
DowntownRedwoodPerryridge
loan_number
L-170 L-230
L-260
©Silberschatz, Korth and Sudarshan (modificado)4.2.8Database System Concepts
Exemplos Exemplos
loan inner join borrower onloan.loan_number = borrower.loan_number
branch_name amount
DowntownRedwood
3000
4000
customer_name loan_number
JonesSmith
L-170
L-230
branch_name amount
DowntownRedwoodPerryridge
3000
4000
1700
customer_name loan_number
JonesSmithnull
L-170
L-230
null
loan left outer join borrower onloan.loan_number = borrower.loan_number
loan_number
L-170
L-230
loan_number
L-170
L-230
L-260
©Silberschatz, Korth and Sudarshan (modificado)4.2.9Database System Concepts
ExemplosExemplos
loan natural inner join borrower
branch_name amount
DowntownRedwood
3000
4000
customer_name
JonesSmith
loan natural right outer join borrower
branch_name amount
DowntownRedwoodnull
3000
4000
null
customer_name
JonesSmithHayes
loan_number
L-170
L-230
loan_number
L-170
L-230
L-155
©Silberschatz, Korth and Sudarshan (modificado)4.2.10Database System Concepts
ExemplosExemplos loan full outer join borrower using (loan_number)
branch_name amount
DowntownRedwoodPerryridgenull
3000
4000
1700
null
customer_name
JonesSmithnullHayes
Listar todos os clientes que têm uma conta ou um empréstimo no banco (mas não ambos!)
loan_number
L-170
L-230
L-260
L-155
select customer_namefrom depositor natural full outer join borrowerwhere account_number is null or loan_number is
null
©Silberschatz, Korth and Sudarshan (modificado)4.2.11Database System Concepts
Subconsultas imbricadasSubconsultas imbricadas SQL disponibiliza um mecanismo para imbricar consultas umas
dentro de outras. Uma subconsulta é uma expressão select-from-where que se
encontra dentro de uma outra (sub)consulta. Subconsultas na clausula from são entendidas como cálculo de
relações auxiliares. As subconsultas na clausula where são utilizadas habitualmente
para efectuar testes de pertença a conjuntos, comparações entre conjuntos e calcular a cardinalidade de conjuntos.
©Silberschatz, Korth and Sudarshan (modificado)4.2.12Database System Concepts
Consulta de exemploConsulta de exemplo Listar todos os clientes que têm contas e empréstimos no
banco.
select distinct customer_namefrom borrowerwhere customer_name in (select customer_name
from depositor) Encontrar todos os clientes que têm empréstimos mas não
possuem contas no banco
select distinct customer_namefrom borrowerwhere customer_name not in (select customer_name
from depositor)
©Silberschatz, Korth and Sudarshan (modificado)4.2.13Database System Concepts
Consulta de exemploConsulta de exemplo Listar todos os clientes que têm uma conta e empréstimos na
agência de Perryride
select distinct customer_namefrom borrower natural inner join loanwhere branch_name = “Perryridge” and
(branch_name, customer_name) in(select branch_name, customer_namefrom depositor natural inner join account)
Nota: A consulta acima pode ser escrita de uma maneira muito mais simples. A formulação utilizada serve apenas para ilustrar as possibilidades da linguagem SQL.
©Silberschatz, Korth and Sudarshan (modificado)4.2.14Database System Concepts
Comparação de conjuntosComparação de conjuntos Apresentar todas as agências que têm activos superiores aos de
alguma agência localizada em Brooklyn.
select distinct T.branch_namefrom branch as T, branch as Swhere T.assets > S.assets and S.branch_city = ‘Brooklyn’
A mesma consulta recorrendo à cláusula > someselect branch_namefrom branchwhere assets > some (select assets from branch where branch_city = ‘Brooklyn’)
©Silberschatz, Korth and Sudarshan (modificado)4.2.15Database System Concepts
Definição da cláusula SomeDefinição da cláusula Some F <comp> some r t r : (F <comp> t)
em que <comp> pode ser :
056
(5< some ) = true
050
) = false
5
05(5 some ) = true (pois 0 5)
(ler: 5 menor que algum tuplo na relação )
(5< some
) = true(5 = some
(= some) inNo entanto, ( some) not in
©Silberschatz, Korth and Sudarshan (modificado)4.2.16Database System Concepts
Cláusula allCláusula all Listar os nomes das agências com activos superiores aos de
todas as agências localizadas em Brooklyn.select branch_namefrom branchwhere assets > all(select assetsfrom branchwhere branch_city = ‘Brooklyn’)
Sem o all(select branch_name from branch)
except(select branch_name from branch T,branch S where S.branch_city = ‘Brooklyn’ and T.assets <
S.assets)
©Silberschatz, Korth and Sudarshan (modificado)4.2.17Database System Concepts
Definição da cláusula allDefinição da cláusula all
F <comp> all r t r : (F <comp> t)
056
(5< all ) = false
6104
) = true
5
46(5 all ) = true (dado que 5 4 e 5 6)
(5< all
) = false(5 = all
( all) not inContudo, (= all) in
©Silberschatz, Korth and Sudarshan (modificado)4.2.18Database System Concepts
Teste de Relações VaziasTeste de Relações Vazias A construção exists devolve o valor true se a subconsulta é não
vazia. exists r r Ø not exists r r = Ø
©Silberschatz, Korth and Sudarshan (modificado)4.2.19Database System Concepts
Consulta de exemploConsulta de exemplo Listar todos os clientes que têm uma conta em todas as agências de Brooklyn.
select distinct S.customer_namefrom depositor as Swhere not exists ((select branch_namefrom branchwhere branch_city = ‘Brooklyn’) except(select account.branch_name from depositor as T natural inner join account where S.customer_name = T.customer_name) )
Notas: Repare que X – Y = Ø X Y Não se pode escrever esta consulta com combinações de = all ou de suas
variantes. Em álgebra relacional esta consulta escrever-se-ia com uma divisão:
customer_name,branch_name(depositor account) branch_name(branch_city=‘Brooklyn’(branch))
©Silberschatz, Korth and Sudarshan (modificado)4.2.20Database System Concepts
Cláusula containsCláusula contains Listar todos os clientes que têm uma conta em todas as
agências de Brooklyn.
select distinct S.customer_namefrom depositor as Swhere
(select account.branch_name from depositor as T natural inner join account where S.customer_name = T.customer_name)
contains(select branch_name from branch where branch_city = ‘Brooklyn’)
Nota: Não existe no Oracle, o que não é grave pois:
X Y X – Y = Ø
©Silberschatz, Korth and Sudarshan (modificado)4.2.21Database System Concepts
Divisão em SQLDivisão em SQL
r s = { t | t R-S(r) u s ( t(u) r ) }
De forma equivalente: Seja q = r s Então q é a maior relação satisfazendo q x s r
Seja r(A,B) e s(B). Em SQL, r s é obtido por:select distinct X.Afrom r as Xwhere (select Y.B from r as Y where X.A = Y.A) contains
(select B from s)
©Silberschatz, Korth and Sudarshan (modificado)4.2.22Database System Concepts
Testar ausência de tuplos duplicadosTestar ausência de tuplos duplicados
A construção unique verifica se o resultado de uma subconsulta possui tuplos duplicados.
Encontrar todos os clientes que têm só uma conta na agência de Perryridge.
select T.customer_name from depositor as T where unique (
select R.customer_name from account natural inner join depositor as R where T.customer_name = R.customer_name and
account.branch_name = ‘Perryridge’) Esta construção não está disponível no Oracle
©Silberschatz, Korth and Sudarshan (modificado)4.2.23Database System Concepts
Consulta de exemploConsulta de exemplo Listar todos os clientes que têm pelo menos duas contas na
agência de Perryridge.
select distinct T.customer_namefrom depositor Twhere not unique (
select R.customer_namefrom account natural inner join depositor as Rwhere T.customer_name = R.customer_name and
account.branch_name = ‘Perryridge’)