Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Estrutura básica
Operações com conjuntos
Funções de agregação
Valores nulos
Junções
Subconsultas aninhadas
Relações derivadas
Visões
Modificação da Base de Dados
1 2
Estrutura Bá
Básica A clá
cláusula select
A cláusula select corresponde à operação de projeção da álgebra
relacional. É utilizada para listar os atributos pretendidos no resultado
SQL é baseada em operações de conjuntos e de álgebra da consulta.
relacional com algumas modificações e extensões
Listar os nomes de todas as agências na relação loan
Uma consulta SQL básica tem a forma: select branch_name
select A1, A2, ..., An from loan
from r1, r2, ..., rm Na sintaxe de álgebra relacional a consulta seria:
where P ∏branch-name(loan)
Ais representam atributos
Um asterisco na cláusula select denota “todos os atributos”
ris representam relações
select *
P é um predicado. from loan
A consulta é (quase) equivalente à expressão de álgebra NOTA: O SQL não permite o carácter ‘-’ nos nomes, portanto deverá
relacional: utilizar, por exemplo, branch_name em vez de branch-name num
sistema existente.
∏A1, A2, ..., An(σP (r1 x r2 x ... x rm)) NOTA: As maiúsculas e minúsculas não são distinguidas em nomes da
linguagem SQL.
O resultado de uma consulta SQL é uma relação.
Poderá utilizar maiúsculas nos lugares onde utilizamos negrito.
3 4
A clá
cláusula select (cont.) A clá
cláusula select (cont.)
O SQL permite valores duplicados (linhas com mesmos valores) A cláusula select pode conter expressões aritméticas
nas relações e nos resultados de consultas. envolvendo as operações, +, –, ∗, e /, com argumentos
Para forçar a eliminação de valores duplicados, inserir a palavra- constantes ou atributos de tuplas (como na projeção
chave distinct após select. generalizada). Dependendo das implementações, encontram-se
Apresentar os nomes de todas as agências onde foram normalmente definidas uma biblioteca de funções.
efetuados empréstimos, sem repetições
select distinct branch_name A consulta:
from loan select loan_number, branch_name, amount ∗ 100
A palavra-chave all indica que os valores duplicados não devem from loan
ser removidos. devolve uma relação idêntica à relação loan, exceto que o
select all branch_name atributo amount é multiplicado por 100 (como na projeção
from loan generalizada).
5 6
A clá
cláusula where A clá
cláusula where (cont.)
A cláusula where corresponde ao predicado de seleção da A linguagem SQL possui um operador de comparação between
álgebra relacional. É formada por um predicado envolvendo para especificar condições em que um valor deve estar contido
atributos de relações que aparecem na cláusula from. num intervalo de valores (incluindo os seus extremos).
Para encontrar os números de contas da agência da Caparica
com saldos superiores a 100. Apresentar os números dos empréstimos de montantes entre
select account_number $90,000 e $100,000 (ou seja, ≥$90,000 e ≤$100,000)
from account select loan_number
where branch_name = ‘Caparica’ and balance > 100 from loan
Os resultados de comparações podem ser combinados por where amount between 90000 and 100000
intermédio dos conetivos lógicos and, or, e not.
Podem-se aplicar comparações ao resultado de expressões Para negar a condição pode-se colocar o conectivo not antes de
aritméticas. between.
7 8
Operaç
Operações com Cadeias de Caracteres A clá
cláusula from
O SQL inclui um mecanismo de concordância de padrões para A cláusula from corresponde à operação de produto cartesiano da
comparações envolvendo cadeias de caracteres. Os padrões álgebra relacional. Indica as relações a consultar na avaliação da
são descritos recorrendo a dois caracteres especiais: expressão.
percentagem(%). O carácter % concorda com qualquer subcadeia. Encontrar o produto cartesiano borrower x loan
sublinhado (_). O carácter _ concorda com qualquer carácter. select ∗
Listar todos os clientes cuja rua inclua a subcadeia “Main”. from borrower, loan
9 10
A operaç
operação de Renomeaç
Renomeação Variá
Variáveis de tupla
A linguagem SQL permite a renomeação de relações e atributos As variáveis de tupla são definidas na cláusula from por
recorrendo à cláusula as : intermédio da cláusula as opcional.
old_name as new_name Apresente os nomes de todos os clientes e respectivos números
Listar o nome, número de empréstimo e montante de todos os dos empréstimos que possuam um empréstimo em alguma
clientes, renomeando o nome da coluna loan_number para agência.
loan_id. select customer_name, T.loan_number, S.amount
from borrower as T, loan as S
select customer_name, borrower.loan_number as loan_id, amount where T.loan_number = S.loan_number
from borrower, loan Liste todas as agências que têm mais ativos do que pelo menos
where borrower.loan_number = loan.loan_number uma agência localizada em Brooklyn
Caso se pretenda utilizar um nome com espaços, esse nome select distinct T.branch_name
deverá ser colocado entre aspas. from branch as T, branch as S
where T.assets > S.assets and S.branch_city = ‘Brooklyn’
11 12
Variá
Variáveis de tupla (cont) Ordenando as tuplas
As variáveis de tuplas podem ser vistas como criando várias Listar em ordem alfabética os nomes de todos os clientes que
cópias de uma mesma relação (similar às renomeações da possuem um empréstimo na agência de Perryridge
Álgebra Relacional.) select distinct customer_name
Exemplo: Considere a relação: from borrower, loan
voos(numVoo,Matr,Data,Hora,De,Para) where borrower.loan_number = loan.loan_number and
branch_name = ‘Perryridge’
em que cada tupla denota um voo com nº numVoo, efetuado do order by customer_name
aeroporto De para o aeroporto Para no dia Data à hora Hora no
avião com Matrícula Matr. Pode-se especificar desc para ordenação descente ou asc para
ordenação ascendente, para cada atributo; por omissão,
Quais os pares de voos que usaram o mesmo avião num assume-se ordem ascendente.
mesmo dia?
Ex. order by customer_name desc
select distinct T.numVoo, S.numVoo Pode-se ter mais do que uma chave de ordenação, separando-
from voos as T, voos as S as com vírgulas
where T.Matr = S.Matr
and T.Data = S.Data
and T.numVoo < S.numVoo
13 14
15 16
Operaç
Operações com Conjuntos Operaç
Operações com Conjuntos
As operações com conjuntos union, intersect, e except operam Listar todos os clientes que têm um empréstimo ou uma conta:
sobre relações e correspondem aos operadores de álgebra (select customer_name from depositor)
relacional ∪, ∩, −. union
Cada uma das operações anteriores elimina os valores (select customer_name from borrower)
duplicados automaticamente. Para reter duplicados deve-se Listar todos os clientes que têm um empréstimo e uma conta:.
utilizar as respectivas versões multiconjunto union all, intersect (select customer_name from depositor)
all e except all. intersect
(select customer_name from borrower)
Suponha que uma tupla ocorre m vezes em r e n vezes em s, Listar os clientes que têm uma conta mas não têm empréstimos
então ele ocorre:
(select customer_name from depositor)
m + n vezes em r union all s except
min(m,n) vezes em r intersect all s (select customer_name from borrower)
max(0, m – n) vezes em r except all s
17 18
Funç
Funções de Agregaç
Agregação Funç
Funções de Agregaç
Agregação (cont.)
Estas funções aplicam-se a multiconjuntos de valores de uma Determinar o saldo médio das contas na agência de Perryridge.
coluna de uma relação, devolvendo um valor select avg (balance)
avg: valor médio from account
min: valor mínimo where branch_name = ‘Perryridge’
max: valor máximo Calcular o número de clientes.
sum: soma dos valores
count: número de valores select count (*)
from customer
Encontrar o número de depositantes do banco.
select count (distinct customer_name)
from depositor
19 20
Funç
Funções de agregaç
agregação – Group By Funç
Funções de Agregaç
Agregação – Clá
Cláusula Having
21 22
23 24
Valores Nulos e Ló
Lógica Trivalente Valores Nulos e Agregados
Qualquer comparação com null retorna unknown Calcule o total de todos os montantes dos empréstimos
Ex. 5 < null ou null <> null ou null = null select sum (amount)
Lógica trivalente usando o valor lógico unknown: from loan
OR: (unknown or true) = true, (unknown or false) = unknown A instrução acima ignora montantes nulos
(unknown or unknown) = unknown Resultado é null se não existir nenhum montante não-nulo
AND: (true and unknown) = unknown, (false and unknown) = Todas as funções de agregação exceto count(*) ignoram tuplas
false, com valores nulos nos atributos agregados.
(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
25 26
Operaç
Operações de Junç
Junção Junç
Junção versus Produto Cartesiano
As operações de junção retornam uma relação como resultado Listar o nome, número de empréstimo e montante de todos os
da combinação de duas outras relações. clientes que efetuaram um empréstimo na agência de
Perryridge.
Estas operações adicionais são utilizadas habitualmente em select borrower.*, amount
subconsultas na cláusula from from borrower, loan
Condição de junção – define quais as tuplas que são where borrower.loan_number = loan.loan_number and
combinadas nas duas relações, assim como quais os atributos branch_name = ‘Perryridge’
que aparecem no resultado da junção. Versus
Tipo de junção – define como tratar as tuplas que não estão select borrower.*, amount
from borrower natural inner join loan
relacionadas entre si (baseados na condição de junção).
where branch_name = ‘Perryridge’
Tipos de Junção Condições de Junção A última separa claramente onde ir buscar os dados de onde se
inner join (junção interna) natural colocam condições “de filtragem” (seleção)
left outer join (junção externa esquerda) on <predicate> Esta separação não só torna a leitura mais fácil, como pode ser
right outer join (junção externa direita) using (A1, A2, ..., An) aproveitada para implementações.
full outer join (junção externa completa)
27 28
Relaç
Relações de Exemplo Exemplos
Relação loan
loan inner join borrower on
loan_number branch_name amount loan.loan_number = borrower.loan_number
L-170 Downtown 3000 loan_number branch_name amount customer_name loan_number
L-230 Redwood 4000
L-170 Downtown 3000 Jones L-170
L-260 Perryridge 1700
L-230 Redwood 4000 Smith L-230
Relação borrower
loan left outer join borrower on
customer_name loan_number loan.loan_number = borrower.loan_number
Jones L-170
Smith L-230 loan_number branch_name amount customer_name loan_number
Hayes L-155 L-170 Downtown 3000 Jones L-170
L-230 Redwood 4000 Smith L-230
L-260 Perryridge 1700 null null
29 30
Exemplos Exemplos
loan full outer join borrower using (loan_number)
loan natural inner join borrower
loan_number branch_name amount customer_name
loan_number branch_name amount customer_name
L-170 Downtown 3000 Jones
L-170 Downtown 3000 Jones L-230 Redwood 4000 Smith
L-230 Redwood 4000 Smith L-260 Perryridge 1700 null
L-155 null null Hayes
loan natural right outer join borrower
Listar todos os clientes que têm uma conta ou um empréstimo no
loan_number branch_name amount customer_name banco (mas não ambos!)
L-170 3000
select customer_name
Downtown Jones
from depositor natural full outer join borrower
L-230 Redwood 4000 Smith where account_number is null or loan_number is null
L-155 null null Hayes
31 32
33 34
35 36
Definiç
Definição da clá
cláusula Some Clá
Cláusula all
F <comp> some r ⇔ ∃ t ∈ r : (F <comp> t) Listar os nomes das agências com ativos superiores aos de
em que <comp> pode ser : <, ≤, >, =, ≠ todas as agências localizadas em Brooklyn.
select branch_name
0 from branch
(5< some 5 ) = true where assets > all
(ler: 5 menor que alguma tupla na relação ) (select assets
6
from branch
0 where branch_city = ‘Brooklyn’)
(5< some 5 ) = false Sem o all
0 (select branch_name from branch)
(5 = some 5 ) = true except
(select branch_name
0 from branch T,branch S
(5 ≠ some 5 ) = true (pois 0 ≠ 5) where S.branch_city = ‘Brooklyn’ and T.assets < S.assets)
(= some) ≡ in
No entanto, (≠ some) ≡ not in
37 38
Definiç
Definição da clá
cláusula all Teste de Relaç
Relações Vazias
A construção exists devolve o valor true se a subconsulta é não
F <comp> all r ⇔ ∀ t ∈ r : (F <comp> t) vazia.
exists r ⇔ r ≠ Ø
0
(5< all 5 ) = false not exists r ⇔ r = Ø
6
6
(5< all 10 ) = true
4
(5 = all 5 ) = false
4
(5 ≠ all
6 ) = true (dado que 5 ≠ 4 e 5 ≠ 6)
(≠ all) ≡ not in
Contudo, (= all) ≡ in
39 40
43 44
Visões Visões
Em certas circunstâncias, não é desejável que todos os usuários Mecanismo que permite ocultar (esconder) informação de certos
possam acessar a todo o modelo lógico (i.e. a todas as relações usuários. Para criar uma visão utilizamos o comando:
armazenadas na base de dados)
Considere o caso de um empregado que necessita de saber o create view v as <query expression>
número de empréstimo de um cliente, mas que não precisa de
em que:
saber o montante desse empréstimo. Este empregado deverá
ver apenas a relação descrita por <query expression> é qualquer expressão SQL válida
select costumer_name, loan_number O nome da visão é v
from borrower natural inner join loan
45 46
Exemplo Relaç
Relações Derivadas
Uma visão contendo todas as agências e respectivos clientes SQL permite que uma expressão de subconsulta seja usada na
create view all_customer as cláusula from.
(select branch_name, customer_name Determinar o saldo médio das contas em agências cujo saldo médio
from depositor natural inner join account) é superior a $1200.
union
(select branch_name, customer_name select branch_name, avg_balance
from borrower natural inner join loan) from (select branch_name, avg (balance) as avg_balance
from account
Listar todos os clientes da agência de Perryridge group by branch_name
select customer_name )
from all_customer where avg_balance > 1200
where branch_name = ‘Perryridge’ 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 podem ser utilizados
diretamente em uma cláusula where.
47 48
Clá
Cláusula With Modificaç
Modificação da base de Dados – Remoç
Remoção
A remoção de tuplas de uma tabela (ou visão) é feita em SQL
A cláusula with permite a definição local de visões relativas a com a instrução
uma consulta, em vez de globalmente. Análogo a
procedimentos locais de uma linguagem de programação. É delete from <tabela ou visão>
uma visão temporária where <Condição>
Encontrar as contas de maior saldo Apagar todas as contas da agência de Perryridge
delete from account
with max_balance(value) as where branch-name = ‘Perryridge’
( select max (balance)
from account )
select account_number
from account, max_balance
where account.balance = max_balance.value
49 50
51 52
Modificaç
Modificação da base de dados – Atualizaç
Atualização Modificaç
Modificação da base de dados – Atualizaç
Atualização
A atualização de tuplas de uma tabela (ou visão) é feita em SQL Pagar juros de 6% a todas as contas com saldos superiores a
com a instrução $10,000, e juros de 5% às restantes contas.
update <tabela ou visão> Escrever duas instruções de update:
set <Atributo> = <Expressão>, <Atributo> = <Expressão>, ... update account
where <Condição> set balance = balance ∗ 1.06
where balance > 10000
Pagar juros de 1% a todas as contas da agência Perryride.
update account
set balance = balance ∗ 1.01 update account
set balance = balance ∗ 1.05
where branch_name = ‘Perryride’
where balance ≤ 10000
A ordem é importante
Pode ser efetuado de maneira mais “limpa” recorrendo à instrução
case
53 54
Instruç
Instrução Case para Atualizaç
Atualizações
condicionais Atualizaç
Atualização de uma visão
Modificações nas bases de dados através de visões devem
Pagar juros de 6% a todas as contas com saldos superiores a
ser traduzidas para modificações das verdadeiras relações
$10,000, e juros de 5% às restantes contas.
presentes na base de dados.
update account
Ex. com uma visão com a informação sobre empréstimos,
set balance = case escondendo o atributo amount
when balance <= 10000 then balance *1.05
else balance * 1.06 create view branch-loan as
select branch-name, loan-number
end
from loan
a adição de uma nova tupla a branch-loan
insert into branch-loan
values (‘Perryridge’, ‘L-307’)
deve ser traduzida na inserção na relação loan da tupla
(‘L-307’, ‘Perryridge’, null)
55 56
Atualizaç
Atualização de uma visão (cont
(cont)) Transaç
Transações
Algumas atualizações através de visões são impossíveis de traduzir
para atualizações das relações da base de dados: Uma transação é uma sequência de instruções de consulta e de
Ex. considere a visão atualização executadas numa unidade singular.
create view v1 as As transações são iniciadas implicitamente e terminadas com
select * commit work: torna permanentes todas as atualizações efetuadas à base
from loan de dados, ou
where branch-name = ‘Perryridge’
rollback work: desfaz todas as alterações efetuadas pela transação.
A seguinte adição é impossível
Exemplo motivador
insert into v1
values (‘L-307’,‘Downtown’,1000) A transferência de dinheiro de uma conta para outra requer duas operações:
Outras não têm tradução única: debitar uma conta e creditar outra
Ex. considere a visão Se um dos passos anteriores é bem sucedido e o outro falha, a base de dados
create view all_costumers as fica num estado inconsistente
(select * from depositor) union (select * from borrower)
Portanto, ou ambos os passos devem ocorrer ou ambos falhar
Toda a adição em all_costumers não tem tradução única:
Se qualquer operação em uma transação falha, todo o trabalho efetuado
Deve introduzir-se em depositor ou em borrower???
na transação pode ser descartado através de rollback work.
Diante disto, o SQL opta por restringir aquilo que é permitido. A
maioria das implementações SQL permite apenas a atualização de No caso de falhas no sistema, o rollback das transações incompletas é
visões simples (sem agregações) definidas sobre uma única relação. feito automaticamente,
57 58
Transaç
Transações (cont.)
Na maioria dos sistemas de bases de dados, cada instrução
SQL que é executado com sucesso é “committed”
automaticamente.
Cada transação é assim constituída por apenas uma instrução.
Normalmente, o “commit” automático pode ser desligado,
permitindo transações com múltiplas instruções.
Outra opção em SQL1999: colocar as instruções dentro do bloco
begin atomic
…
end
59