Prévia do material em texto
SQL Avançado
Regis Pires Magalhães
regispires@lia.ufc.br
Renomeação de atributos e relações
• Acrescentar o qualificador AS seguindo pelo
novo nome desejado.
• AS é usado para apelidar os nomes tanto do
atributo, quanto da relação.
Comparações envolvendo NULL
• Significados de NULL
▫ Valor desconhecido.
▫ Valor indisponível ou retido.
▫ Atributo não aplicável.
• Ao usar NULL em uma comparação, SQL usa
uma lógica de três valores para determinar se
uma expressão envolvendo AND, OR e NOT é
verdadeira ou falsa.
Conectivos lógicos na lógica de três
valores
Comparações 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 pertinência 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)
8
SQL
• Funções Agregadas
▫ Funções embutidas (built-in) aplicadas sobre uma coleção
de valores (colunas) do banco de dados
▫ sum
Retorna o somatório dos valores de uma coleção
▫ avg
Retorna a média dos valores de uma coleção
▫ max
Retorna o maior valor de uma coleção de valores
▫ min
Retorna o menor valor de uma coleção
▫ count
Retorna o número de elementos de uma coleção
▫ Sintaxe
nome-da-função (ALL | DISTINCT nome-coluna) | count(*)
Não podem ser utilizados na cláusula WHERE
SQL – Funções de agregação
• COUNT
▫ Retorna o número de tuplas ou valores.
• SUM, MAX, MIN e AVG
▫ Retornam, respectivamente, a soma, o valor
máximo, o valor mínimo e a média desses valores.
• Essas funções podem ser usadas nas cláusulas
SELECT ou HAVING.
SQL – Funções agregadas
select pnome funcionario, count(*) numero_depend
from funcionario, dependente
where cpf=fcpf
group by pnome;
SQL – Funções agregadas
• Achar a soma dos salários de todos os
funcionários, o salário máximo, o salário
mínimo e a média dos salários.
SQL – Funções agregadas
• Achar a soma dos salários de todos os funcionários do
departamento ‘Pesquisa’, bem como o salário máximo, o
salário mínimo e a média dos salários nesse departamento.
SQL – Funções agregadas
• Recuperar o número total de funcionários na
empresa.
SQL – Funções agregadas
• Recuperar o número de funcionários no
departamento ‘Pesquisa’.
SQL – Funções agregadas
• Contar o número de valores de salário distintos no
banco de dados.
16
SQL
• Exercícios
▫ Encontre o número de empregados lotados no
departamento de Informática
▫ Encontre o montante da folha de pagamento da
empresa
▫ Encontre o salário médio pago pela empresa
select count(*)
from Empregados as e, Departamentos as d
where e.id_dept=d.id and d.nome = ‘Informática’;
select sum(salario)
from Empregado
select avg(salario)
from Empregado
17
SQL
• Agrupando tuplas no SQL
▫ Aplicar funções agregadas a diferentes grupos de tuplas
▫ Exemplo
Listar a quantidade de empregados por departamento
▫ Cláusula
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 função count é aplicada
para o conjunto de tuplas
de cada grupo
SQL
• Agrupando tuplas no SQL (cont.)
▫ Todas colunas que aparecem na cláusula select têm
que aparecer na cláusula group by
Exceto os argumentos da funções 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- Funções agregadas
• Para cada departamento, recuperar o número do
departamento, o número de funcionários no
departamento e seu salário médio.
SQL – Funções agregadas
Agrupamento de tuplas FUNCIONARIO pelo valor de Dnr:
SQL- Funções agregadas
• Para cada projeto, recuperar o número do projeto, o
nome do projeto e o número de funcionários que
trabalham nesse projeto.
SQL- Funções agregadas
• Para cada projeto em que mais de dois funcionários
trabalham, recupere o número e o nome do projeto e o
número de funcionários que trabalham no projeto.
Após aplicar a cláusula WHERE, mas
antes de aplicar HAVING
Grupos não
selecionados
pela condição
HAVING
Após aplicar a condição da cláusula
HAVING
SQL – Funções agregadas
• Para cada projeto, recupere o número e o nome do projeto e
o número de funcionários do departamento 5 que trabalham
no projeto.
26
SQL
• Agrupando tuplas no SQL (cont.)
▫ Exemplos (cont.)
Listar maiores e menores salários de cada departamento
Totalizar a quantidade de itens vendidos por vendedor e por item,
considerando o seguinte esquema
Vendedor(matr, nome, salário)
Vendas(matr,cod_item,qtde, pr-venda,dt-hora-venda)
Estoque(cod_item, referência, pr_compra,pr_venda,qtde)
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
select v.nome, e.referência, 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.referência
27
SQL
• Selecionando grupos
▫ Listar nome dos departamentos cuja média salarial seja
maior que 7000
▫ Cláusula 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 cláusula where é avaliado primeiramente
Tuplas que satisfazem o predicado são agrupadas pelo group by
Predicado da cláusula having é avaliado
Grupos que satisfazem o predicado aparecem no resultado
28
SQL
• Selecionando grupos (cont.)
▫ Exemplos
Listar nome e média salarial dos departamentos que possuem
mais de 10 empregados lotados
Listar nome e quantidade de empregados dos departamentos
cuja média salarial é maior que 5000
select d.nome, avg(e.salario) as
Média_Salarial
from Departamento d, Empregado e
where d.cod_dep=e.lotacao
group by d.nome
having count(matr)>=11
select d.nome, count(*) as Número_Empregados
from Departamento d, Empregado e
where d.cod_dep=e.lotacao
group by d.nome
having avg(e.salario)>5000
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, salário)
Vendas(matr,cod_item,qtde, pr-venda,dt-hora-venda)
Estoque(cod_item, referência, 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 básica do comando SELECT
SELECT <lista de atributos e funções>
FROM <lista de tabelas>
[ WHERE <condição> ]
[ GROUP BY <atributos de agrupamento> ]
[ HAVING <condição de agrupamento> ]
[ ORDER BY <atributosde ordenação> ];
Consultas aninhadas
• Blocos select-from-where dentro da cláusula
WHERE de outra consulta (consulta externa).
Consultas aninhadas
Não aninhada
Consultas aninhadas
Aninhada
Consultas aninhadas
• Operador de comparação 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
comparações.
▫ Devem ser escritas entre parênteses.
select distinct Fcpf, pnr, horas
from trabalha_em
where (pnr,horas) in (
select pnr,horas
from trabalha_em, funcionario
where fcpf='12345678966'
);
36
SQL
• Consulta SQL aninhada (subconsulta)
▫ Consulta SQL especificada dentro de uma outra
consulta SQL
▫ Exemplo
Listar todos os empregados que têm salário maior que a
média salarial da empresa
select pnome,salario
from funcionario
where salario > (select avg(salario) from
funcionario);
37
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 cláusula
select e na cláusula 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;
38
SQL
• Consulta SQL aninhada (cont.)
▫ Usando o Predicado [NOT] IN
Listar os CPFs dos funcionários que trabalham
em projetos localizados em Maua.
select distinct fcpf
from trabalha_em
where pnr in (
select projnumero
from projeto
where projlocal='Maua'
);
Consultas aninhadas
• É possível o uso de um conjunto explícito de
valores na cláusula WHERE.
Consultas aninhadas
• Evite erros em ambiguidades criando apelidos (aliases) para
todas as tabelas referenciadas em uma consulta SQL.
Consultas aninhadas
SQL – Funções agregadas
• Para cada departamento que tem mais de cinco funcionários,
recuperar o número do departamento e o número de seus
funcionários que estão ganhando mais de R$ 40.000,00.
Consultas aninhadas
• Usar outros operadores de comparação 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 também 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 funcionários
cujo salário é maior do que o salário de todos os
funcionários no departamento 5.
Essa consulta também pode ser especificada usando a
função de agregação MAX.
48
SQL
• Consulta SQL aninhada (cont.)
▫ Predicados SOME, ANY e ALL
Listar empregados que ganham salários maior ou
igual a média salarial de um departamento
Sintaxe
expr {SOME | ANY | ALL} (subconsulta)
{<, <=,>, >=, =, <>}
select nome
from Empregado
where salário >=some (select avg(salário) from Empregado
group by lotação)
49
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
São equivalentes
ALL (subconsulta)
Retorna verdade se e somente se,
▫ Para todo elemento s retornado pela subconsulta,
expr s é verdade
Listar funcionários que ganham salários maior ou igual ao
maior salário 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);
50
SQL
• Consulta SQL aninhada (cont.)
▫ Predicados SOME, ANY e ALL (cont.)
Listar o departamento com maior média salarial
Não é permitido função agregada composta
select d.nome
from Empregado e, Departamento d
where d.cod_depart=e.lotação
group by d.nome
having avg(salário) >=all (select avg(salário) from Empregado
group by lotação)
Consultas aninhadas correlacionadas
• Ocorre quando uma consulta aninhada referencia
algum atributo de uma relação declarada na
consulta externa.
• Nesse caso, as duas consultas são chamadas
correlacionadas.
• A consulta aninhada é avaliada uma vez para cada
tupla (ou combinação de tuplas) na consulta
externa.
Consultas aninhadas correlacionadas
• EXISTS e NOT EXISTS
▫ Verifica se o resultado de uma consulta aninhada
correlacionada é vazio (não contém tuplas) ou não.
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 funcionários que não
possuem dependentes.
Consultas aninhadas correlacionadas
• Listar os nomes dos gerentes que possuem pelo
menos um dependente.
Consultas aninhadas correlacionadas
• Recuperar o nome de cada funcionário que trabalha
em todos os projetos controlados pelo departamento
5.
Consultas aninhadas correlacionadas
• Recuperar os nomes de todos os funcionários que
têm dois ou mais dependentes.
select pnome
from funcionario
where (
select count(*)
from dependente
where cpf = fcpf
) >= 2;
58
SQL
• Consulta SQL aninhada (cont.)
• Predicado EXISTS
• Verifica se o conjunto retornado por uma subconjunto é vazio ou
não
• 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
);
59
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 não é 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 média do departamento
select d.nome
from Departamento d
where exists (select * from Empregado e
where e.lotacao=d.cod_depart and
salário > (2*(select avg(salário) from Empregado
where lotação=e.lotação)))UNIQUE
• A função UNIQUE(C) retorna TRUE se não
houver tuplas duplicadas no resultado da
consulta C.
Junções
• Usuários podem especificar uma tabela
resultante de uma operação de junção na
cláusula FROM de uma consulta.
▫ Consulta a seguir tem uma única tabela de junção.
Junções
• Tipos
▫ NATURAL JOIN
Natural JOIN sobre duas relações R e S, nenhuma
condição de junção é especificada.
Cria-se uma condição EQUIJOIN implícita 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);
Junções
• Tipos
▫ NATURAL JOIN
Junções
• Inner join
▫ Tipo padrão de junção em uma tabela de junção.
▫ A tupla é incluída no resultado somente se uma
tupla correspondente existir na outra relação.
select pnome, dnome
from funcionario
inner join departamento
on dnr=dnumero;
select pnome, dnome
from funcionario, departamento
where dnr=dnumero;
Explícito
Implícito
Junções
• LEFT OUTER JOIN
▫ Toda tupla na tabela esquerda deve aparecer no
resultado.
▫ Se não 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;
Junções
Junções
Junções
• RIGHT OUTER JOIN
▫ Toda tupla na tabela direita deve aparecer no
resultado.
▫ Se não 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;
Junções
• 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;
Junções
• Sintaxe do Oracle:
▫ += LEFT OUTER JOIN
▫ =+ RIGHT OUTER JOIN
▫ +=+ FULL OUTER JOIN
Junções
• Múltiplas junções em uma mesma consulta.
72
SQL
• Formas de Junção em SQL Avançado
▫ Listar nomes dos empregados e os nomes dos
seus departamentos.
select d.nome
from Empregado as e, Departamento as d
where d.id =e.id_dept
produto cartesiano projeção
seleção
d.nome(d.id=e.id_dept(Departamento x Empregado))
Departamento
d.id=e.id_dept
Empregado
73
SQL
• Formas de Junção em SQL Avançado (cont.)
▫ Sintaxe da cláusula FROM
[ FROM {<tabela_fonte>} [,...n] ]
<table_fonte> ::=
nome_tabela [ [AS] qualificador ]
| <tabela_fonte> <tipo_junção> <tabela_fonte> ON
<condição_junção>
<tipo_junção> ::=
[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ] [ <join_hint> ]
JOIN
74
SQL
• Formas de Junção em SQL Avançado (cont.)
▫ Sintaxe da cláusula FROM (cont.)
Tipos de junção
Junção theta
▫ INNER JOIN
Junção externa à esquerda
▫ LEFT OUTER JOIN
Junção externa à direita
▫ RIGHT OUTER JOIN
Junção externa completa
▫ FULL OUTER JOIN
▫ Junção 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
75
SQL
• Formas de Junção em SQL Avançado (cont.)
Junção Externa (OUTER JOIN)
Adicionar tuplas extras ao resultado de uma
junção natural
76
SQL
• Formas de Junção em SQL Avançado
(cont.)
▫ LEFT OUTER JOIN
Calcula o resultado da junção
Adiciona ao resultado da junção
▫ Tuplas da relação à esquerda que não satisfazem a
condição de junção
▫ Atribui valores nulos aos atributos não 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 não possua dependente.
77
SQL
• Formas de Junção em SQL Avançado (cont.)
▫ RIGHT OUTER JOIN
Calcula o resultado da junção
Adiciona ao resultado da junção
▫ Tuplas da relação à direita que não satisfazem a condição
de junção
▫ Atribui valores nulos aos atributos não 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 não possua dependente.
78
SQL
• Formas de Junção em SQL Avançado (cont.)
▫ FULL OUTER JOIN
Calcula o resultado da junção
Adiciona ao resultado da junção
▫ Tuplas das relações envolvidas na junção que não satisfazem a
condição de junção
▫ Atribui valores nulos aos atributos não 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 não possua
departamento. Da mesma forma, o nome do departamento deve
ser exibido mesmo que ele não tenha empregados.
O MySQL não implementa o FULL OUTER JOIN. A alternativa é fazer
a união (UNION) dos resultados do LEFT OUTER JOIN com os
resultados do RIGHT OUTER JOIN.
Especificando restrições como asserções
• CREATE ASSERTION
▫ Especifica tipos adicionais de restrições que estão
fora do escopo das restrições embutidas do
modelo relacional (chaves primária e única,
integridade de entidade e integridade referencial).
▫ Essas restrições podem ser especificadas dentro
do comando CREATE TABLE.
Especificando restrições como asserções
• CREATE ASSERTION
▫ Especifica uma consulta que seleciona as tuplas que
violam a condição desejada.
▫ Sempre que alguma tupla no BD fizer com que a
condição de um comando ASSERTION seja avaliada
como FALSE, a restrição é violada.
▫ As cláusulas CHECK sobre atributos, domínios e
tuplas individuais são verificadas somente quando as
tuplas são inseridas ou atualizadas.
A verificação de restrição é mais eficiente nesses casos.
Usar CREATE ASSERTION somente nos casos em que
não seja possível usar CHECK em atributos e domínios.
O PostgreSQL ainda não implementa CREATE ASSERTION.
Especificando restrições como asserções
• O salário de um funcionário não pode ser maior
que o salário do gerente do departamento para o
qual o funcionário trabalha.
Especificando ações como triggers
• Bancos de dados ativos oferecem funcionalidades para
especificar regras ativas.
• Essas regras podem ser disparadas automaticamente por
eventos e podem iniciar certas ações especificadas na
declaração da regra para que ocorram se certas condições
forem atendidas.
• Funcionalidades fornecidas pelos bancos de dados ativos
estão disponíveis na forma de triggers (gatilhos), que faz
parte da SQL-99 e de padrões mais recentes.
• Triggers (gatilhos) são regras que especificam ações que
são disparadas automaticamente por certos eventos.
Especificando ações como triggers
• Modelo usado para especificar regras de banco de dados ativo é
conhecido como modelo Evento-Condição-Ação (ECA).
• Uma regra no modelo ECA tem três componentes:
1. O(s) evento(s) que dispara(m) a regra.
Esses eventos normalmente são operações de atualização do banco de dados que
são aplicadas explicitamente ao banco de dados.
2. A condição que determina se ação da regra deve ser executada.
Quando o evento que dispara a ação tiver ocorrido, uma condição opcional pode
ser avaliada.
Se nenhuma condição for especificada, a ação será executada quando ocorrer o
evento.
Se uma condição for especificada, ela é primeiro avaliada e, somente se for
avaliada como verdadeira, a ação da regra será executada.
A condição é especificada na cláusula WHEN de um trigger.3. A ação a ser tomada.
A ação normalmente é uma sequência de comandos SQL, mas também poderia
ser uma transação do banco de dados ou um programa externo que será
executado automaticamente.
Especificando ações como triggers
• CREATE TRIGGER
▫ Especifica ações automáticas que serão realizadas
quando certos eventos e condições ocorrerem.
▫ Comando usado para monitorar o banco de dados
e disparar determinadas ações quando for
satisfeita.
▫ Uma trigger típica possui três componentes:
Evento(s)
Condição
Ação
Especificando ações como triggers
• A sintaxe geral resumida para criação de um
trigger no sistema Oracle é a seguinte:
CREATE TRIGGER <nome trigger>
(AFTER | BEFORE) <evento trigger> ON <nome tabela>
[ FOR EACH ROW ]
[ WHEN <condição> ]
<ações da trigger>;
Especificando ações 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 ações como triggers
• No PostgreSQL é preciso inicialmente criar uma
função que retorna uma trigger.
▫ Essa função 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 ações 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 ações 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 'Inserção do departamento com gerente % não pode
ser realizada, pois não 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 ações 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 ações como triggers
• CREATE TRIGGER
▫ A cláusula BEFORE ou AFTER especifica que a regra será disparada
antes ou depois, respectivamente, que ocorrerem os eventos que
disparam a regra.
▫ Os eventos básicos que podem ser definidos para disparar as regras
são INSERT, DELETE e UPDATE.
No caso de UPDATE, podem-se especificar os atributos a serem
atualizados.
▫ A cláusula ON determina a relação em que a regra é especificada.
▫ A cláusula 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 nível de linha.
▫ A cláusula FOR EACH STATEMENT indica o uso de uma trigger em
nível de comando que dispara a regra apenas uma vez, mesmo que
várias tuplas sejam afetadas pelo evento de disparo.
Especificando ações como triggers
• CREATE TRIGGER
▫ A trigger pode especificar nomes de variável de tupla em
particular para as tuplas antigas e novas.
Dentro da cláusula REFERENCING, nomeamos variáveis de
tupla (apelidos) para nos referirmos à(s) tupla(s) OLD (antes
da modificação) e à(s) tupla(s) NEW (após a modificação),
respectivamente.
▫ A cláusula WHEN é usada para especificar quaisquer
condições que precisam ser verificadas após a regra ser
disparada, mas antes que a ação seja executada.
A ação especificada após a condição pode ser um comando
SQL ou uma sequência de comandos SQL delimitados por
BEGIN e END.
Especificando ações como triggers
• Usando SQL99, atualizar o total salarial de um
departamento a cada atualização de salário de
um funcionário 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 ações como triggers
Comandos de controle de transação
• SQL também possui comandos de controle de transação.
• Estes são usados para especificar unidades de
processamento de banco de dados para fins de controle de
concorrência e recuperação.
• Comandos:
▫ BEGIN
Inicia um bloco de transação.
▫ COMMIT
Confirma a transação corrente.
▫ ROLLBACK
Aborta e desfaz as operações realizadas na transação corrente.
SQL – Visões
• Acesso a um banco de dados
▫ Requer conhecimento do esquema
Indesejável
Para usuários inexperientes
Desenvolvedores de aplicativos que acessam o BD
▫ Por questões de segurança e privacidade
Grupos de usuários 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 visões
▫ Visões (views)
Definidas sobre tabelas do banco de dados
Tabelas base
SQL – Criando uma visão
create or replace view func_dep(func,depart) as (
select pnome || ' ' || minicial || ' ' || unome,
dnome
from funcionario f, departamento d
where dnumero = dnr
);
create or replace view func_dep as (
select pnome || ' ' || minicial || ' ' || unome
as func, dnome as depart
from funcionario f, departamento d
where dnumero = dnr
);
SQL – Consultando uma visão
select funcionario
from func_dep
where funcionario like 'J%'
order by funcionario;
Visões (tabelas virtuais) em SQL
• Conceito de uma visão em SQL:
▫ Tabela única geralmente derivada de outras tabelas.
▫ Considerada como uma tabela virtual.
• Usos
▫ Simplifica a especificação de certas consultas.
▫ Mecanismo de segurança e autorização.
• Comando CREATE VIEW
▫ Define um nome de tabela, uma lista de nomes de
atributos e uma consulta para especificar o conteúdo da
visão.
▫ A visão está sempre atualizada.
▫ O comando DROP VIEW elimina uma visão.
100
SQL – Visões
• Definição de visões em SQL
CREATE VIEW nome_da_visão
[(nome_coluna {, nome_coluna …})]
AS
subquery [WITH CHECK OPTION]
WITH CHECK OPTION
Especifica que atualizações (INSERT ou UPDATE)
na tabela base só serão permitidas se
▫ resultam em tuplas visíveis para a visão
Visões (tabelas virtuais) em SQL
Visões (tabelas virtuais) em SQL
Implementação e atualização de view
• Técnicas principais
1. Modificação de consulta
Modifica a consulta da view por uma consulta nas
tabelas base.
Desvantagem: Ineficiente paravisões definidas por
consultas complexas.
Implementação e atualização de view
• Técnicas principais
2. Materialização de view
Cria fisicamente uma tabela de view temporária quando a
view for consultada pela primeira vez.
Mantém essa tabela na suposição de que outras consultas
à view acontecerão em seguida.
Requer uma estratégia eficiente para atualizar
automaticamente a tabela de visão quando as tabelas base
são atualizadas.
Estratégias de atualização incremental
▫ O SGBD determina que tuplas novas devem ser inseridas,
removidas ou modificadas em uma tabela de visão
materializada.
Implementação e atualização de view
• Atualização de visão é complicada e pode ser
ambígua.
• Atualização em uma visão definida sobre uma única
tabela sem funções agregadas.
▫ Pode ser mapeada para uma atualização na tabela
base.
• Visões envolvendo junções
▫ Frequentemente não é possível o SGBD determinar
qual das atualizações é pretendida.
• Cláusula WITH CHECK OPTION
▫ Precisa ser acrescentada ao final da definição da visão,
se uma visão tiver de ser atualizada.
Atualização de visão
Duas
atualizações
possíveis:
SQL – Visões
• Tipos de visões
▫ Visão virtual
A definição da visão é armazenada
Dados da visão não são persistentes
Sempre que referenciada
Os dados são materializados
▫ Custo praticamente igual a cada materialização
Quanto ao acesso
Somente leitura
▫ Visões que só permitem acesso de leitura
Permitem atualização
▫ Visões que permitem atualizações nas tabelas base
108
SQL – Visões
• Tipos de visões (cont.)
▫ Visão materializada
Dados e definição são persistentes
Problema de atualização dos dados da visão
Sempre que há uma atualização nas tabelas base da
visão
Recalculada
Atualizada
▫ Com intervenção humana
▫ Automática
Reduz custos de materialização de resultado
Visões somente para leitura
Aplicações
Implementação Data Warehouse
Integração de fontes de dados heterogêneas
SQL – Visões
• Exemplos
▫ Definindo visões
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, número_de_dependentes)
as select e.nome, (select count(*) from Dependente
where matr_resp=e.matr)
from Empregado e
create view V3 (matrícula, salário)
as select nome,salário
from Empregado
where salário<700 with check option
SQL – Visões
• Exemplos
▫ Acessando o banco de dados através de visões
select * from V1
select * from V2 where número_de_dependentes>2
select * from V3
matrícula salário
----------------------------------- ------------------------
caio 500.0
rebeca 500.0
▫ Atualizando o banco de dados através de visões
update v3 set salário=salário+100
select * from V3
matrícula salário
----------------------------------- ------------------------
caio 600.0
rebeca 600.0
update v3 set salário=salário+150 Erro, pois as tuplas a serem
alteradas vão deixar de ser
visíveis para V3
Instruções de alteração de esquema
• Comandos de evolução de esquema
▫ Podem ser executados enquanto o banco de dados
está em operação.
• Não requerem recompilação do esquema.
Comando DROP
• Usado para remover elementos nomeados do
esquema, como tabelas, domínios ou restrições.
• Também é possível remover um esquema.
• Opções de comportament de DROP:
▫ CASCADE capaz de remover o esquema e todas
as suas tabelas, domínios e outros elementos.
▫ RESTRICT o esquema é removido somente se
ele não tiver elementos.
O usuário deve remover individualmente cada
elemento no esquema, para depois remover o
próprio esquema.
Comando DROP
Comando ALTER
• Permite a alteração da definição de uma tabela
da base ou de outros elementos de esquema
nomeados.
• Ações de alteração de tabela incluem:
▫ Adicionar ou remover uma coluna (atributo).
▫ Alterar uma definição de coluna.
▫ Adicionar ou remover restrições 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 não fazem parte
do padrão SQL.
Referências
• Elsmari, R., Navathe, Shamkant B. “Sistemas
de Banco de Dados”. 6ª Edição, Pearson
Brasil, 2011. Capítulo 5
• Silberschatz, A., Korth, H., Sudarshan, S.
“Sistema de Banco de Dados”. 5ª Edição,
Editora Campus, 2006.
• Slides Prof. José Maria (UFC).
regispires@lia.ufc.br