Sei sulla pagina 1di 120

SQL Avanado

Regis Pires Magalhes


regispires@lia.ufc.br

Renomeao de atributos e relaes


Acrescentar o qualificador AS seguindo pelo
novo nome desejado.
AS usado para apelidar os nomes tanto do
atributo, quanto da relao.

Comparaes envolvendo NULL


Significados de NULL
Valor desconhecido.
Valor indisponvel ou retido.
Atributo no aplicvel.

Ao usar NULL em uma comparao, SQL usa


uma lgica de trs valores para determinar se
uma expresso envolvendo AND, OR e NOT
verdadeira ou falsa.

Conectivos lgicos na lgica de trs


valores

Comparaes envolvendo NULL


Consultas podem checar se um atributo NULL:
IS NULL
IS NOT NULL

Consultas
Checando valores nulos
Predicado IS [NOT] NULL
Exemplo
select * from Empregado
where dt-nasc is null
select * from Empregado
where dt-nasc is not null

Consultas
Predicado [NOT] IN
Verifica a pertinncia de elementos em um conjunto
Exemplo
select nome
from Empregado
where matr in (1,5,8,9);
select nome
from Empregado
where matr not in (1,5,8,9)

SQL
Funes Agregadas
Funes embutidas (built-in) aplicadas sobre uma coleo
de valores (colunas) do banco de dados
sum
Retorna o somatrio dos valores de uma coleo

avg
Retorna a mdia dos valores de uma coleo

max
Retorna o maior valor de uma coleo de valores

min
Retorna o menor valor de uma coleo

count
Retorna o nmero de elementos de uma coleo

Sintaxe
nome-da-funo (ALL | DISTINCT nome-coluna) | count(*)
No podem ser utilizados na clusula WHERE
8

SQL Funes de agregao


COUNT
Retorna o nmero de tuplas ou valores.

SUM, MAX, MIN e AVG


Retornam, respectivamente, a soma, o valor
mximo, o valor mnimo e a mdia desses valores.

Essas funes podem ser usadas nas clusulas


SELECT ou HAVING.

SQL Funes agregadas


select pnome funcionario, count(*) numero_depend
from funcionario, dependente
where cpf=fcpf
group by pnome;

SQL Funes agregadas


Achar a soma dos salrios de todos os
funcionrios, o salrio mximo, o salrio
mnimo e a mdia dos salrios.

SQL Funes agregadas


Achar a soma dos salrios de todos os funcionrios do
departamento Pesquisa, bem como o salrio mximo, o
salrio mnimo e a mdia dos salrios nesse departamento.

SQL Funes agregadas


Recuperar o nmero total de funcionrios na
empresa.

SQL Funes agregadas


Recuperar o nmero de funcionrios no
departamento Pesquisa.

SQL Funes agregadas


Contar o nmero de valores de salrio distintos no
banco de dados.

SQL
Exerccios

Encontre o nmero de empregados lotados no


departamento de Informtica
select count(*)
from Empregados as e, Departamentos as d
where e.id_dept=d.id and d.nome = Informtica;

Encontre o montante da folha de pagamento da


empresa
select sum(salario)
from Empregado

Encontre o salrio mdio pago pela empresa


select avg(salario)
from Empregado

16

SQL
Agrupando tuplas no SQL
Aplicar funes agregadas a diferentes grupos de tuplas
Exemplo
Listar a quantidade de empregados por departamento

Clusula
GROUP BY

Exemplo

select id_dept, count(*) as quantidade_empregados


from Empregados
group by id_dept
id_dept quantidade_empregados
----------- -------------------1
4
2
2

A funo count aplicada


para o conjunto de tuplas
de cada grupo
17

SQL
Agrupando tuplas no SQL (cont.)
Todas colunas que aparecem na clusula select tm
que aparecer na clusula group by
Exceto os argumentos da funes agregadas

Exemplo de sintaxe incorreta


select lotacao, matr, count(*) from empregado
group by lotacao

Exemplos
Lista de todos empregados e a quantidade de dependentes que
cada um deles possui.

SQL- Funes agregadas


Para cada departamento, recuperar o nmero do
departamento, o nmero de funcionrios no
departamento e seu salrio mdio.

SQL Funes agregadas


Agrupamento de tuplas FUNCIONARIO pelo valor de Dnr:

SQL- Funes agregadas


Para cada projeto, recuperar o nmero do projeto, o
nome do projeto e o nmero de funcionrios que
trabalham nesse projeto.

SQL- Funes agregadas


Para cada projeto em que mais de dois funcionrios
trabalham, recupere o nmero e o nome do projeto e o
nmero de funcionrios que trabalham no projeto.

Aps aplicar a clusula WHERE, mas


antes de aplicar HAVING
Grupos no
selecionados
pela condio
HAVING

Aps aplicar a condio da clusula


HAVING

SQL Funes agregadas


Para cada projeto, recupere o nmero e o nome do projeto e
o nmero de funcionrios do departamento 5 que trabalham
no projeto.

SQL
Agrupando tuplas no SQL (cont.)
Exemplos (cont.)

Listar maiores e menores salrios de cada departamento


select d.nome, max(e.salario) as Maior_Salario, min(e.salario) as
Menor_Salario
from Departamento d, Empregado e
where d.cod_dep=e.lotacao
group by d.nome

Totalizar a quantidade de itens vendidos por vendedor e por item,


considerando o seguinte esquema
Vendedor(matr, nome, salrio)
Vendas(matr,cod_item,qtde, pr-venda,dt-hora-venda)
Estoque(cod_item, referncia, pr_compra,pr_venda,qtde)
select v.nome, e.referncia, sum(d.qtde) as total
from Estoque e, Vendedor v, Vendas d
where e.cod_item=d.cod_item and v.matr=d.matr
group by v.nome, e.referncia

26

SQL
Selecionando grupos
Listar nome dos departamentos cuja mdia salarial seja
maior que 7000
Clusula having
Filtro de grupos
Exemplo
select d.nome, avg(salario)
from Departamento d, Empregado e
where d.cod_depart=e.lotacao
group by d.nome
having avg(e.salario)>7000

Consulta com where e having


predicado da clusula where avaliado primeiramente
Tuplas que satisfazem o predicado so agrupadas pelo group by

Predicado da clusula having avaliado


Grupos que satisfazem o predicado aparecem no resultado
27

SQL
Selecionando grupos (cont.)
Exemplos

Listar nome e mdia salarial dos departamentos que possuem


mais de 10 empregados lotados
select d.nome, avg(e.salario) as
Mdia_Salarial
from Departamento d, Empregado e
where d.cod_dep=e.lotacao
group by d.nome
having count(matr)>=11

Listar nome e quantidade de empregados dos departamentos


cuja mdia salarial maior que 5000
select d.nome, count(*) as Nmero_Empregados
from Departamento d, Empregado e
where d.cod_dep=e.lotacao
group by d.nome
having avg(e.salario)>5000
28

SQL
Selecionando grupos (cont.)
Exemplos
Listar nome de vendedores e quantidade de vendas efetuadas dos
vendedores com volume de vendas superior a 10000 (classificado
em ordem decrescente por quantidade de vendas), considerando o
seguinte esquema:
Vendedor(matr, nome, salrio)
Vendas(matr,cod_item,qtde, pr-venda,dt-hora-venda)
Estoque(cod_item, referncia, pr_compra,pr_venda,qtde)
select v.nome, count(*) as total_de_vendas
from Vendedor v, Vendas d
where v.matr=d.matr
group by v.nome
having sum(d.qtde*d.pr_venda) > 10000
order by count(*)

Forma bsica do comando SELECT


SELECT <lista de atributos e funes>
FROM <lista de tabelas>
[ WHERE <condio> ]
[ GROUP BY <atributos de agrupamento> ]
[ HAVING <condio de agrupamento> ]
[ ORDER BY <atributos de ordenao> ];

Consultas aninhadas
Blocos select-from-where dentro da clusula
WHERE de outra consulta (consulta externa).

Consultas aninhadas

No aninhada

Consultas aninhadas

Aninhada

Consultas aninhadas
Operador de comparao IN
Compara o valor v com um conjunto de valores V.
Resulta TRUE se v um dos elementos em V.

Consultas aninhadas
SQL permite o uso de tuplas de valores em
comparaes.
Devem ser escritas entre parnteses.

select distinct Fcpf, pnr, horas


from trabalha_em
where (pnr,horas) in (
select pnr,horas
from trabalha_em, funcionario
where fcpf='12345678966'
);

SQL

Consulta SQL aninhada (subconsulta)

Consulta SQL especificada dentro de uma outra


consulta SQL
Exemplo
Listar todos os empregados que tm salrio maior que a
mdia salarial da empresa

select pnome,salario
from funcionario
where salario > (select avg(salario) from
funcionario);

36

SQL

Consulta SQL aninhada (cont.)


Subconsulta escalar

Subconsulta que retorna apenas um valor (uma


nica linha e uma nica coluna)
Pode aparecer na lista de argumentos da clusula
select e na clusula where
Exemplo
Listar nome dos empregados com a quantidade de
dependentes de cada empregado

select pnome, (select count(*) from


dependente where fcpf=cpf)
from funcionario;
37

SQL
Consulta SQL aninhada (cont.)
Usando o Predicado [NOT] IN
Listar os CPFs dos funcionrios que trabalham
em projetos localizados em Maua.
select distinct fcpf
from trabalha_em
where pnr in (
select projnumero
from projeto
where projlocal='Maua'
);

38

Consultas aninhadas
possvel o uso de um conjunto explcito de
valores na clusula WHERE.

Consultas aninhadas
Evite erros em ambiguidades criando apelidos (aliases) para
todas as tabelas referenciadas em uma consulta SQL.

Consultas aninhadas

SQL Funes agregadas


Para cada departamento que tem mais de cinco funcionrios,
recuperar o nmero do departamento e o nmero de seus
funcionrios que esto ganhando mais de R$ 40.000,00.

Consultas aninhadas
Usar outros operadores de comparao para
comparar um nico valor v.
Operador = ANY (ou = SOME)
Retorna TRUE se o valor v igual a algum valor no
conjunto V e, portanto, equivalente a IN.

Outros operadores que podem ser combinados com


ANY (ou SOME): >, >=, <, <= e <>.
ALL tambm pode ser combinada com cada um
desses operadores.
v > ALL V retorna TRUE se o valor v maior do que
todos os valores no conjunto V.

Consultas aninhadas
select distinct fcpf
from trabalha_em
where pnr = any (
select projnumero
from projeto
where projlocal='Maua'
);
select distinct fcpf
from trabalha_em
where pnr = some (
select projnumero
from projeto
where projlocal='Maua'
);

select distinct fcpf


from trabalha_em
where pnr in (
select projnumero
from projeto
where projlocal='Maua'
);

Consultas aninhadas
select pnome, salario
from funcionario
where salario <= ALL (select salario from
funcionario);

select pnome, salario


from funcionario
where salario = (select min(salario) from
funcionario);

Consultas aninhadas
select pnome, salario
from funcionario
where salario >= ALL (select salario from
funcionario);

select pnome, salario


from funcionario
where salario = (select max(salario) from
funcionario);

Consultas aninhadas
Consulta para retornar os nomes dos funcionrios
cujo salrio maior do que o salrio de todos os
funcionrios no departamento 5.

Essa consulta tambm pode ser especificada usando a


funo de agregao MAX.

SQL
Consulta SQL aninhada (cont.)
Predicados SOME, ANY e ALL

Listar empregados que ganham salrios maior ou


igual a mdia salarial de um departamento
Sintaxe
expr {SOME | ANY | ALL} (subconsulta)
{<, <=,>, >=, =, <>}
select nome
from Empregado
where salrio >=some (select avg(salrio) from Empregado
group by lotao)

48

SQL

Consulta SQL aninhada (cont.)


Predicados SOME, ANY e ALL (cont.)
SOME (subconsulta) e ANY (subconsulta)
Retornam verdade se e somente se

Para pelo menos um elemento s retornado pela


subconsulta, expr s verdade

So equivalentes

ALL (subconsulta)

Retorna verdade se e somente se,

Para todo elemento s retornado pela subconsulta,


expr s verdade
Listar funcionrios que ganham salrios maior ou igual ao
maior salrio pago pela empresa.

select pnome, salario from funcionario where salario >=


ALL (select salario from funcionario);

select pnome, salario from funcionario where salario =


(select max(salario) from funcionario);
49

SQL

Consulta SQL aninhada (cont.)


Predicados SOME, ANY e ALL (cont.)

Listar o departamento com maior mdia salarial

No permitido funo agregada composta

select d.nome
from Empregado e, Departamento d
where d.cod_depart=e.lotao
group by d.nome
having avg(salrio) >=all (select avg(salrio) from Empregado
group by lotao)

50

Consultas aninhadas correlacionadas


Ocorre quando uma consulta aninhada referencia
algum atributo de uma relao declarada na
consulta externa.
Nesse caso, as duas consultas so chamadas
correlacionadas.
A consulta aninhada avaliada uma vez para cada
tupla (ou combinao de tuplas) na consulta
externa.

Consultas aninhadas correlacionadas


EXISTS e NOT EXISTS
Verifica se o resultado de uma consulta aninhada
correlacionada vazio (no contm tuplas) ou no.

Consultas aninhadas correlacionadas


EXISTS e NOT EXISTS
select pnome
from funcionario
where exists (
select *
from dependente
where cpf = fcpf
);

select pnome
from funcionario
where cpf in (
select fcpf from dependente
);

Consultas aninhadas correlacionadas


Recuperar os nomes de funcionrios que no
possuem dependentes.

Consultas aninhadas correlacionadas


Listar os nomes dos gerentes que possuem pelo
menos um dependente.

Consultas aninhadas correlacionadas


Recuperar o nome de cada funcionrio que trabalha
em todos os projetos controlados pelo departamento
5.

Consultas aninhadas correlacionadas


Recuperar os nomes de todos os funcionrios que
tm dois ou mais dependentes.

select pnome
from funcionario
where (
select count(*)
from dependente
where cpf = fcpf
) >= 2;

SQL

Consulta SQL aninhada (cont.)

Predicado EXISTS
Verifica se o conjunto retornado por uma subconjunto vazio ou
no
Listar empregados que possuem dependentes

select pnome
from funcionario
where exists (
select *
from dependente
where cpf=fcpf
);

select pnome from funcionario


where cpf in (
select fcpf from dependente
);

58

SQL

Consulta SQL aninhada (cont.)


Predicado EXISTS (cont.)
Sintaxe

[NOT] EXISTS (subconsulta)

EXISTS (subconsulta)

Retorna verdade se e somente se


O conjunto retornado por subconsulta no vazio

NOT EXISTS (subconsulta)

Retorna verdade se e somente se


O conjunto retornado por subconsulta vazio

Listar nome de departamentos com empregados ganhando


duas vezes mais que a mdia do departamento
select d.nome
from Departamento d
where exists (select * from Empregado e
where e.lotacao=d.cod_depart and
salrio > (2*(select avg(salrio) from Empregado
where lotao=e.lotao)))
59

UNIQUE
A funo UNIQUE(C) retorna TRUE se no
houver tuplas duplicadas no resultado da
consulta C.

Junes
Usurios podem especificar uma tabela
resultante de uma operao de juno na
clusula FROM de uma consulta.
Consulta a seguir tem uma nica tabela de juno.

Junes
Tipos
NATURAL JOIN
Natural JOIN sobre duas relaes R e S, nenhuma
condio de juno especificada.
Cria-se uma condio EQUIJOIN implcita para
cada par de atributos com o mesmo nome.
select pnome, nome_dep
from funcionario
natural join departamento as dep
(nome_dep, dnr, cpf_gerente, data_inicio_gerente);

Junes
Tipos
NATURAL JOIN

Junes
Inner join
Tipo padro de juno em uma tabela de juno.
A tupla includa no resultado somente se uma
tupla correspondente existir na outra relao.

select pnome, dnome


from funcionario
inner join departamento
on dnr=dnumero;

Explcito

select pnome, dnome


from funcionario, departamento
where dnr=dnumero;

Implcito

Junes
LEFT OUTER JOIN
Toda tupla na tabela esquerda deve aparecer no
resultado.
Se no houver tupla correspondente:
Preenchido com valores NULL para atributos da
tabela da direita.

select pnome, dnome


from funcionario
left outer join departamento
on dnr=dnumero;

Junes

Junes

Junes
RIGHT OUTER JOIN
Toda tupla na tabela direita deve aparecer no
resultado.
Se no houver tupla correspondente:
Preenchido com valores NULL para atributos da
tabela da esquerda.
select pnome, dnome
from funcionario
right outer join departamento
on dnr=dnumero;

Junes
FULL OUTER JOIN
Toda tupla nas tabelas direita e esquerda deve
aparecer no resultado.
select pnome, dnome
from funcionario
full outer join departamento
on dnr=dnumero;

Junes
Sintaxe do Oracle:
+= LEFT OUTER JOIN
=+ RIGHT OUTER JOIN
+=+ FULL OUTER JOIN

Junes
Mltiplas junes em uma mesma consulta.

SQL

Formas de Juno em SQL Avanado


Listar nomes dos empregados e os nomes dos
seus departamentos.
produto cartesiano
select d.nome
projeo
from Empregado as e, Departamento as d
where d.id =e.id_dept
seleo

d.nome(d.id=e.id_dept(Departamento x Empregado))

Departamento

d.id=e.id_dept

72

Empregado

SQL
Formas de Juno em SQL Avanado (cont.)
Sintaxe da clusula FROM
[ FROM {<tabela_fonte>} [,...n] ]
<table_fonte> ::=
nome_tabela [ [AS] qualificador ]
| <tabela_fonte> <tipo_juno> <tabela_fonte> ON
<condio_juno>
<tipo_juno> ::=
[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ] [ <join_hint> ]
JOIN

73

SQL
Formas de Juno em SQL Avanado (cont.)
Sintaxe da clusula FROM (cont.)
Tipos de juno

Juno theta
INNER JOIN
Juno externa esquerda
LEFT OUTER JOIN
Juno externa direita
RIGHT OUTER JOIN
Juno externa completa
FULL OUTER JOIN

Juno theta
Exemplo

Listar nome dos empregados com o nome do respectivo


departamento
select e.nome, d.nome
from Empregado as e inner join Departamento as d on e.id_dept = d.id

74

SQL
Formas de Juno em SQL Avanado (cont.)
Juno Externa (OUTER JOIN)
Adicionar tuplas extras ao resultado de uma
juno natural

75

SQL

Formas de Juno em SQL Avanado


(cont.)
LEFT OUTER JOIN

Calcula o resultado da juno

Adiciona ao resultado da juno

Tuplas da relao esquerda que no satisfazem a


condio de juno
Atribui valores nulos aos atributos no definidos
para estas tuplas

Exemplo

Listar nome do empregado e o nome de seu


dependente. O nome do empregado deve ser
exibido mesmo que ele no possua dependente.

76

SQL
Formas de Juno em SQL Avanado (cont.)
RIGHT OUTER JOIN

Calcula o resultado da juno

Adiciona ao resultado da juno

Tuplas da relao direita que no satisfazem a condio


de juno
Atribui valores nulos aos atributos no definidos para estas
tuplas

Exemplo

Listar nome do empregado e o nome de seu


dependente. O nome do empregado deve ser exibido
mesmo que ele no possua dependente.

77

SQL
Formas de Juno em SQL Avanado (cont.)
FULL OUTER JOIN
Calcula o resultado da juno
Adiciona ao resultado da juno
Tuplas das relaes envolvidas na juno que no satisfazem a
condio de juno
Atribui valores nulos aos atributos no definidos para estas tuplas

Exemplo
Listar nome do empregado e o nome de seu departamento. O nome
do empregado deve ser exibido mesmo que ele no possua
departamento. Da mesma forma, o nome do departamento deve
ser exibido mesmo que ele no tenha empregados.
O MySQL no implementa o FULL OUTER JOIN. A alternativa fazer
a unio (UNION) dos resultados do LEFT OUTER JOIN com os
resultados do RIGHT OUTER JOIN. 78

Especificando restries como asseres


CREATE ASSERTION
Especifica tipos adicionais de restries que esto
fora do escopo das restries embutidas do
modelo relacional (chaves primria e nica,
integridade de entidade e integridade referencial).
Essas restries podem ser especificadas dentro
do comando CREATE TABLE.

Especificando restries como asseres


CREATE ASSERTION
Especifica uma consulta que seleciona as tuplas que
violam a condio desejada.
Sempre que alguma tupla no BD fizer com que a
condio de um comando ASSERTION seja avaliada
como FALSE, a restrio violada.
As clusulas CHECK sobre atributos, domnios e
tuplas individuais so verificadas somente quando as
tuplas so inseridas ou atualizadas.
A verificao de restrio mais eficiente nesses casos.
Usar CREATE ASSERTION somente nos casos em que
no seja possvel usar CHECK em atributos e domnios.
O PostgreSQL ainda no implementa CREATE ASSERTION.

Especificando restries como asseres


O salrio de um funcionrio no pode ser maior
que o salrio do gerente do departamento para o
qual o funcionrio trabalha.

Especificando aes como triggers


Bancos de dados ativos oferecem funcionalidades para
especificar regras ativas.
Essas regras podem ser disparadas automaticamente por
eventos e podem iniciar certas aes especificadas na
declarao da regra para que ocorram se certas condies
forem atendidas.
Funcionalidades fornecidas pelos bancos de dados ativos
esto disponveis na forma de triggers (gatilhos), que faz
parte da SQL-99 e de padres mais recentes.
Triggers (gatilhos) so regras que especificam aes que
so disparadas automaticamente por certos eventos.

Especificando aes como triggers


Modelo usado para especificar regras de banco de dados ativo
conhecido como modelo Evento-Condio-Ao (ECA).
Uma regra no modelo ECA tem trs componentes:
1.

O(s) evento(s) que dispara(m) a regra.

2.

Esses eventos normalmente so operaes de atualizao do banco de dados que


so aplicadas explicitamente ao banco de dados.

A condio que determina se ao da regra deve ser executada.

3.

Quando o evento que dispara a ao tiver ocorrido, uma condio opcional pode
ser avaliada.
Se nenhuma condio for especificada, a ao ser executada quando ocorrer o
evento.
Se uma condio for especificada, ela primeiro avaliada e, somente se for
avaliada como verdadeira, a ao da regra ser executada.
A condio especificada na clusula WHEN de um trigger.

A ao a ser tomada.

A ao normalmente uma sequncia de comandos SQL, mas tambm poderia


ser uma transao do banco de dados ou um programa externo que ser
executado automaticamente.

Especificando aes como triggers


CREATE TRIGGER
Especifica aes automticas que sero realizadas
quando certos eventos e condies ocorrerem.
Comando usado para monitorar o banco de dados
e disparar determinadas aes quando for
satisfeita.
Uma trigger tpica possui trs componentes:
Evento(s)
Condio
Ao

Especificando aes como triggers


A sintaxe geral resumida para criao de um
trigger no sistema Oracle a seguinte:
CREATE TRIGGER <nome trigger>
(AFTER | BEFORE) <evento trigger> ON <nome tabela>
[ FOR EACH ROW ]
[ WHEN <condio> ]
<aes da trigger>;

Especificando aes como triggers


Sintaxe PostgreSQL:
CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF }
{ event [ OR ... ] }
ON table
[ FROM referenced_table_name ]
{ NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE |
INITIALLY DEFERRED } }
[ FOR [ EACH ] { ROW | STATEMENT } ]
[ WHEN ( condition ) ]
EXECUTE PROCEDURE function_name ( arguments )

event pode ser:


INSERT
UPDATE [ OF column_name [, ... ] ]
DELETE
TRUNCATE (remove todas as linhas de uma ou mais tabelas)

Especificando aes como triggers


No PostgreSQL preciso inicialmente criar uma
funo que retorna uma trigger.
Essa funo ser executada pela trigger.
Exemplo 1:
create or replace function remove_empr() returns trigger as
$$
begin
delete from empregado
where superv =OLD.cpf;
delete from departamento where gerente=OLD.cpf;
delete from dependentes where emp
=OLD.cpf;
delete from trabalha_no where emp
=OLD.cpf;
return null;
end;
$$ language plpgsql;

Especificando aes como triggers


Definindo a trigger propriamente dita no
PostgreSQL:
create trigger remove_empregado
after delete on empregado
for each row execute procedure remove_empr();

Especificando aes como triggers


Exemplo 2:
create or replace function insere_depart() returns trigger as $$
begin
if (select count(cpf) from empregado where cpf =NEW.gerente) = 0
then
RAISE EXCEPTION 'Insero do departamento com gerente % no pode
ser realizada, pois no existe empregado com esse cpf.',
NEW.gerente;
end if;
return NEW;
end;
$$ language plpgsql;

create trigger insere_departamento


before insert on departamento
for each row execute procedure insere_depart();

Especificando aes como triggers


Exemplo 3:
create or replace function atualiza_empr() returns trigger as $$
begin
IF NEW.cpf != OLD.cpf then
update departamento set gerente=NEW.cpf where gerente=OLD.cpf;
update dependentes set emp
=NEW.cpf where emp
=OLD.cpf;
update trabalha_no set emp
=NEW.cpf where emp
=OLD.cpf;
update empregado
set superv =NEW.cpf where superv = OLD.cpf;
end if;
return NEW;
end;
$$ language plpgsql;

drop trigger if exists atualiza_empregado on empregado;


create trigger atualiza_empregado
after update on empregado
for each row execute procedure atualiza_empr();

Especificando aes como triggers


CREATE TRIGGER
A clusula BEFORE ou AFTER especifica que a regra ser disparada
antes ou depois, respectivamente, que ocorrerem os eventos que
disparam a regra.
Os eventos bsicos que podem ser definidos para disparar as regras
so INSERT, DELETE e UPDATE.
No caso de UPDATE, podem-se especificar os atributos a serem
atualizados.

A clusula ON determina a relao em que a regra especificada.


A clusula FOR EACH ROW especifica que a regra ser disparada uma
vez para cada linha que afetada pelo evento de disparo.
Isso conhecido como trigger de nvel de linha.

A clusula FOR EACH STATEMENT indica o uso de uma trigger em


nvel de comando que dispara a regra apenas uma vez, mesmo que
vrias tuplas sejam afetadas pelo evento de disparo.

Especificando aes como triggers


CREATE TRIGGER
A trigger pode especificar nomes de varivel de tupla em
particular para as tuplas antigas e novas.
Dentro da clusula REFERENCING, nomeamos variveis de
tupla (apelidos) para nos referirmos (s) tupla(s) OLD (antes
da modificao) e (s) tupla(s) NEW (aps a modificao),
respectivamente.

A clusula WHEN usada para especificar quaisquer


condies que precisam ser verificadas aps a regra ser
disparada, mas antes que a ao seja executada.
A ao especificada aps a condio pode ser um comando
SQL ou uma sequncia de comandos SQL delimitados por
BEGIN e END.

Especificando aes como triggers


Usando SQL99, atualizar o total salarial de um
departamento a cada atualizao de salrio de
um funcionrio desse departamento:
CREATE TRIGGER salario_total1
AFTER UPDATE OF salario ON FUNCIONARIO
REFERENCING OLD ROW AS O, NEW ROW AS N
FOR EACH ROW
WHEN (N.id_dept IS NOT NULL)
UPDATE DEPARTAMENTO
SET salario_total = salario_total + N.salario O.salario
WHERE id_dept = N.id_dept;

Especificando aes como triggers

Comandos de controle de transao


SQL tambm possui comandos de controle de transao.
Estes so usados para especificar unidades de
processamento de banco de dados para fins de controle de
concorrncia e recuperao.
Comandos:
BEGIN
Inicia um bloco de transao.

COMMIT
Confirma a transao corrente.

ROLLBACK
Aborta e desfaz as operaes realizadas na transao corrente.

SQL Vises
Acesso a um banco de dados

Requer conhecimento do esquema


Indesejvel

Para usurios inexperientes


Desenvolvedores de aplicativos que acessam o BD

Por questes de segurana e privacidade

Grupos de usurios devem ter acesso a dados de interesse


O acesso a todo o banco de dados perigoso

Janelas sobre o banco de dados

Cada janela mostra parte do banco de dados


Diferentes vises

Vises (views)

Definidas sobre tabelas do banco de dados


Tabelas base

SQL Criando uma viso


create or replace view func_dep as (
select pnome || ' ' || minicial || ' ' || unome
as func, dnome as depart
from funcionario f, departamento d
where dnumero = dnr
);
create or replace view func_dep(func,depart) as (
select pnome || ' ' || minicial || ' ' || unome,
dnome
from funcionario f, departamento d
where dnumero = dnr
);

SQL Consultando uma viso


select funcionario
from func_dep
where funcionario like 'J%'
order by funcionario;

Vises (tabelas virtuais) em SQL


Conceito de uma viso em SQL:
Tabela nica geralmente derivada de outras tabelas.
Considerada como uma tabela virtual.

Usos
Simplifica a especificao de certas consultas.
Mecanismo de segurana e autorizao.

Comando CREATE VIEW


Define um nome de tabela, uma lista de nomes de
atributos e uma consulta para especificar o contedo da
viso.
A viso est sempre atualizada.
O comando DROP VIEW elimina uma viso.

SQL Vises
Definio de vises em SQL
CREATE VIEW nome_da_viso
[(nome_coluna {, nome_coluna })]
AS
subquery [WITH CHECK OPTION]

WITH CHECK OPTION


Especifica que atualizaes (INSERT ou UPDATE)
na tabela base s sero permitidas se
resultam em tuplas visveis para a viso

100

Vises (tabelas virtuais) em SQL

Vises (tabelas virtuais) em SQL

Implementao e atualizao de view


Tcnicas principais
1. Modificao de consulta
Modifica a consulta da view por uma consulta nas
tabelas base.
Desvantagem: Ineficiente para vises definidas por
consultas complexas.

Implementao e atualizao de view


Tcnicas principais
2. Materializao de view
Cria fisicamente uma tabela de view temporria quando a
view for consultada pela primeira vez.
Mantm essa tabela na suposio de que outras consultas
view acontecero em seguida.
Requer uma estratgia eficiente para atualizar
automaticamente a tabela de viso quando as tabelas base
so atualizadas.
Estratgias de atualizao incremental

O SGBD determina que tuplas novas devem ser inseridas,


removidas ou modificadas em uma tabela de viso
materializada.

Implementao e atualizao de view


Atualizao de viso complicada e pode ser
ambgua.
Atualizao em uma viso definida sobre uma nica
tabela sem funes agregadas.

Pode ser mapeada para uma atualizao na tabela


base.

Vises envolvendo junes

Frequentemente no possvel o SGBD determinar


qual das atualizaes pretendida.

Clusula WITH CHECK OPTION

Precisa ser acrescentada ao final da definio da viso,


se uma viso tiver de ser atualizada.

Atualizao de viso
Duas
atualizaes
possveis:

SQL Vises
Tipos de vises
Viso virtual
A definio da viso armazenada
Dados da viso no so persistentes

Sempre que referenciada


Os dados so materializados
Custo praticamente igual a cada materializao

Quanto ao acesso
Somente leitura
Vises que s permitem acesso de leitura

Permitem atualizao
Vises que permitem atualizaes nas tabelas base

SQL Vises
Tipos de vises (cont.)
Viso materializada
Dados e definio so persistentes
Problema de atualizao dos dados da viso

Sempre que h uma atualizao nas tabelas base da


viso
Recalculada
Atualizada
Com interveno humana
Automtica

Reduz custos de materializao de resultado


Vises somente para leitura
Aplicaes

Implementao Data Warehouse


Integrao de fontes de dados heterogneas
108

SQL Vises
Exemplos
Definindo vises
create view V1 (nome_departamento, nome_empregado)
as select d.nome,e.nome
from Departamento d inner join Empregado e
on d.id=e.id_dept
create view V2 (nome_empregado, nmero_de_dependentes)

as select e.nome, (select count(*) from Dependente


where
matr_resp=e.matr)
from Empregado e

create view V3 (matrcula, salrio)

as select nome,salrio
from Empregado
where salrio<700 with check option

SQL Vises
Exemplos

Acessando o banco de dados atravs de vises

select * from V1
select * from V2 where nmero_de_dependentes>2
select * from V3
matrcula
salrio
----------------------------------- -----------------------caio
500.0
rebeca
500.0

Atualizando o banco de dados atravs de vises


update v3 set salrio=salrio+100

select * from V3
matrcula
salrio
----------------------------------- -----------------------caio
600.0
rebeca
600.0

update v3 set salrio=salrio+150

Erro, pois as tuplas a serem


alteradas vo deixar de ser
visveis para V3

Instrues de alterao de esquema


Comandos de evoluo de esquema
Podem ser executados enquanto o banco de dados
est em operao.

No requerem recompilao do esquema.

Comando DROP
Usado para remover elementos nomeados do
esquema, como tabelas, domnios ou restries.
Tambm possvel remover um esquema.
Opes de comportament de DROP:
CASCADE capaz de remover o esquema e todas
as suas tabelas, domnios e outros elementos.
RESTRICT o esquema removido somente se
ele no tiver elementos.
O usurio deve remover individualmente cada
elemento no esquema, para depois remover o
prprio esquema.

Comando DROP

Comando ALTER
Permite a alterao da definio de uma tabela
da base ou de outros elementos de esquema
nomeados.
Aes de alterao de tabela incluem:
Adicionar ou remover uma coluna (atributo).
Alterar uma definio de coluna.
Adicionar ou remover restries de tabela.

Comando ALTER
Exemplos:

Resumo dos comandos SQL

Resumo dos comandos SQL

Resumo dos comandos SQL

OBS: Os comandos para criar e excluir ndices no fazem parte


do padro SQL.

Referncias
Elsmari, R., Navathe, Shamkant B. Sistemas
de Banco de Dados. 6 Edio, Pearson
Brasil, 2011. Captulo 5
Silberschatz, A., Korth, H., Sudarshan, S.
Sistema de Banco de Dados. 5 Edio,
Editora Campus, 2006.
Slides Prof. Jos Maria (UFC).

regispires@lia.ufc.br

Potrebbero piacerti anche