Você está na página 1de 17

BD II - TADS

BD II - TADS

Junes
BD II - TADS

Juno de Tabelas

Uma tabela juntada uma tabela derivada de outras duas tabelas (reais
ou derivadas), de acordo com as regras do tipo particular de juno. Esto
disponveis as junes internas, externas e cruzadas.
BD II - TADS

CREATE TABLE t1 (
num INTEGER,
nome VARCHAR (5));

CREATE TABLE t2 (
num INTEGER,
valor VARCHAR (5));

INSERT INTO t1 VALUES (1,'a');


INSERT INTO t1 VALUES (2,'b');
INSERT INTO t1 VALUES (3,'c');

INSERT INTO t2 VALUES (1,'xxx');


INSERT INTO t2 VALUES (3,'yyy');
INSERT INTO t2 VALUES (5,'zzz');
BD II - TADS

Juno Cruzada

Para cada combinao de linhas de T1 e T2, a tabela derivada contm


uma linha formada por todas as colunas de T1 seguidas por todas as
colunas de T2. Se as tabelas possurem N e M linhas,
respectivamente, a tabela juntada ter N * M linhas.

SELECT * FROM t1 CROSS JOIN t2;


BD II - TADS

INNER JOIN

Para cada linha L1 de T1, a tabela juntada possui uma linha de T2 que
satisfaz a condio de juno com L1.

SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num;

SELECT * FROM t1 INNER JOIN t2 USING (num);


BD II - TADS

LEFT OUTER JOIN

Primeiro, realizada uma juno interna. Depois, para cada linha de T1 que no
satisfaz a condio de juno com nenhuma linha de T2, adicionada uma linha
juntada com valores nulos nas colunas de T2. Portanto, a tabela juntada possui,
incondicionalmente, no mnimo uma linha para cada linha de T1.

SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num;

SELECT * FROM t1 LEFT JOIN t2 USING (num);


BD II - TADS

RIGHT OUTER JOIN

Primeiro, realizada uma juno interna. Depois, para cada linha de T2 que no
satisfaz a condio de juno com nenhuma linha de T1, adicionada uma linha
juntada com valores nulos nas colunas de T1. o oposto da juno esquerda: a tabela
resultante possui, incondicionalmente, uma linha para cada linha de T2.

SELECT * FROM t1 RIGHT JOIN t2 ON t1.num = t2.num;

SELECT * FROM t1 RIGHT JOIN t2 USING (num);


BD II - TADS

FULL OUTER JOIN

Primeiro, realizada uma juno interna. Depois, para cada linha de T1 que no
satisfaz a condio de juno com nenhuma linha de T2, adicionada uma linha
juntada com valores nulos nas colunas de T2. Tambm, para cada linha de T2 que no
satisfaz a condio de juno com nenhuma linha de T1, adicionada uma linha
juntada com valores nulos nas colunas de T1.

SELECT * FROM t1 FULL JOIN t2 ON t1.num = t2.num;


BD II - TADS

TRIGGER
BD II - TADS

TRIGGER

Gatilho ou trigger um recurso de programao executado


sempre que o evento associado ocorrer.
Trigger um tipo especial de procedimento armazenado, que
executado sempre que h uma tentativa de modificar os
dados de uma tabela que protegida por ele.
BD II - TADS

CREATE TABLE alterada(


cod SERIAL PRIMARY KEY,
valor VARCHAR(50)
);

CREATE TABLE log(


cod SERIAL PRIMARY KEY,
data DATE,
autor VARCHAR(20),
alteracao VARCHAR(6)
);
BD II - TADS

A funo de gatilho deve ser declarada


como uma funo que no recebe
argumentos e que retorna o tipo TRIGGER.
Aps criar a funo de gatilho,
estabelecemos o gatilho pelo comando
CREATE TRIGGER.
BD II - TADS

Criando a funo que ser executada ao ser acionada a TRIGGER:

CREATE FUNCTION gera_log() RETURNS TRIGGER AS


$$
BEGIN
INSERT INTO log (data, autor, alteracao) VALUES (now(), user, TG_OP);
RETURN new;
END;
$$ LANGUAGE 'plpgsql';
BD II - TADS

Sintaxe:

CREATE TRIGGER nome { BEFORE | AFTER } { evento


[ OR ... ] }
ON tabela [ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE PROCEDURE nome_da_funo
( argumentos )

evento um entre INSERT, UPDATE ou DELETE;

especifica o evento que dispara o gatilho. Vrios eventos podem ser especificados
utilizando OR.
BD II - TADS

Criando o gatilho que liga a funo a um evento ocorrido na tabela:

CREATE TRIGGER tr_gera_log AFTER INSERT OR UPDATE OR DELETE ON


alterada
for each row execute procedure gera_log();
BD II - TADS

INSERT INTO alterada VALUES (DEFAULT,'PRIMEIRA LINHA');

UPDATE alterada SET valor = 'NOVO VALOR' WHERE cod = 1;

DELETE FROM alterada WHERE cod = 1;

SELECT * FROM log;

Vamos testar ????