©silberschatz, korth and sudarshan (modificado)4.2.1database system concepts capítulo 4: sql...

23
©Silberschatz, Korth and Sudarshan (modificad 4.2.1 Database System Concepts Capítulo 4: SQL Capí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

Upload: diogo-reveles

Post on 07-Apr-2016

239 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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

Page 2: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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

Page 3: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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

Page 4: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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.

Page 5: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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)

Page 6: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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.

Page 7: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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

Page 8: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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

Page 9: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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

Page 10: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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

Page 11: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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.

Page 12: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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)

Page 13: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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.

Page 14: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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’)

Page 15: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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

Page 16: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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)

Page 17: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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

Page 18: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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 = Ø

Page 19: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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))

Page 20: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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 = Ø

Page 21: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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)

Page 22: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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

Page 23: ©Silberschatz, Korth and Sudarshan (modificado)4.2.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação

©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’)