21
©Silberschatz, Korth and Sudarshan (modificad 4.1.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

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

Embed Size (px)

Citation preview

Page 1: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.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.1.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.1.2Database System Concepts

VistasVistas

Em certas circunstâncias, não é desejável que todos os utilizadores possam aceder a todo o modelo lógico (i.e. a todas as relações armazenadas na base de dados)

Considere o caso de um empregado que necessita de saber o número de empréstimo de um cliente, mas que não precisa de saber o montante desse empréstimo. Este empregado deverá ver apenas a relação descrita por

select costumer_name, loan_numberfrom borrower natural inner join loan

Qualquer relação que não pertença ao modelo conceptual mas que se torne visível ao utilizador como uma “relação virtual” é designada por vista.

Page 3: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.3Database System Concepts

VistasVistas

Mecanismo que permite ocultar (esconder) informação a certos utilizadores. Para criar uma vista utilizamos o comando:

create view v as <query expression>

em que: <query expression> é qualquer expressão SQL válida

O nome da vista é v

Em SQL do Oracle pode-se escrever

create or replace view v as <query expression>

para criar ou substituir uma vista já existente, evitando a utilização do comando drop view.

Page 4: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.4Database System Concepts

Definição de vistasDefinição de vistas

Uma definição de uma vista não é o mesmo que a criação duma nova relação a partir da avaliação da sua expressão. Em vez disso, a definição da vista permite guardar a expressão que depois é substituída nas consultas que utilizam a vista.

Uma vista pode ser utilizada na expressão de definição de outra vista

Uma vista v1 depende directamente de uma vista v2 se v2 é utilizada na expressão que define v1

Uma vista v1 depende de uma vista v2 se v1 depende

directamente de v2 ou se existe um caminho de dependências entre v1 e v2

Uma vista v diz-se recursiva se depender dela própria.

Em SQL não são permitidas vistas recursivas!

Page 5: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.5Database System Concepts

Expansão de vistasExpansão de vistas

Forma de atribuir significado a vistas definidas em termos de outras vistas.

Seja a vista v1 definida em termos de uma expressão e1 que pode ela própria conter vistas.

Para expandir as vistas numa expressão repete-se sucessivamente o seguinte passo:

repeatEncontrar uma vista vi em e1

Substituir a vista vi pela expressão que a define until não ocorram mais vistas em e1

Desde que as definições das vistas não sejam recursivas, este ciclo terminará sempre.

Page 6: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.6Database System Concepts

ExemploExemplo

Uma vista contendo todas as agências e respectivos clientescreate view all_customer as (select branch_name, customer_name from depositor natural inner join account)

union (select branch_name, customer_name

from borrower natural inner join loan)

Listar todos os clientes da agência de Perryridge

select customer_namefrom all_customerwhere branch_name = ‘Perryridge’

Page 7: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.7Database System Concepts

Relações DerivadasRelações Derivadas

Determinar o saldo médio das contas em agências cujo saldo médio é superior a $1200.

select branch_name, avg_balancefrom (select branch_name, avg (balance) as

avg_balance from account group by branch_name

)where avg_balance > 1200

Repare que neste caso não foi necessário recorrer à cláusula having, dado que é calculada a relação temporária result na cláusula from, e assim os atributos de result pode ser utilizado directamente numa cláusula where.

Page 8: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.8Database System Concepts

Cláusula WithCláusula With

A cláusula with permite a definição local de vistas relativas a uma consulta, em vez de globalmente. Análogo a procedimentos locais de uma linguagem de programação.

Encontrar as contas de maior saldo

with max_balance(value) as ( select max (balance) from account ) select account_number from account, max_balance where account.balance = max_balance.value

Page 9: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.9Database System Concepts

Exemplo com withExemplo com with

Quais as agências cuja soma de saldos das suas contas é superior à media da soma dos saldos de todas as agências.

with branch_total (branch_name, value) as ( select branch_name, sum (balance) from account group by branch_name) with branch_total_avg(value) as ( select avg (value) from branch_total )select branch_namefrom branch_total, branch_total_avgwhere branch_total.value >= branch_total_avg.value

Page 10: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.10Database System Concepts

Modificação da base de Dados – RemoçãoModificação da base de Dados – Remoção

A remoção de tuplos de uma tabela (ou vista) é feita em SQL com a instrução

delete from <tabela ou vista>where <Condição>

Apagar todas as contas da agência de Perryridge

delete from accountwhere branch-name = ‘Perryridge’

Page 11: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.11Database System Concepts

Exemplo de remoçãoExemplo de remoção

Apagar todas as contas de todas as agências na cidade de Needham.

delete from depositorwhere account-number in (select account-number

from branch natural inner join account where branch-city = ‘Needham’)

delete from accountwhere branch-name in (select branch-name

from branch where branch-city = ‘Needham’)

Page 12: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.12Database System Concepts

Exemplo de remoçãoExemplo de remoção

Remover todas as contas com saldos inferiores aos da média do banco.

delete from accountwhere balance < some (select avg (balance)

from account) Problema: à medida que removemos tuplos de deposit, o saldo

médio altera-se

Solução utilizada no standard SQL:

1. Primeiro, calcula-se o saldo médio (avg) e determinam-se quais os tuplos a apagar

2. Seguidamente, removem-se todos os tuplos identificados anteriormente (sem recalcular avg ou testar novamento os tuplos)

Page 13: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.13Database System Concepts

Modificação da base de dados – InserçãoModificação da base de dados – Inserção

A inserção de tuplos numa tabela (ou vista) é feita em SQL com a instrução

insert into <tabela ou vista>values <Conjunto de tuplos>

Adicionar um novo tuplo a account

insert into accountvalues (‘A-9732’, ‘Perryridge’,1200)

ou equivalentemente

insert into account (branch-name, balance, account-number)values (‘Perryridge’, 1200, ‘A-9732’)

Adicionar um novo tuplo a account em que balance é null

insert into accountvalues (‘A-777’,‘Perryridge’, null)

Page 14: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.14Database System Concepts

Exemplo de InserçãoExemplo de Inserção

Dar como bónus a todos os mutuários da agência de Perryride, uma conta de poupança de $200. O número do empréstimo servirá de número de conta de poupança

insert into accountselect loan-number, branch-name, 200from loanwhere branch-name = ‘Perryridge’

insert into depositorselect customer-name, loan-numberfrom loan natural inner join borrowerwhere branch-name = ‘Perryridge’

A instrução select-from-where é avaliada previamente à inserção de tuplos na relação (caso contrário consultas como insert into table1 select * from table1causariam problemas)

Page 15: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.15Database System Concepts

Modificação da base de dados – ActualizaçãoModificação da base de dados – Actualização

A actualização de tuplos duma tabela (ou vista) é feita em SQL com a instrução

update <tabela ou vista>set <Atributo> = <Expressão>, <Atributo> =

<Expressão>, ... where <Condição>

Pagar juros de 1% a todas as contas da agência Perryride.

update accountset balance = balance 1.01where branch_name = ‘Perryride’

Page 16: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.16Database System Concepts

Modificação da base de dados – ActualizaçãoModificação da base de dados – Actualização

Pagar juros de 6% a todas as contas com saldos superiores a $10,000, e juros de 5% às restantes contas. Escrever duas instruções de update:

update accountset balance = balance 1.06where balance > 10000

update accountset balance = balance 1.05where balance 10000

A ordem é importante

Pode ser efectuado de maneira mais “limpa” recorrendo à instrução case

Page 17: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.17Database System Concepts

Instrução Case para Actualizações Instrução Case para Actualizações condicionaiscondicionais

Pagar juros de 6% a todas as contas com saldos superiores a $10,000, e juros de 5% às restantes contas.

update account set balance = case when balance <= 10000 then balance *1.05 else balance * 1.06 end

Page 18: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.18Database System Concepts

Actualização de uma vistaActualização de uma vista Modificações nas bases de dados através de vistas devem ser

traduzidas para modificações das verdadeiras relações presentes na base de dados. E.g com uma vista com a informação sobre empréstimos,

escondendo o atributo amount

create view branch-loan asselect branch-name, loan-numberfrom loan

a adição de um novo tuplo a branch-loan

insert into branch-loanvalues (‘Perryridge’, ‘L-307’)

deve ser traduzida na inserção na relação loan do tuplo

(‘L-307’, ‘Perryridge’, null)

Page 19: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.19Database System Concepts

Actualização de uma vista (cont)Actualização de uma vista (cont) Algumas actualizações através de vistas são impossíveis de traduzir

para actualizações das relações da base de dados: E.g considere a vista

create view v1 asselect *from loanwhere branch-name = ‘Perryridge’

A seguinte adição é impossível

insert into v1values (‘L-307’,‘Downtown’,1000)

Outras não têm tradução única: E.g considere a vista

create view all_costumers as(select * from depositor) union (select * from borrower)

Toda a adição em all_costumers não tem tradução única: Deve introduzir-se em depositor ou em borrower???

Face a isto, o SQL opta por restringir aquilo que é permitido. A maioria das implementações SQL permite apenas a actualização de vistas simples (sem agregações) definidas sobre uma única relação.

Page 20: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.20Database System Concepts

TransacçõesTransacções

Uma transacção é uma sequência de instruções de consulta e de actualização executadas numa unidade singular. As transacções são iniciadas implicitamente e terminadas com

commit work: torna permanentes todas as actualizações efectuadas à base de dados, ou

rollback work: desfaz todas as alterações efectuadas pela transacção.

Exemplo motivador A transferência de dinheiro de uma conta para outra requer duas operações:

debitar uma conta e creditar outra Se um dos passos anteriores sucede e o outro falha, a base de dados fica

num estado inconsistente Portanto, ou ambos os passos devem suceder ou ambos falhar

Se qualquer operação numa transacção falha, todo o trabalho efectuado na transacção pode ser descartado através de rollback work.

No caso de falhas no sistema, o rollback das transacções incompletas é feito automaticamente,

Page 21: ©Silberschatz, Korth and Sudarshan (modificado)4.1.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.1.21Database System Concepts

Transacções (cont.)Transacções (cont.)

Na maioria dos sistemas de bases de dados, cada instrução SQL que é executado com sucesso é “committed” automaticamente. Cada transacção é assim constituída por apenas uma instrução.

Normalmente, o “commit” automático pode ser desligado, permitindo transacções com múltiplas instruções.

Outra opção em SQL1999: colocar as instruções dentro do bloco begin atomic … end

Em Oracle recorre-se à instrução SET TRANSACTION seguido de commit.