Você está na página 1de 67

1

Captulo 4
A Linguagem SQL
Murilo Silva de Camargo
2
SQL - Structured Query Language
Estrutura bsica
Operaes de conjunto
Funes agregadas
Valores nulos
Sob consultas aninhadas
Relaes derivadas
Vises
Modificao do banco de dados
Juno de relaes
Linguagem de definio de dados
SQL embutida
3
O Exemplo da Empresa Bancria
agencia (nome_agencia, cidade_agencia, fundos)
cliente (nome_cliente, rua_cliente, cidade_cliente)
conta (nome_agencia, numero_conta, saldo)
emprestimo (nome_agencia, numero_emprestimo,
total)
depositante (nome_cliente, numero_conta)
devedor (nome_cliente, numero_emprestimo)
4
Estrutura Bsica
SQL baseada em operaes em conjuntos e
relaes com algumas modificaes e melhorias.
Uma consulta tpica da SQL tem a forma:
select A
1
, A
2
, ..., A
n
from r
1
, r
2
, ..., r
m
where P
A
i
s representam atributos
r
i
s representam relaes
P um predicado.
Esta consulta equivalente expresso da
lgebra relacional:

A
1
, A
2
, ..., A
n
(
P
(r
1
r
2
... r
m
))
O resultado de uma consulta SQL uma relao.
5
A Clusula select
A clusula select corresponde operao de projeo da
lgebra relacional. Ela usada para listar os atributos
desejados no resultado de uma consulta.
Achar os nomes de todas as agncias na relao emprstimo
select nome_agencia
from emprestimo
Na sintaxe da lgebra relacional pura, esta consulta
poderia ser:

nome_agencia
(emprestimo)
Um asterisco na clusula select denota todos atributos
select *
from emprestimo
6
A Clusula select (Cont.)
SQL permite duplicatas nas relaes, bem como nos
resultados das consultas.
Para forar a eliminao de duplicatas, deve-se inserir
declarao distinct depois do select.
Achar os nomes de todas as agncias na relao emprstimo e
remover as duplicatas
select distinct nome_agencia
from emprestimo
A decvlarao all especifica que duplicatas no devem ser
removidas.
select all nome_agencia
from emprestimo
7
A Clusula select (Cont.)
A clusula select pode conter expresses aritmticas
envolvendo os operadores +, - , * , e / , e operaes
em constantes ou atributos de tuplas.
A consulta:
select nome_agencia, numero_emprestimo, total * 100
from emprestimo
retornaria uma relao a qual a igual a relao
emprstimo, exceto que o atributo total
multiplicado por 100.
8
A Clusula where
A clusula where corresponde ao predicado de seleo da
lgebra relacional. Ele consiste de um predicado envolvendo
atributos das relaes que aparecem na clusula from.
Achar todos os numeros de emprstimos de emprstimos
feitos na agncia Perryridge com totais maiores que $1200.
select numero_empustimo
from emprestimo
where nome_agencia = 'Perryridge' and total >1200
SQL usa os conectivos lgicos and, or, e not. Ele permite o
uso de expresses aritmticas como operandos para os
operadores de comparao.
9
A Clusula where (Cont.)
SQL inclui um operador de comparao between
para simplificar clusulas where que especificam
que um valor deva ser menos ou igual a algum valor
e maior ou igual que algum outro valor.
Achar o nmero do emprstimo dos emprstimos
com total entre $90,000 e $100,000 (isto , $90,000
and $100,000)
select numero_emprestimo
from emprestimo
where total between 90000 and 100000
10
A Clusula from
A clusula from corresponde ao produto cartesiano da lgebra
relacional . Lista as relaes que sero mapeadas na avaliao
da expresso.
Encontre o produto cartesiano devedor emprestimo
select *
from devedor,emprestimo
Encontre o nome e o nmero de emprstimo de todos os
clientes que possuem um emprstimo na agncia Perryridge.
select distinct nome_cliente,devedor.numero_emprestimo
from devedor,emprestimo
where devedor.numero_emprestimo =
emprestimo.numero_emprestimo
and nome_agencia = 'Perryridge'
11
A Operao Rename
A SQL possui um mecanismo para renomear tanto relaes
quanto atributos atravs da clusula as, da seguinte forma
nome_antigo as novo_nome
Encontre o nome e o nmero do emprstimo dos clientes
que possuem um emprstimo na agncia Perryridge;
substitua o nome da coluna numero_emprstimo por
numero_do_emprestimo_do_devedor.
select distinct nome_cliente, devedor.numero_emprestimo as
numero_do_emprestimo_do_devedor
from devedor, emprestimo
where devedor.numero_emprestimo =
emprestimo.numero_emprestimo
and nome_agencia = 'Perryridge'
12
Variveis Tuplas
Variveis tuplas so definidas na clusula from atravs do
uso da clusula as .
Encontre o nome dos clientes e seus nmeros de emprstimo
para todos os clientes que possuem um emprstimo em
alguma agncia.
select distinct nome_cliente, T.numero_emprestimo
from devedor as T, emprestimo as S
where T.numero_emprestimo =S.numero_emprestimo
Encontre o nome de todas as agncias que possuam fundos
maiores que ao menos uma agncia daquelas localizadas no
Brooklyn.
select distinct T.nome_agencia
from agencia as T, agencia as S
where T.fundos >S.fundos and S.cidade_agencia = 'Brooklyn'
13
Operaes com Strings
SQL inclui operadores de comparao de strings. Padres so
descritos usando dois caracteres especiais:
% combina com qualquer substring, independente do tamanho.
_ combina caractere a caractere .
Encontre o nome de todos os clientes cuja rua contenha o
substring Main.
select nome_cliente
from cliente
where rua_cliente like '%Main%'
Combine com o substring 'Main%'
like 'Main \ %' escape ' \ '
14
Operaes em Strings (cont.)
Caractersticas:
sensvel ao tamanho das letras (case
sensitive)
Permite encontrar diferenas, e no
coincidncias, atravs do uso de not like.
Possui operaes de concatenao, extrao
de substrings, indicao de tamanhos,
converso de maisculas para minsculas e
vice-versa, etc.
15
Ordenando a Apresentao de
Tuplas
Listar em ordem alfabtica os nomes de todos os clientes
que tm um emprstimo na agncia Perryridge:
select distinct nome_cliente
from devedor, emprestimo
where devedor.numero_emprestimo =
emprestimo.numero_emprestimo
and nome_agencia = 'Perryridge'
order by nome_cliente
A palavra desc indica ordem descendente, e asc a ordem
ascendente (default) de apresentao dos dados.
SQL deve executar uma classificao para realizar uma
solicitao order by. Como classificar uma grande
quantidade de dados pode ser demorada, aconselhvel
usar o order by apenas quando necessrio.
16
Ordenao e apresentao de
tuplas (continuao)
SQL pode executar uma ordenao por
diversos atributos.
select *
from emprestimo
order by total desc, numero_emprestimo asc
17
Duplicatas
Em relaes com duplicidades, SQL pode definir
quantas cpias da tupla aparecem no resultado.
Em verses multiconjuntos dos operadores da
lgebra relacional - dadas as relaes r
1
e r
2
:
1. Se existe c
1
cpias da tupla t
1
em r
1
, e t
1
satisfaz a seleo

, ento existem c
1
cpias de t
1
em

(r1).
2. Para cada cpia da tupla t
1
em r
1
, em que existe uma
cpia da tupla
A
(t
1
) em
A
(r
1
), onde
A
(t
1
) denota a
projeo de uma tupla nica t
1
.
3. Se existe c
1
cpias da tupla t
1
em r
1
e c
2
cpias da tupla
t
2
em r
2
, existe c
1
c
2
cpias da tupla t
1
.t
2
em r
1
r
2
.
18
Duplicatas (Cont.)
Suponhas que as relaes r
1
com o esquema (A,B) e
r
2
com esquema (C) sejam os seguintes
multiconjuntos:
r
1
= {(1,a),(2,a)} r
2
= {(2),(3),(3)}
Ento
B
(r
1
) poderia ser {(a),( a)}, enquanto
B
(r
1
)
r
2
poderia ser
{(a,2),(a,2),(a,3),(a,3),(a,3),(a,3)}
A clusula SQL select A
1
, A
2
, ..., A
n
from r
1
, r
2
, ..., r
m
where P
equivalente expresso em lgebra relacional:

A
1
, A
2
, ..., A
n
(
P
(r
1
r
2
... r
m
))
19
Operaes de Conjuntos
As operaes de conjuntos union, intersect e except
operam em relaes e correspondem s operaes , e -
(diferena) da lgebra relacional.
Estas operaes eliminam as duplicatas; se desejarmos
obter as repeties, devemos explicitar atravs da forma
union all, intersect all e except all.
Suponha uma tupla que ocorra m vezes em r e n vezes
em s, ento temos :
m + n vezes em r union all s
min (m, n) vezes em r intersect all s
max (0, m-n) vezes em r except all s
20
Operaes de Conjuntos (cont.)
Encontre todos os clientes que possuam um emprstimo,
uma conta ou ambos:
(select nome_cliente from depositante )
union (select nome_cliente from devedor)
Encontre todos os clientes que possuem ambos uma conta
e um emprstimo:
(select nome_cliente from depositante )
intersect (select nome_cliente from devedor )
Encontre todos os clientes que possuem uma conta mas
no possuem emprstimo;
(select nome_cliente from depositante)
except (select nome_cliente from devedor )
21
Funes Agregadas
Essas funes operam nos multi-conjuntos de
valores de uma coluna de uma relao e retornam
um valor
avg: mdia dos valores
min: valor mnimo
max: valor mximo
sum: soma dos valores
count: nmero de valores
22
Funes Agregadas (Cont.)
Encontre a mdia dos saldos em contas na agncia
Perryridge.
select avg (saldo)
from contas
where nome_agencia = 'Perryridge'
Encontre o nmero de tuplas na relao clientes:
select count (*)
from cliente
Encontre o nmero de depositantes no banco:
select count (distinct nome_cliente)
from depositante
23
Funes Agregadas Group By
Encontre o nmero de depositantes em cada
agncia.
select nome_agencia, count (distinct nome_cliente )
from depositante,conta
where depositante.numero_conta =conta.numero_conta
group by nome_agencia
Nota: Atributos na clusula select fora das funes
agregadas devem aparecer na lista group by.
24
Funes Agregadas Having
Encontre o nome de todas as agncias onde a
mdia do saldo das contas seja maior que $1,200
select nome_agencia, avg (saldo)
from conta
group by nome_agencia
having avg (saldo) >1200
Nota: predicados na clusula having so aplicados
aps a formao dos grupos.
25
Valores Null
possvel para as tuplas ter valor nulo, denotados por
null, para alguns de seus atributos. Significa valor
desconhecido ou inexistente. O resultado de uma
expresso aritmtica envolvendo null null. As
operaes envolvendo null retornam false
(true or unknown)= true, (false or unknown)= unknown
(unknown or unknown)= unknown
(true and unknown)= unknown, (false and unknown)= false,
(unknown and unknown)= unknown
Resultado da clusula where tratado como false se a sua
avaliao desconhecida
P is unknown true se a avaliao do predicado P =
unknown.
26
Valores Null (continuao)
Encontre todos os nmeros de emprstimo que aparecem na
relao emprstimo com valores null para o total.
select numero_emprestimo
from emprestimo
where total is null
Total de todos os emprstimos
select sum (total)
from emprestimo
A declarao acima ignora valores null no total ; o resultado
ser null somente se no existir nenhuma tupla com o atributo
total diferente de null
Todas as operaes agregadas, exceto count(*) ignoram tuplas
com valores null nos atributos agregados .
27
Subconsultas Aninhadas
SQL prov um mecanismo para aninhamento de
subconsultas.
Uma subconsulta uma expresso select-from-
where que aninhada dentro de uma outra
consulta.
As aplicaes mais comuns para as subconsultas so
testes para membros de conjuntos, comparao de
conjuntos e cardinalidade de conjuntos.
28
Membro de Conjunto
F in r t r (t =F)
0
5
4
0
6
4
(5 in ) = true
(5 in ) = false
0
6
4 (5 not in ) = true
29
Exemplo (Consulta Aninhada)
Encontrar todos os clientes que possuem uma conta
e um emprstimo no banco.
select distinct nome_cliente
from devedor
where nome_cliente in (select nome_cliente
from depositante)
Encontrar todos os clientes que tenham um
emprstimo no banco mas no tenham uma conta
neste banco.
select distinct nome_cliente
from devedor
where nome_cliente not in (select nome_cliente
from depositante)
30
Exemplo (Consulta Aninhada)
Encontrar todos os clientes que tenham uma conta
e um emprstimo na agncia Perryridge.
select distinct nome_cliente
from devedor, emprestimo
where
devedor.numero_emprestimo=emprestimo.numero_em
prestimo 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)
31
Exemplo (Operador not in)
Conjuntos enumerados:
select distinct nome_cliente
from devedor
where nome_cliente not in (Smith, Jones)
32
Comparao de Conjuntos
Encontrar os nomes de todas as agncias que
tenham fundos maiores que ao menos uma
agncia localizada em Brooklyn
select distinct T.nome_agencia
from agencia as T, agencia as S
where T.fundos > S.fundos and
S.cidade_agencia = Brooklyn
33
A Clusula some
F <comp> some r t( t r ^ [F <comp> t])
Onde <comp> pode ser: <, , >, , =, <>
(= some) in
No entanto, ( some) not in
0
6
5 (5 < some ) =true
(L-se: 5 <alguma tupla na relao)
0
5 ) =false (5 < some
0
5 ) =true (5 = some
0
5 ) =true (pois 0 diferente de 5) (5 = some
34
Exemplo (Clusula some)
Encontre todos as agncias que tm fundos maiores
que ao menos uma agncia localizada em Brooklyn.
select nome_agencia
from agencia
where fundos > some
(select fundos
from agencia
where cidade_agencia = Brooklyn)
35
A Clusula all
F <comp> all r t (t r ^ [F <comp> t])
( all) not in
No entanto, (= all) in
0
6
5 (5 < all ) = false
6
10
) = false
(5 < all
4
5
) = true
(5 = all
4
6 ) = true (since 5= 4 and 5 = 6) (5 = all
36
Exemplo (Clusula all)
Encontrar os nomes de todas as agncias que
tenham fundos maiores que cada uma das
agncias localizadas em Brooklyn.
select nome_agencia
from agencia
where fundos > all
(select fundos
from agencia
where cidade_agencia = Brooklyn)
37
Exemplo (Clusula all)
Encontrar a agncia que tenha o maior saldo
mdio. Observe que funes agregadas no
podem ser novamente agregadas
OBS.:(max (avg(...)) no permitido.
select nome_agencia
from conta
group by nome_agencia
having avg(saldo) >= all (select avg(saldo)
from conta
group by nome_agencia
38
Verficao de Relaes Vazias
O construtor exists retorna o valor true se a sub-
consulta usada como argumento no-vazia.
exists r r
not exists r r =
39
Exemplo (Construtor exists)
Encontre todos os clientes que tenham uma conta em
todas as agncias localizadas no Brooklin
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.numero_cliente =T.numero_cliente))
Note que X -Y = X Y
40
Teste para Ausncia de Tuplas
Repetidas
O contrutor unique testa se a sub-consulta tem
alguma tupla repetida no seu resultado.
Encontre todos os clientes que tenham apenas uma
conta na agncia Perryridge.
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')
41
Exemplo (Clusula unique)
Encontre todos os clientes que tenham pelo menos
duas contas na agncia Perryridge.
select distinct T.nome_cliente
from depositante 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')
42
Relaes Derivadas
Encontre a mdia do balano de contas das agncias onde a
mdia do balano de contas maior que $1200.
select nome_agencia, saldo_mdio
from (select nome_agencia, avg (saldo)
from conta
group by nome_agencia)
as result (nome_agencia,saldo_mdio)
where saldo_mdio >1200
Note que no necessrio usar a clusula having, j que
calculamos na clusula from uma relao temporria e os
atributos dessa relao podem ser usados diretamente no
clusula where.
43
Vises
Fornecem um mecanismo para esconder certos
dados do alcance de certos usurios. Para criar
uma viso usa-se o comando:
create view v as <expresso query>
onde:
<expresso query> qualquer expresso correta
o nome da viso representada por v
44
Usando views
Uma viso constituda de agncias e seus clientes
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 devedor, emprestimo
where devedor.numero_emprestimo =
emprestimo.numero_emprestimo)
Encontre todos os clientes da agncia Perryridge
select nome_cliente
from todos_clientes
where nome agencia= 'Perryridge'
45
Modificaes no Banco de Dados
- Remoo (delete)
Exclua todas os registros de contas da agncia
Perryridge
delete from conta
where nome_agencia = 'Perryridge'
46
Modificaes no Banco de Dados
- Remoo (delete)
Exclua todas as contas de todas as agncias
localizadas em Needham.
delete from conta
where nome_agencia in (select nome_agencia
from agencia
where cidade_agencia = 'Needham')
delete from depositante
where numero_conta in (select numero_conta
from agencia, conta
where cidade_agencia = 'Needham'
and agencia.nome_agencia = conta.nome_agencia)
47
Exemplo (Clusula delete)
Apague os registros de todas as contas com saldos
abaixo da mdia no banco
delete from conta
where saldo <(select avg (saldo)
from conta)
Problema: ao apagar tuplas de conta, o saldo mdio
muda
Solues usadas em SQL:
1. Primeiro, calcula o saldo mdio - avg (saldo) - e encontre
todas as tuplas para excluso;
2. A seguir, apague todas tuplas encontradas acima (sem
recalcular avg ou testar novamente as tuplas)
48
Modificaes no Banco de Dados
- I nsero (insert)
Adicionar uma nova tupla em conta
insert into conta
values ('Perryridge', A-9732, 1200)
ou de forma equivalente
insert into conta (nome_agencia, saldo, numero_conta)
values ('Perryridge', 1200, A-9732)
Adicionar uma nova tupla conta com saldo igual a nulo
insert into account
values ('Perryridge', A-777, null)
49
Modificaes no Banco de Dados
- I nsero (insert)
Fornea aos clientes da agncia Perryridge uma caderneta de
poupana de $200 como brinde para cada emprestimo que eles
tenham. O nmero do emprestimo ser usado como nmero
da caderneta de poupana
insert into conta
select nome_agencia, numero_emprestimo,200
from emprestimo
where nome_agencia = 'Perryridge'
insert into depositante
select nome_cliente, numero_emprestimo
from emprestimo, devedor
where nome_agencia = 'Perryridge'
and emprestimo.numero_conta = devedor.numero_conta
50
Modificaes no Banco de Dados
Atualizao (update)
Acrescentar 6% a todas as contas com saldos acima de
$10.000. Todas as outras contas recebem 5%.
Escreva dois comandos update:
update conta
set saldo = saldo * 1.06
where saldo >10000
update conta
set saldo = saldo * 1.05
where saldo =< 10000
Aqui, a ordem dos comandos importante!
SQL-92 fornece um construtor case que pode ser usado para realizar
ambas as alteraes anteriores em um nico comando update
51
Atualizaes de uma Viso
Crie uma viso de todos os dados de emprstimos, omitindo
o atributo total
create view agencia_emprestimo as
select nome_agencia, numero_emprestimo
from emprestimo
Adicione uma nova tupla viso agencia-emprestimo
insert into agencia_emprestimo
values ('Perryridge', 'L-307')
Esta insero deve ser representada pela insero da tupla
('Perryridge', 'L-307',null)
na relao emprestimo.
Atualizaes em vises mais complexas so difceis ou
podem ser impossveis de traduzir, e, assim, so proibitivas.
52
Composio de Relaes
Operaes de Juno tomam duas relaes e retornam
como resultado uma outra relao.
As operaes de Juno so normalmente usadas na
clusula from.
Condies de Juno define quais tuplas das duas
relaes apresentam correspondncia, e quais atributos
sero apresentados no resultado de uma juno.
Tipos de Juno define como as tuplas em cada relao
que no possuam nenhuma correspondncia(baseado na
condio de juno) com as tuplas da outra relao devem
ser tratadas.
Tipos de juno
inner join
left outer join
rigth outer join
full outer join
natural
on <predicate>
using (A1, A2,..., An)
Condies de juno
53
Composio de Relaes
Composio de Relaes
(exemplos)
(exemplos)
Relao emprestimo
Relao devedor
nome_agencia
total
numero_emprestimo
Downtown
Redwood
Perryridge
L-170
L-230
L-260
3000
4000
1700
nome_cliente
Jones
Smith
Hayes
numero_emprestimo
L-170
L-230
L-155
54
emprestimo inner join devedor on
emprestimo.numero_emprestimo=
devedor.numero_emprestimo
emprestimo left outer join devedor on
emprestimo.numero_emprestimo=devedor.numero_empre
stimo
nome_agencia total numero_emprestimo
Downtown
Redwood
Perryridge
L-170
L-230
L-260
3000
4000
1700
nome_cliente numero_emprestimo
Jones
Smith
null
L-170
L-230
null
nome_agencia total numero_emprestimo
Downtown
Redwood
L-170
L-230
3000
4000
nome_cliente numero_emprestimo
Jones
Smith
L-170
L-230
Composio de Relaes
Composio de Relaes
(exemplos)
(exemplos)
55
Composio de Relaes
Composio de Relaes
(exemplos)
(exemplos)
emprestimo natural inner join devedor
emprestimo natural right outer join devedor
nome_agencia total numero_emprestimo
Downtown
Redwood
L-170
L-230
3000
4000
nome_cliente
Jones
Smith
nome_agencia total numero_emprestimo
Downtown
Redwood
null
L-170
L-230
L-155
3000
4000
null
nome_cliente
Jones
Smith
Hayes
56
Composio de Relaes (exemplos)
Composio de Relaes (exemplos)
emprestimo full outer join devedor using
(numero_emprestimo)
Encontrar todos os clientes que tenham uma conta ou um
emprestimo (mas no os dois) no Banco.
select nome_cliente
from (depositante natural full outer join devedor)
where numero_conta is null or numero_emprestimo
is null
nome_agencia total numero_emprestimo
Downtown
Redwood
Perryridge
null
L-170
L-230
L-260
L-155
3000
4000
1700
null
nome_cliente
Jones
Smith
null
Hayes
57
Linguagem de Definio de
Dados (DDL)
Permite no s a especificao de um conjunto de relaes,
como tambm informaes acerca de cada uma das
relaes, incluindo:
O esquema de cada relao.
O domnio dos valores associados a cada atributo.
Regras de Integridade.
O conjunto de ndices para manuteno de cada relao.
Informaes sobre segurana e autoridade sobre cada
relao.
A estrutura de armazenamento fsico de cada relao no
disco.
58
Tipos de Domnios em SQL
char(n). uma cadeia de caracter de tamanho fixo, com o
tamanho n definido pelo usurio.
varchar(n). uma cadeia de caracter de tamanho varivel,
como tamanho mximo n definido pelo usurio.
int. um inteiro (um subconjunto finito dos inteiros que
depende do equipamento).
smallint. um inteiro pequeno (um subconjunto do
domnio dos tipos inteiros dependente do equipamento).
numeric(p,d). um numero de ponto fixo cuja preciso
definida pelo usurio. O numero consiste de p
dgitos(mais o sinal), sendo que d dos p dgitos esto
direita do ponto decimal.
59
Tipos de Domnios em SQL
(continuao)
real, double precision. So numeros de ponto flutuante e
ponto flutuante de preciso dupla cuja preciso
dependente do equipamento.
float(n). um numero de ponto flutuante com a preciso
definida pelo usurio em pelo menos n dgitos.
date. Datas, contm um ano (com quatro dgitos), ms e dia
do ms.
time. Representa horrio, em horas, minutos e segundos.
Valor nulo um membro de todos os tipos de domnios.
Declarando um um domnio de atributo como sendo not
null proibi-se, assim, a insero de valores nulos para
esse tipo de atributo.
create domain em SQL-92 permite definir domnios.
create domain person-name char(20) not null
60
Definio de Esquema em SQL
Definimos uma relao SQL usando o comando
create table:
create table r (A
1
D
1
, A
2
D
2
, ..., A
n
D
n
,
regras de integridade
1
,
...,
regras de integridade
k
)
r o nome da relao
cada A
i
o nome de um atributo no esquema da relao r
D
i
o tipo de domnio dos valores no domnio dos
atributos A
i
Exemplo:
create table agencia
(nome_agencia char(15) not null,
cidade_agencia char(30),
fundos integer)
61
Regras de I ntegridade em create
table
not null
primary key (A
1
, ..., A
n
)
check (P), onde P um predicado
Exemplo: declarar nome_agencia como chave primria para
a relao agencia e verificar se o valor de fundos no
negativo.
create table agencia
(nome_agencia char(15) not null,
cidade_agencia char(30),
fundos integer,
primary key (nome_agencia),
check (fundos >=0))
primary key so necessariamente declarados como not null
in SQL-92
62
Comandos drop e alter table
O comando drop table remove todas as informaes de
uma relao do banco de dados..
O comando alter table usado para adicionar atributos a
uma relao existente. Todas as tuplas da relao recebem
valores nulo para seu novo atributo. A forma do comando
alter table e:
alter table r add A D
onde A o nome do novo atributo que ser adicionado e D
seu domnio.
O comando alter table tambm pode ser usado para
remover atributos de uma relao
alter table r drop A
onde A o nome do atributo a ser removido da relao r.
63
Comandos SQL Embutidos
O padro SQL define que a SQL ser embutida em uma
variedade de linguagens de programao, como Pascal, PL/ I,
Fortran, C, e Cobol.
A linguagem na qual so embutidas consultas SQL
chamada linguagem hospedeira, e as estruturas SQL
permitidas na linguagem hospedeira so denominadas SQL
embutida.
EXEC SQL usado para identificar os pedidos em SQL
embutida para o pr-processador
EXEC SQL <comando SQL embutido > END EXEC
64
Exemplo - SQL Embutido
Suponha que temos na linguagem hospedeira uma
varivel chamada total e que desejamos encontrar os
nomes e cidades dos clientes dos clientes que tenham mais
de um total em dlares em qualquer conta.
Podemos escrever essa consulta como segue:
EXEC SQL
declare c cursor for
select nome_cliente,cidade_cliente
from depsito,cliente
where depsito.nome_cliente = cliente.nome_cliente
and depsito.saldo >:total
END-EXEC
65
Exemplo - SQL Embutido
O comando open faz com que a consulta seja avaliada
EXEC SQL open c END-EXEC
O comando fetch determina os valores de uma tupla que
sero colocados em variveis da linguagem host.
EXEC SQL fetch c into :cn :an END-EXEC
Pode-se utilizar um lao para processar cada tupla do
resultado; uma varivel na rea de comunicao do SQL
indica que no h mais tupla a ser processada.
O comando close faz com que o sistema de banco de dados
remova a relao temporria mantida para o resultado da
consulta.
EXEC SQL close c END-EXEC
66
SQL Dinmico
Permite que programas construam e submetam
consultas SQL em tempo de execuo.
Exemplo de uso de SQL dinmico dentro de um
programa C.
char *sqlprog ='update conta set saldo = saldo * 1.05
where numero_conta =?'
EXEC SQL prepare dinprog from :sqlprog;
char conta[10] = 'A-101';
EXEC SQL execute dinprog using :conta;
O programa dinmico contm uma ?, que
colocada para manter um valor gerado quando o
programa SQL executado.
67
Outros Recursos SQL
Linguagens de Quarta Gerao linguagem especial para apoio aos
programadores de aplicao na criao de telas de interface com o
usurio e para formatao de dados na criao de relatrios; disponvel
em muitos produtos comerciais de banco de dados.
SQL sessions proporcionam uma abstrao de um cliente de um
servidor (possivelmente remota)
cliente conecta o servidor SQL, estabelecendo uma sesso
executa uma srie de comandos
fecha a sesso (desconecta)
oferece comandos de commit para a efetivao do trabalho realizado
durante a sesso, ou rollback para no efetiv-los
Um ambiente SQL contm diversos componentes, inclusive a
identificao do usurio e um esquema, que identifica qual dos diversos
esquemas a sesso est usando.

Você também pode gostar