Upload
frankson-fernandes
View
92
Download
2
Embed Size (px)
DESCRIPTION
FBD 08 SQL Avancado
Citation preview
SQL Avanado
Regis Pires Magalhes [email protected]
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)
8
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
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.
16
SQL
Exerccios Encontre o nmero de empregados lotados no
departamento de Informtica
Encontre o montante da folha de pagamento da empresa
Encontre o salrio mdio pago pela empresa
select count(*)
from Empregados as e, Departamentos as d
where e.id_dept=d.id and d.nome = Informtica;
select sum(salario) from Empregado
select avg(salario) from Empregado
17
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
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.
26
SQL
Agrupando tuplas no SQL (cont.) Exemplos (cont.)
Listar maiores e menores salrios de cada departamento
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 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.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
27
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
28
SQL
Selecionando grupos (cont.) Exemplos
Listar nome e mdia salarial dos departamentos que possuem mais de 10 empregados lotados
Listar nome e quantidade de empregados dos departamentos cuja mdia salarial maior que 5000
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
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
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 FROM [ WHERE ] [ GROUP BY ] [ HAVING ] [ ORDER BY ];
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' );
36
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);
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 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;
38
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' );
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): >, >=,
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
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.
48
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)
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 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);
50
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)
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;
58
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
);
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 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)))
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;
select pnome, dnome from funcionario, departamento where dnr=dnumero;
Explcito
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.
72
SQL Formas de Juno em SQL Avanado
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 projeo
seleo
d.nome(d.id=e.id_dept(Departamento x Empregado))
Departamento d.id=e.id_dept
Empregado
73
SQL Formas de Juno em SQL Avanado (cont.)
Sintaxe da clusula FROM [ FROM {} [,...n] ]
::=
nome_tabela [ [AS] qualificador ]
| ON
::= [ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ] [ ] JOIN
74
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
75
SQL Formas de Juno em SQL Avanado (cont.)
Juno Externa (OUTER JOIN) Adicionar tuplas extras ao resultado de uma
juno natural
76
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.
77
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.
78
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.
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.
Esses eventos normalmente so operaes de atualizao do banco de dados que
so aplicadas explicitamente ao banco de dados.
2. A condio que determina se ao da regra deve ser executada.
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.
3. 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 (AFTER | BEFORE) ON [ FOR EACH ROW ] [ WHEN ] ;
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(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 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.
100
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
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
108
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
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
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).