SQL
SQL
• Tipos de domínios básicos
– char(n) - character, varchar(n) – character varying, int
– integer, smallint, numeric(p,d), real, double
precision, float(n)
• Definição básica de esquema na SQL
create table r(A1D1, A2D1,...,AnDn),
<restrição-de-integridade1>
...,
<restrição-de-integridadek>
SQL
– A chave primaria é uma restrição de integridade.
Primary key(Aj1, Aj2,...,Ajm)
Definição de Dados SQL para parte do Banco de Dados de uma
Empresa Bancária
Esquema:
agencia(nome_agencia, cidade_agencia, ativo)
cliente(nome_cliente, rua_cliente, cidade_cliente)
emprestimo(numero_emprestimo, nome_agencia,quantia)
tomador(nome_cliente, numero_emprestimo)
conta(numero_conta, nome_agencia, saldo)
depositante(nome_cliente, numero_conta)
SQL
create table cliente
(nome_cliente char(20),
rua_cliente char(30),
cidade_cliente char(30),
primary key (nome_cliente))
create table agencia
(nome_agencia char(15),
cidade_agencia char(30),
ativo numerc(16,2),
primary key (nome_agencia))
create table conta
(numero_conta char(10),
nome_agencia char(15),
saldo numeric(12,2),
primary key (numero_conta))
create table depositante
(nome_cliente char(20),
Numero_conta char(10),
primary key (nome_cliente, numero_conta))
SQL
Inserção de Dados
insert into conta values(‘A-9732’, ’Perryridge’, 1200)
Deleção de Dados
delete from conta
Deleção de Tabela
drop table conta
Acrescentar Atributos a uma Relação
alter table conta add coluna_nome Domínio
Excluir Atributos de uma Relação
alter table conta drop coluna_nome
SQL
Estrutura Básica das Consultas SQL
select - Projeção da Álgebra Relacional
from – Operação Produto Cartesiano na Álgebra Relacional
where – Predicado na Álgebra Relacional
Notação SQL:
select A1, A2, ..., Na
from r1, r2, ..., rn
where P
Notação Álgebra Relacional:
πA1,A2, ..., Na ( σ p (r1x21xr3 ... X rm ))
SQL
A cláusula select
select nome_agencia
from emprestimo
ou
select all nome_agencia
from emprestimo
Eliminação de duplicatas:
select distinct nome_agencia
from emprestimo
Expressões aritméticas
select numero_emprestimo, quantia*100
from emprestimo
SQL
A cláusula where
select numero_emprestimo
from emprestimo
where nome_agencia = ‘Perryridge’ and quantia > 1200
select numero_emprestimo
from emprestimo
where quantia between 90000 and 100000 (Pode-se usar not between)
ou
select numero_emprestimo
from emprestimo
where quantia <= 100000 and quantia >= 90000
SQL
A cláusula from
select nome_cliente, tomar.numero_emprestimo,quantia
from tomador,emprestimo
where tomador.numero_emprestimo = emprestimo.numero_emprestimo
select nome_cliente, tomar.numero_emprestimo,quantia
from tomador,emprestimo
where tomador.numero_emprestimo = emprestimo.numero_emprestimo
and nome_agencia= ‘Perryridge’
SQL
Operação de Renomeação
nome_antigo as nome_novo
select nome_cliente, tomador.numero_emprestimo, quantia
from tomador, emprestimo
where tomador.numero_emprestimo = emprestimo.numero_emprestimo
Com Variáveis de Tuplas T e S
select nome_cliente, T.numero_emprestimo as id_emprestimo, S.quantia
from tomador as T, emprestimo as S
where T.numero_emprestimo = S.numero_emprestimo
select distinct T.nome_agencia
from agencia as T, agencia as S
where T.ativo > S.ativo and S.cidade_agencia = ‘Brooklyn’
SQL
Operações de string
String usa sinal de apóstrofo – ‘Perryridge’
Operador like (not like) – Verifica correspondência de padrões
Padrões são descritos com:
% (Porcentagem) - Qualquer substring
_ (Sublinhado) – Qualquer caractere
Ex: ‘Perry%’, ‘%idge%’, ‘_ _ _’, ‘_ _ _ %’
select nome_cliente
from cliente
where rua_cliente like ‘%Main%’
Operador de escape \
SQL
Operações de string
Ex: ‘ab\%cd%’ e ‘ab\\cd%’
Funções em strings:
- || - concatenação
- upper() – string em maiúscula
- lower() – string minúscula
SQL
Ordenação da exibição de tuplas
select nome_cliente
from tomador, emprestimo
where tomador.numero_emprestimo = emprestimo_numero_emprestimo and
nome_agencia = ‘Perryridge’
order by nome_cliente (Ordem crescente)
desc – decrescente
asc – Crescente
select *
from emprestimo
order by quantia desc, numero_emprestimo asc
SQL
Operações de conjunto
Union – U
Intersect – ∩
Except - –
(select nome_cliente
from depositante)
union
(select nome_cliente
from tomador)
(select nome_cliente
from depositante)
union all
(select nome_cliente
from tomador)
UNIÃO
(duplicatas são eliminadas)
(duplicatas não são eliminadas)
SQL
Operações de conjunto
INTERSEÇÃO
(select distinct nome_cliente
from depositante)
intersect
(duplicatas são eliminadas)
(select distinct nome_cliente
from tomador)
(select nome_cliente
from depositante)
intersect all
(select nome_cliente
from tomador)
(duplicatas não são eliminadas)
SQL
Operações de conjunto
DIFERENÇA
(select distinct nome_cliente
from depositante)
except
(duplicatas são eliminadas)
(select nome_cliente
from tomador)
(select nome_cliente
from depositante)
except all
(select nome_cliente
from tomador)
(duplicatas não são eliminadas)
SQL
Operações de conjunto
FUNÇÕES AGREGADAS
Average: avg
Minimum: min
Maximum: max
Total: sum
Count: count
select avg(saldo)
from conta
where nome_agencia = ‘Perryridge’
SQL
Operações de conjunto
FUNÇÕES AGREGADAS
select nome_agencia, avg(saldo)
from conta
group by nome_agencia
select nome_agencia, count(distinct nome_cliente)
from depositante, conta
where depositante.numero_conta = conta.numero_conta
group by nome_agencia
select nome_agencia, avg(saldo)
from conta
group by nome_agencia
having avg(saldo)> 1200
SQL
Operações de conjunto
FUNÇÕES AGREGADAS
select avg(saldo)
from conta
select count(*) //Não se usa distinct
from cliente
select depositante.nome_cliente, avg(saldo)
from depositante, conta, cliente
where depositante.numero_conta = conta.numero_conta and
depositante.nome_cliente=‘Harrison’
group by depositante.nome_cliente
having count (distinct depositante.numero_conta) >= 3
SQL
Valores Nulos
select numero_emprestimo
from emprestimo
where quantia is null
(is not null)
A SQL trata como unknown o resultado de qualquer comparação envolvendo um
valor nulo
true and unknown = unknown
false and unknown = false
Unknown and unknown = unknown
true or unknwon = true
false or unknown = unknown
unknown or unknown = unknown
not unknown = unknown
SQL
Valores Nulos
select sum (quantia)
from emprestimo
//O operador sum ignora valores nulos
Todas as funções agregadas exceto count(*) ignoram valores nulos em sua coleção
de entrada.
Subconsultas aninhadas
Participação de Conjuntos
select distinct nome_cliente
from tomador
where nome_cliente in (select nome_cliente from depositante)
SQL
Participação de Conjuntos
select distinct nome_cliente
from tomador, emprestimo
where tomador.numero_cliente = emprestimo.numero_emprestimo and
nome_agencia=‘Perryridge’ and (nome_agencia, nome_cliente) in
(select nome_agencia, nome_cliente
from depositante, conta
where depositante.numero_conta = conta.numero_conta)
SQL
Participação de Conjuntos
select distinct nome_cliente
from tomador
where nome_cliente not in (select nome_cliente from depositante)
select distinct nome_cliente
from tomador
where nome_cliente not in (‘Smith’, ‘Jones’)
SQL
Comparação de Conjuntos
select distinct T.nome_agencia
from agencia as T, agencia as S
where T.ativo > S.ativo and S.cidade_agencia = ‘Brooklyn’
ou
select nome_agencia
from agencia
where ativo > some (select ativo
from agencia
where cidade_agencia = ‘Brooklyn’
Outros: < some, >= some, = some, <>some =some é o mesmo que in
SQL
Comparação de Conjuntos
select nome_agencia
from agencia
where ativo > all (select ativo
from agencia
where cidade_agencia = ‘Brooklyn’
Outros: < all, >= all, = all, <>all <>all é o mesmo que not in
SQL
Comparação de Conjuntos
select nome_agencia
from conta
group by nome_agencia
having avg(saldo) >=all (select avg(saldo)
from conta
group by nome_agencia)
Obs.: As funções agregadas não podem ser compostas
max(avg(...))
SQL
Teste de relações vazias
select nome_cliente
from tomador
where exists (select *
from depositante
where depositante.nome_cliente=tomador.nome_cliente)
select distinct S.nome_cliente
from depositante as S
where not exists((select nome_agencia
from agencia
where cidade_agencia=‘Brooklyn’)
except
(select R.nome_agencia
from depositante as T, conta as R
where T.numero_conta = R.numero_conta and S.nome_cliente = T.nome_cliente))
SQL
Teste da Ausência de tuplas duplicatas
select T.nome_cliente
from depositante as T
where unique (select R.nome_cliente
from conta, depositante as R
where T.nome_cliente = R.nome_cliente and
R.numero_conta = conta.numero_conta and
conta.nome_agencia = ‘Perryridge’)
select distinct T.nome_cliente
from depositante as T
where not unique( select R.nome_cliente
from conta, depositante as R
where T.nome_cliente = R.nome_cliente
and R.numero_conta = conta.numero_conta
and conta.nome_agencia = ‘Perryridge’)
SQL
Consultas complexas
Relações Derivadas e Cláusula with
Relações Derivadas
(select nome_agencia, avg(saldo)
from conta
group by nome_agencia)
as media_agencia(nome_agencia, saldo_medio)
select nome_agencia, saldo_medio
from (select nome_agencia, avg(saldo)
from conta
group by nome_agencia)
as media_agencia(nome_agencia, saldo_medio)
where saldo_medio > 1200
SQL
Consultas complexas
Relações Derivadas e Cláusula with
Relações Derivadas
select max(saldo_total)
from (select nome_agencia, sum(saldo)
from conta
group by nome_agencia) as total_agencia(nome_agencia, saldo_total)
SQL
A cláusula with
with saldo_maximo(valor) as
select max(saldo)
from conta
select numero_conta
from conta, saldo_maximo
where conta.saldo = saldo_maximo.valor
with total_agencia(nome_agencia, valor) as
select nome_agencia, sum(saldo)
from conta
group by nome_agencia
with media_total_agencia(valor) as
select avg(valor)
from total_agencia
select nome_agencia
from total_agencia, media_total_agencia
where total_agencia.valor >=media_total_agencia.valor
SQL
Views
//consulta sem o valor do emprestimo
select nome_cliente, tomador. Numero_emprestimo, nome_agencia
from tomador, emprestimo
where tomador.numero_emprestimo = emprestimo.numero_emprestimo
//Outra consulta
(select nome_agencia, nome_cliente
from depositante, conta
where depositante.numero_conta = conta.numero_conta)
union
(select nome_agencia, nome_cliente
from tomador, emprestimo
where tomador.numero_emprestimo = emprestimo.numero_emprestimo)
SQL
Definição de View
create view v as <expressão de consulta>
create view todos_clientes as
(select nome_agencia, nome_cliente
from depositante, conta
where depositante.numero_conta = conta.numero_conta)
union
(select nome_agencia, nome_cliente
from tomador, emprestimo
where tomador.numero_emprestimo = emprestimo.numero_emprestimo)
select nome_cliente
from todos_clientes
where nome_agencia = ‘Perryridge’
SQL
Definição de View
create view emprestimo_total_agencia(nome_agencia, emprestimo total) as
select nome_agencia, sum(quantia)
from emprestimo
group by nome_agencia
Views materializadas se mantém atualizadas.
Views Definidas usando outras Views
create view cliente_perryridge as
select nome_cliente
from todos_cliente
where nome_agencia=‘Perryridge’
Definição de View
SQL
Expansão de view
select *
from cliente_perryridge
where nome_cliente =‘John’
select *
from( select nome_cliente
from todos_clientes
where nome_agencia = ‘Perryridge’)
Where nome_cliente = ´John’
Definição de View
SQL
Expansão de view
select *
from( select nome_cliente
from (
(select nome_agencia, nome_cliente
from depositante, conta
where depositante.numero_conta = conta.numero_conta)
union
(select nome_agencia, nome_cliente
from tomador, emprestimo
where tomador.numero_emprestimo = emprestimo.numero_emprestimo
)
)
where nome_agencia = ‘Perryridge’
Where nome_cliente = ´John’
SQL
Modificação do banco de dados
Exclusão
delete from r
where P
delete from r
delete from conta
where nome_agencia = ‘Perryridge’
delete from emprestimo
where quantia between 1300 and 1500
Delete from conta
Where nome_agencia in(select nome_agencia
from agencia
where cidade_agencia = ‘Brooklyn’)
SQL
Modificação do banco de dados
Exclusão
Delete from conta
Where saldo < (select avg(saldo)
from conta)
SQL
Modificação do banco de dados
Inserção
insert into conta values(‘A-9732’,’Perryridge’,1200)
insert into conta(numero_conta, nome_agencia, saldo) values(‘A-9732’,’Perryridge’,1200)
insert into conta(nome_agencia, numero_conta, saldo) values(’Perryridge’,‘A-9732’, 1200)
Insert into conta
select numero_emprestimo, nome_agencia, 200 //Numero_emprestimo corresponde a poupança
from emprestimo
where nome_agencia = ‘Perryridge’
SQL
Modificação do banco de dados
Inserção
insert into depositante
select nome_cliente, numero_emprestimo
from tomador, emprestimo
where tomador.numero_emprestimo = emprestimo.numero_emprestimo and
nome_agencia = ‘Perryridge’
insert into conta values(‘A-101’,null,1200)
SQL
Modificação do banco de dados
Atualizações
update conta
set saldo = saldo * 1.05
update conta
set saldo = saldo * 1.05
where saldo >= 1000
update conta
set saldo = saldo * 1.05
where saldo > (select avg(saldo)
from conta)
SQL
Modificação do banco de dados
Atualizações
update conta
set saldo = saldo * 1.06
where saldo > 10000
update conta
set saldo = saldo * 1.05
where saldo <= 10000
Update conta
Set saldo = case
when saldo < = 10000 then saldo * 1.05
else saldo * 1.06
end
SQL
Modificação do banco de dados
Atualização de uma view
create view agencia_emprestimo as
select numero_emprestimo, nome_agencia
from emprestimo
Insert into agencia_emprestimo values(‘L-37’, ‘Perryridge’)
Soluções:
- Rejeitar a inserção
- Inserir uma tupla (L-37, “Perryridge”, nulo)
SQL
Modificação do banco de dados
Atualização de uma view
Relações:
emprestimo(numero_emprestimo, nome_agencia, quantia)
tomador(nome_cliente, numero_emprestimo)
create view info_emprestimo as
select nome_cliente, quantia
from tomador, emprestimo
where tomador.numero_emprestimo = emprestimo.numero_emprestimo
Insert into info_emprestimo values (‘Johnson’, 1900)
Equivale a inserir (“Johnson”,nulo) em tomador e (nulo, nulo, 1900) em emprestimo
SQL
Modificação do banco de dados
Atualização de uma view
create view conta_downtown as //View atualizável
select numero_conta, nome_agencia, saldo
from conta
where nome_agencia = ‘Downtown’
Tupla (‘A-999’,’Downtown’,1000)
Tupla (‘A-999’,’Perryridge’,1000)
//
//
É possível inserir a tupla na relação ou na view
É possível inserir a tupla na relação mas não na view
Cláusula with check option ao final da view para testar se o valor satisfaz a condição da
cláusula where
SQL
Transações
Uma transação consiste em uma sequência de instruções de consulta e/ou
atualização.
Commit – confirma a transação
Rollback – reverte a transação
Uso em algumas implementações:
begin atomic
...
end
SQL
Relações Juntadas
numero_emprestimo
nome_agencia
quantia
nome_cliente
numero_emprestimo
L-170
Downtown
3000
Jones
L-170
L-230
Redwood
4000
Smith
L-230
L-260
Perryridge
17000
Hayes
L-155
Emprestimo
Tomador
Junções Internas (Inner Join)
emprestimo inner join tomador on emprestimo.numero_emprestimo = tomador.numero_emprestimo
numero_emprestimo
nome_agencia
quantia
nome_cliente
numero_emprestimo
L-170
Downtown
3000
Jones
L-170
L-230
Redwood
4000
Smith
L-230
SQL
Relações Juntadas
Junções Externas (Outer Join)
Left Outer Join (Junção Externa Esquerda)
emprestimo left outer join tomador on emprestimo.numero_emprestimo = tomador.numero_emprestimo
numero_emprestimo
nome_agencia
quantia
nome_cliente
numero_emprestimo
L-170
Downtown
3000
Jones
L-170
L-230
Redwood
4000
Smith
L-130
L-260
Perryridge
17000
Right Outer Join (Junção Externa Direita)
emprestimo right outer join tomador on emprestimo.numero_emprestimo = tomador.numero_emprestimo
numero_emprestimo
nome_agencia
quantia
nome_cliente
numero_emprestimo
L-170
Downtown
3000
Jones
L-170
L-230
Redwood
4000
Smith
L-230
Hayes
L-155
SQL
Relações Juntadas
Junções Externas (Outer Join)
Full Outer Join (Junção Externa Completa)
emprestimo full outer join tomador on emprestimo.numero_emprestimo = tomador.numero_emprestimo
numero_emprestimo
nome_agencia
quantia
nome_cliente
numero_emprestimo
L-170
Downtown
3000
Jones
L-170
L-230
Redwood
4000
Smith
L-130
L-260
Perryridge
17000
Hayes
L-155
SQL
Relações Juntadas
Junção Natural (Natural Inner Join)
emprestimo natural inner join tomador
numero_emprestimo
nome_agencia
quantia
nome_cliente
L-170
Downtown
3000
Jones
L-230
Redwood
4000
Smith
Tipos e Condições de Junção
Tipos: inner join
left outer join
right outer join
full outer join
Condições de junção: Natural (natural)
on <predicado>
using(A1, A2,..., A3)
SQL
Relações Juntadas
emprestimo natural right outer join tomador
numero_emprestimo
nome_agencia
quantia
nome_cliente
L-170
Downtown
3000
Jones
L-230
Redwood
4000
Smith
Hayes
L-155
emprestimo full outer join tomador using(numero_emprestimo)
numero_emprestimo
nome_agencia
quantia
nome_cliente
L-170
Downtown
3000
Jones
L-230
Redwood
4000
Smith
L-260
Perryridge
1700
L-155
Hayes
Download

SQL