sql – select avançado

12
04/05/2012 1 SQL – Select Avançado Equi-Junção (junção por igualdade) É definido como sendo o relacionamento existente entre duas ou mais tabelas, pois os valores de colunas das tabelas são iguais; A Equi-junção é possível apenas quando for definido de forma adequada a chave estrangeira de uma tabela e sua referencia a chave primaria da tabela precedente; Equi-Junção (junção por igualdade) Ex.: listar o nome do cinema e a sua respectiva cidade: SELECT nome_cinema AS “Cinema”, cinema.cod_cidade, cidade.nome_cidade AS “Cidade” FROM cinema, cidade WHERE cidade.cod_cidade = cinema.cod_cidade Select nome_cidade as “Cidade”, nome_estado as “Estado”, sigla_estado as “UF” from estado, cidade where estado.cod_estado = cidade.cod_estado As junções SQL são utilizadas quando precisamos selecionar dados de duas ou mais tabelas. Exemplo: Selecionar o nome das Cidades, nome dos seus respectivos Estados e a Sigla: Listar o nome dos cinemas, nome da cidade correspondente a cada cinema e o nome do estado correspondente a cidade selecionada. Desafio: SELECT nome_cinema as "Cinema", nome_cidade as "Cidade",nome_estado as "Estado" FROM cinema, cidade, estado WHERE cinema.cod_cidade = cidade.cod_cidade and cidade.cod_estado = estado.cod_estado Resposta:

Upload: tiago-cavalcante

Post on 24-Jul-2015

259 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: SQL – Select Avançado

04/05/2012

1

SQL – Select Avançado

Equi-Junção (junção por igualdade)

• É definido como sendo o relacionamento existente entreduas ou mais tabelas, pois os valores de colunas dastabelas são iguais;

• A Equi-junção é possível apenas quando for definido deforma adequada a chave estrangeira de uma tabela e suareferencia a chave primaria da tabela precedente;

Equi-Junção (junção por igualdade)

Ex.: listar o nome do cinema e a sua respectiva cidade:

SELECT nome_cinema AS “Cinema”, cinema.cod_cidade, cidade.nome_cidade AS “Cidade”FROM cinema, cidadeWHERE cidade.cod_cidade = cinema.cod_cidade

Select nome_cidade as “Cidade”, nome_estado as “Estado”, sigla_estado as “UF”from estado, cidadewhere estado.cod_estado = cidade.cod_estado

As junções SQL são utilizadas quando precisamos selecionar dados de duas ou maistabelas.

Exemplo: Selecionar o nome das Cidades, nome dos seus respectivos Estados e a Sigla:

Listar o nome dos cinemas, nome dacidade correspondente a cada cinema e onome do estado correspondente a cidadeselecionada.

Desafio:

SELECT nome_cinema as "Cinema", nome_cidade as"Cidade",nome_estado as "Estado"FROM cinema, cidade, estadoWHERE cinema.cod_cidade = cidade.cod_cidade and

cidade.cod_estado = estado.cod_estado

Resposta:

Page 2: SQL – Select Avançado

04/05/2012

2

Exercícios:1. Liste o nome dos atores cuja nacionalidade seja “Brasileira”.2. Liste o nome do filme, a censura e o pais de origem que

pertençam ao gênero “Suspense”.3. Liste o nome do filme e o nome do gênero.4. Liste o nome do ator e o nome dos filmes onde esse ator

participou.5. Conte o numero de filmes em que cada ator participou.6. Liste o nome dos filmes que estão em cartaz + o nome do cinema

e + o nome da cidade + data inicial e data final. Levar emconsideração que a data de encerramento do filme seja menorque a data atual.

7. Liste o nome dos filmes que estão em cartaz + o nome do cinemae + nome dos atores que participam dos filmes.

Analisando a situação abaixo:

MER

Construindo as tabelas físicas no banco de dados:

Vendedor

Cod_Vendedor Nome_vendedor

Integer – PK Varchar(30) - NN

Cliente

Cod_Cliente Nome_cliente Status

Integer – PK Varchar(30) - NN Char(1) - NN

Produto

Cod_Produto Nome_Produto Qtde_estoque

Integer – PK Varchar(30) - NN Integer

Venda

Cod_Venda Cod_cliente Cod_vendedor Data

Integer – PK Integer - FK Integer - FK Date

Itens_Venda

Cod_Ivenda Cod_Venda Cod_produto Qtde_vendida

Integer – PK Integer- FK Integer – FK Numeric(8,2)

Inserindo dados:

Vendedor

Cod_Vendedor Nome 58 João dos Santos78 Maria das Dores100 Humberto Silva

Cliente

Cod_Cliente Nome_Cliente Status100 Fabrício Santos I250 Carolina da Cruz A340 Ângelo Fonseca A

Produto

Cod_Produto Nome_Produto Qtde_Estoque546 Arroz 100897 Feijao 500713 Farinha 20256 Acucar 80456 Leite 45

Venda

Cod_Venda Cod_Cliente Cod_Vendedor123 100 58569 250 100789 250 78457 100 100

Itens_ Venda

Cod_IVenda Cod_Venda Cod_Produto Qtde_Vendida

100 123 546 2101 123 897 3102 569 546 5103 569 713 5104 569 256 8105 457 713 2

Usando JOIN

As junções com JOIN podem ser de dois tipos:▫ as INNER JOINS e as OUTER JOINS (LEFT JOIN, RIGHT JOIN ouFULL JOIN)

INNER JOIN

Page 3: SQL – Select Avançado

04/05/2012

3

INNER JOINS: seleciona apenas osregistros em comum entre AS DUAS

TABELAS.

SELECT Vendedor.nome_vendedor AS "Nome do Vendedor", cliente.nome_cliente AS "Nome do Cliente"

From VendedorINNER JOIN venda ON venda.cod_vendedor = Vendedor.cod_vendedorINNER JOIN cliente ON cliente.cod_cliente = venda.cod_cliente

SELECT nome_cinemaAS "Cinema", nome_cidade AS "Cidade"FROM cidadeINNER JOIN cinema ON cidade.cod_cidade = cinema.cod_cidade

Usando INNER JOIN em mais tabelas....

SELECT Vendedor.nome_vendedor AS "Nome do Vendedor", cli.nome_clienteAS "Nome do Cliente"from vendedorINNER JOIN venda ON vendedor.cod_vendedor = Venda.cod_vendedorINNER JOIN cliente AS CLI ON Venda.cod_cliente = cli.cod_clienteORDER BY nome_cliente

SELECT nome_cinema AS "Nome do Cinema", nome_cidade AS "Nome da Cidade", nome_estado AS "Nome do Estado", sigla_estado AS "UF"FROM cinemaINNER JOIN cidade ON cidade.cod_cidade = cinema.cod_cidadeINNER JOIN estado ON estado.cod_estado = cidade.cod_estadoORDER BY nome_cidade

SELECT cliente.nome_clienteAS "Nome do Cliente", produto.nome_produto AS "Nome do Produto"

from clienteinner join venda inner join itens_venda inner join produtoon venda.cod_cliente = cliente.cod_clienteon itens_venda.cod_venda = venda.cod_vendaon itens_venda.cod_produto = produto.cod_produto

Usando INNER JOIN em mais tabelas....

Select cliente.nome_cliente as "Nome do Cliente", produto.nome_produto as "Nome do Produto"from clienteinner join venda on venda.cod_cliente = cliente.cod_clienteinner join itens_venda on itens_venda.cod_venda = venda.cod_vendainner join produto on itens_venda.cod_produto = produto.cod_produto

Usando INNER JOIN SELECT cliente.nome_clienteAS "Nome do Cliente", vendedor.nome_vendedorAS "Nome do

Vendedor", produto.nome_produto as "Nome do Produto"FROM vendedorINNER JOIN venda INNER JOIN cliente INNER JOIN itens_venda INNER JOIN produtoON venda.cod_vendedor = vendedor.cod_vendedorON venda.cod_cliente = cliente.cod_clienteON venda.cod_venda = itens_venda.cod_vendaON itens_venda.cod_produto = produto.cod_produto

Select cliente.nome_cliente as "Nome do Cliente", produto.nome_produto as "Nome do Produto", vendedor.nome as "Nome do Vendedor"

from clienteinner join venda on venda.cod_cliente = cliente.cod_clienteinner join vendedor on vendedor.cod_vendedor = venda.cod_vendedorinner join itens_venda on itens_venda.cod_venda = venda.cod_vendainner join produto on itens_venda.cod_produto = produto.cod_produto

Usando INNER JOIN

Select titulo as "Titulo do Filme", nome_genero as "Genero do Filme"From filmes as filInner join genero on genero.cod_Genero = fil.cod_genero

Atividade:

1. Selecionar o nome dos filmes, o nome do gênero e duração dos filmes que estão em cartaz nos cinemas da cidade Umuarama.

2. Selecionar o nome dos filmes e o nome dos cinemas onde os mesmos estejam em cartaz. Devera ser levado em conta somente os filmes classificados no gênero de suspense. Ordenar os registros por nome de filme.

3. Listar o nome dos cinemas da cidade de Maringá e o nome dos filmes que estão em cartaz apenas do gênero “Suspense”.

1. Listar todos produtos que foram adquiridos pelo cliente “Fabricio Santos”.2. Listar todos os clientes que compraram o produto “Arroz”.3. Listar o nome dos clientes, nome dos produtos, data da venda e quantidade vendida

para todas as vendas efetuadas.

Page 4: SQL – Select Avançado

04/05/2012

4

Outras formas de usar inner joins...

select nome_cinema, nome_cidadefrom cidadeINNER JOIN cinema USING (cod_cidade)

select nome_cinema, nome_cidadefrom cidadeJOIN cinema USING (cod_cidade)

Select titulo as "Titulo do Filme", nome_genero as "Genero do Filme"From filmes JOIN genero USING (cod_genero)

Ou...

Conexão Natural

Conexões naturais são utilizadas somente quando a coluna a qual se esta conectadopossui o mesmo nome nas duas tabelas.

... também é uma conexão interna

SELECT nome_cinema, nome_cidade, nome_estadoFROM estadoNATURAL JOIN cidadeNATURAL JOIN cinema

Exemplos:

Select nome_ator as "Nome do Ator", titulo as "Nome do Filme"from atoresNATURAL JOIN elencoNATURAL JOIN filmes

Relacione o nome dos atores e o filme que cada um participou:

Select titulo as "Nome do Filme", nome_cinema as "Nome do Cinema", nome_cidade as "Nome da Cidade"from cinemaNATURAL JOIN filme_cartazNATURAL JOIN filmesNATURAL JOIN cidade

Listar os filmes que estão em cartaz, ocinema onde os mesmos estão em cartaz e acidade de cada cinema.

Select titulo as "Nome do Filme", nome_cinema as "Nome do Cinema", nome_cidade as "Nome da Cidade"from cinemaNATURAL JOIN filme_cartazNATURAL JOIN filmesNATURAL JOIN cidadeWHERE cidade.cod_cidade = 1

Tarefa:

1. Listar o nome do cliente, nome do vendedor e a data de cada venda realizada.2. Listar o nome do cliente, nome do vendedor, data de venda e o nome dos

produtos vendidos.3. Listar todos os clientes e a data de venda apenas dos clientes que compraram

“feijão”.4. Listar todos os clientes, vendedor e produto que foram vendidos na data de

28/06/2011.

OUTER JOINS

Usando OUTER JOINS Retornam todas as linhas de uma das tabelas bemcomo as informações compatíveis de outra tabela.

Junções externas....

� LEFT OUTER JOIN.� RIGHT OUTER JOIN.� FULL OUTER JOIN.

Page 5: SQL – Select Avançado

04/05/2012

5

LEFT JOIN

• Somente os registros da tabela da esquerda (left) serão retornados,tendo ou não registros relacionados na tabela da direita;• A conexão externa esquerda combina cada linha na tabela esquerdacom uma linha na tabela direita.• A tabela à esquerda do operador de junção exibirá cada um dos seusregistros, enquanto que a da direita exibirá somente seus registrosque tenham correspondentes aos da tabela da esquerda.• Para os registros da direita que não tenham correspondentes naesquerda serão colocados valores NULL.• Utilizada quando temos um relacionamento um-para-muitos.

Exemplo: LEFT JOIN

SELECT vendedor.nome_vendedorAS "Nome do Vendedor", cod_venda

FROM vendedor

LEFT OUTER JOIN venda ON vendedor.cod_vendedor = Venda.cod_vendedor

Selecionar todos os vendedores cadastrados e as vendasrealizadas pelos mesmos.

A tabela que vem depois de FROM e ANTESdo LEFT é a tabela ESQUERDA, e a tabela que vem DEPOIS da conexão é a tabela

DIREITA.

DireitaEsquerda

SELECT vendedor.nome_vendedor AS "Nome do Vendedor", cod_vendaFROM vendaLEFT OUTER JOIN vendedor ON venda.cod_vendedor = Vendedor.cod_vendedor

Selecionar todos os vendedores cadastrados eas vendas realizadas pelos mesmos.

SELECT vendedor.nome_vendedor AS "Nome do Vendedor", cod_vendaFROM vendedorLEFT OUTER JOIN venda using (cod_vendedor)

Assim o resultado fica correto....

SELECT vendedor.cod_vendedor, vendedor.nome_vendedor AS "Nome do Vendedor", cliente.cod_cliente,cliente.nome_cliente AS "Nome do Cliente"

from vendedor

LEFT JOIN venda ON vendedor.cod_vendedor = Venda.cod_vendedor

LEFT JOIN cliente ON venda.cod_cliente = cliente.cod_cliente

ORDER BY nome_cliente

Exemplo: LEFT JOIN

SELECT vendedor.cod_vendedor, vendedor.nome_vendedor AS "Nome do Vendedor", cliente.cod_cliente, cliente.nome_cliente AS "Nome do Cliente"

FROM vendedor

LEFT JOIN venda LEFT JOIN cliente

ON vendedor.cod_vendedor = Venda.cod_vendedor

ON venda.cod_cliente = cliente.cod_cliente

ORDER BY nome_cliente

SELECT vendedor.cod_vendedor, vendedor.nome_vendedor AS "Nome do Vendedor", cliente.cod_cliente, cliente.nome_cliente AS "Nome do Cliente"FROM vendedorLEFT JOIN venda USING (cod_vendedor)LEFT JOIN cliente USING (cod_cliente)ORDER BY nome_cliente

Usando OUTER JOINS

RIGHT JOIN - Inverso do LEFT, este retorna todos os registrossomente da tabela da direita (Right).

SELECT Data_Venda AS "Data da venda realizada", cliente.nome_cliente AS "Nome do Cliente"FROM venda RIGHT JOIN cliente ON venda.cod_cliente = cliente.cod_cliente

Direita SELECT Data_Venda AS "Data da venda realizada", cliente.nome_clienteAS "Nome do Cliente"FROM vendaRIGHT JOIN cliente USING(cod_cliente)

Page 6: SQL – Select Avançado

04/05/2012

6

SELECT VD.nome_vendedor AS "Nome do Vendedor", cliente.nome_cliente AS"Nome do Cliente"FROM vendedor AS VDRIGHT JOIN venda ON VD.cod_vendedor = Venda.cod_vendedorRIGHT JOIN cliente ON venda.cod_cliente = cliente.cod_cliente

Cliente e Vendedor:

SELECT data_venda, VD.nome_vendedor AS "Nome do Vendedor", cliente.nome_clienteAS "Nome do Cliente"FROM vendedor AS VDRIGHT JOIN venda USING (cod_vendedor)RIGHT JOIN cliente USING (cod_cliente)

SELECT data_venda, cliente.cod_cliente, cliente.nome_cliente AS "Nome do Cliente", vendedor.cod_vendedor, vendedor.nome_vendedor AS "Nome do Vendedor"FROM vendaRIGHT JOIN cliente ON venda.cod_cliente = cliente.cod_clienteLEFT JOIN vendedor ON vendedor.cod_vendedor = Venda.cod_vendedorORDER BY nome_cliente

RIGHT JOIN e LEFT JOIN ....

Seleção de todos os clientes independentes dos mesmos terem uma venda realizada.Dos clientes que possuírem uma venda deverá ser apresentado o nome dos vendedoresque atendeu aquele determinado cliente.

Usando OUTER JOINS

FULL JOIN - Seleciona todos os registros de todas as tabelas.

SELECT cliente.nome_cliente AS "nome do cliente", vendedor.nome_vendedorFROM clienteFULL JOIN venda on venda.cod_cliente = cliente.cod_clienteFULL JOIN vendedor on venda.cod_vendedor = vendedor.cod_vendedor

SELECT data_venda, cliente.cod_cliente, cliente.nome_clienteAS "Nome do Cliente", vendedor.cod_vendedor, vendedor.nome_vendedorAS "Nome do Vendedor"FROM vendaFULL JOIN cliente ON venda.cod_cliente = cliente.cod_clienteFULL JOIN vendedor ON vendedor.cod_vendedor = Venda.cod_vendedorORDER BY nome_cliente

Desenvolver os seguintes SELECT:

1 – Listar o nome dos filmes e o nome dos atores que participaram dos filmes. Obs.: OSELECT deve apresentar todos os atores cadastrados independente de ter participado de umfilme.2 – Listar o nome dos atores e dos filmes em que os mesmos participam e o nome do cinemaonde os filmes estão em cartaz.3 - Listar o nome dos atores e dos filmes em que os mesmos participam, o nome do cinemaonde os filmes estão em cartaz e o nome da cidade onde se localiza o cinema.4 - Listar o nome dos atores, dos filmes em que os mesmos participam, o nome do cinemaonde os filmes estão em cartaz e o nome da cidade onde se localiza o cinema. Obs.: levarem consideração todos os atores cadastrados.5 – Listar o nome de todos os filmes em cartaz na cidade de Umuarama do mês de Junho.6 – Listar o nome e o gênero dos filmes em que o ator “Antônio Fagundes” participa.

Group By

• As operações de grupo operam sobre grupos de linhas(tuplas), retornando os resultados baseado no grupocriado.• É usada para dividir tuplas em grupos menores.• Omitir a clausula Group By significa agrupar toda a tabela.• Sintaxe:SELECT <coluna_agrupamento>,<função>FROM <nome_tabela>GROUP BY <coluna_agrupamento>;

Exemplo:

• SELECT cod_produto, SUM(qtde_vendida)FROM itens_vendaGROUP BY cod_produto

• SELECT cod_produto, count (qtde_vendida)FROM itens_vendaGROUP BY cod_produto

• SELECT cinema.cod_cidade, count(cod_cidade)FROM cinemaGROUP BY cinema.cod_cidade

Page 7: SQL – Select Avançado

04/05/2012

7

SELECT vendedor.nome_vendedor, SUM(qtde_vendida)FROM vendaINNER JOIN vendedor ON venda.cod_vendedor = vendedor.cod_vendedorINNER JOIN itens_venda ON venda.cod_venda = itens_venda.cod_VendaGROUP BY nome_vendedor

Exemplo no banco de dados Venda:

SELECT vendedor.nome_vendedor,nome_cliente, SUM (qtde_vendida)FROM vendaINNER JOIN cliente ON cliente.cod_cliente = venda.cod_clienteINNER JOIN vendedor ON venda.cod_vendedor = vendedor.cod_vendedorINNER JOIN itens_venda ON venda.cod_venda = itens_venda.cod_VendaGROUP BY nome_vendedor, nome_cliente

Quantidade de produtos vendido separado por vendedor

Quantidade de produtos vendido separado por cliente e por vendedor

select cinema.cod_cidade, cidade.nome_cidade, count (cinema.cod_cidade)from cinemainner join cidade on cidade.cod_cidade = cinema.cod_cidadegroup by cinema.cod_cidade, cidade.nome_cidade

Número de cinema agrupados por cidade:

select elenco.cod_ator, atores.nome_ator, count (elenco.cod_ator)from elencoinner join atores on elenco.cod_ator = atores.cod_atorgroup by elenco.cod_ator, atores.nome_ator

Numero de filmes feito por cada ator:

Cláusula Having

A cláusula HAVING é opcional.HAVING é semelhante a WHERE, que determina quaisregistros são selecionados.Depois que os registros são agrupados com GROUP BY,HAVING determina quais registros são exibidos.A cláusula Group By deve vir antes da cláusula Having.

Exemplo:select cinema.cod_cidade, cidade.nome_cidade, count (cinema.cod_cidade)from cinemainner join cidade on cidade.cod_cidade = cinema.cod_cidadegroup by cinema.cod_cidade, cidade.nome_cidadehaving count(cinema.cod_cidade) > 1

SELECT cod_produto, count(qtde_vendida)FROM itens_vendaGROUP BY cod_produtoHaving count(qtde_vendida) > 1

SELECT cod_produto, SUM(qtde_vendida)FROM itens_vendaGROUP BY cod_produtohaving sum(qtde_vendida) > 2

Visões• É como uma janela quer permite visualizar ou modificarseletivamente informações armazenadas em tabelas.• É utilizada para:▫ Poder restringir o acesso a informações contidas emtabelas;▫ Permitir que os usuários efetuem consultas simples sobreconsultas complicadas;▫ Consultar dados de diversas tabelas.• Uma visão é considerada uma tabela virtual, isto é,funciona como uma tabela mas não contém dados. Osdados de uma visão são calculados a partir de outrastabelas.

Exemplo:

Create View v_cinema (nome_cinema)

As Select nome_cinema

From cinema

Where cod_cidade = 1

Create View v_cinema (nome_cinema)As Select nome_cinemaFrom cinemaWhere cod_cinema is not null

ou...

Page 8: SQL – Select Avançado

04/05/2012

8

Visões

Exemplo:

1) CREATE VIEW v_comediasAS SELECT *FROM filmesWHERE cod_genero = 1

2) SELECT * FROM V_comedias

3) DROP v_comedias

Para visualizar as informações da View:SELECT *FROM v_cinema;

Para remover uma visão:

DROP VIEW (nome_da_visão);

Exemplo: DROP VIEW v_cinema

CREATE VIEW v_cinemacidade(nome_cinema, nome_cidade)AS Select nome_cinema, nome_cidadeFROM cinemaJOIN cidade USING (cod_cidade)

GENERATOR

Cria um auto-incremento de número inteiros e sequenciais. É utilizado em conjunto com Trigger e ou Stored Procedure.

Sintaxe:CREATE GENERATOR “nome_do_generator”

Exemplo:CREATE GENERATOR GEN_CINEMACREATE GENERATOR GEN_CIDADE

Função: GEN_ID()Retorna o valor do GENERATOR, isto é, pode retornar ovalor do GENERATOR e ou incrementar/decrementar. Éinformado o nome do Generator e o valor do retorno doGENERATOR.

Sintaxe:

GEN_ID(“generator”,ID);

Exemplo:

Criação:

Create generator Gen_cidade;Create generator Gen_cliente;

Inicialização do Generator:

Set generator gen_cidade to 0 Set generator gen_cidade to 10

Utilização:

insert into cidade values (gen_id(gen_cidade,1),’Cascavel')

Exclusão:

Drop Generator “nome_generator”

Exemplo: (banco venda)Insert into cliente values (gen_id(gen_cliente,1),upper('Marcos Paulo'), upper ('a'))

Triggers

Uma Trigger, ou um gatilho, é um bloco de comandos que éautomaticamente executado quando um comando INSERT , DELETEou UPDATE for executado em uma tabela do banco de dados.

As Triggers são usadas para realizar tarefas relacionadas comvalidações, restrições de acesso, rotinas de segurança e consistênciade dados; desta forma estes controles deixam de ser executados pelaaplicação e passam a ser executados pelas Triggers em determinadassituações.

Triggers

• A ativação de uma trigger está associada à ocorrência deum evento:– INSERT– UPDATE– DELETE

• Quanto ao instante de ativação: refere-se ao momento emque a condição e a ação são executadas▫ BEFORE: antes do comando SQL ser executado▫ AFTER: depois da execução do comando SQL

TriggersSintaxe:CREATE TRIGGER name FOR {table, view}[ACTIVE | INACTIVE] {BEFORE AFTER} {DELETE INSERT UPDATE}[POSITION number]AS

<variable_declaration_list> =DECLARE VARIABLE variable datatype; [DECLARE VARIABLE variable datatype;...]BEGIN

<trigger_body>END

Explicação:

•table view : é o nome tabela ou view queestará associada à trigger.•active inactive: indica se a trigger estaráativa ou não.•Before (antes) after (depois): indica emque momento a trigger será disparada. Atrigger pode ser dispara antes ou depois deum evento de DELETE, UPDATE ou INSERT.delete insert update : indica em qual eventoa trigger será executada.Position: é utilizado para definir a sequênciade execução de triggers que estãoassociadas a um mesmo momento e evento.Por exemplo, posso ter duas triggers do tipoBEFORE DELETE. Como saber qual delasserá executada primeiro? O parâmetroPOSITION indicará isso.trigger body : é o corpo da trigger, o códigodela.

Page 9: SQL – Select Avançado

04/05/2012

9

Exemplo:

• SET TERM ^ ; Create Trigger TCidade For CidadeBefore Insert Position 0ASBegin

if (new.cod_cidade is null) thenBeginnew.cod_cidade = gen_id(gen_cidade,1);

EndEnd ^SET TERM ; ^

Exemplo:

Insert into cidade (nome_cidade,cod_estado) values (‘Curitiba‘,1);Insert into cidade (nome_cidade,cod_estado) values (‘Maraba‘,1);Insert into cidade (nome_cidade,cod_estado) values (‘Cruzeiro do Oeste‘,1);Insert into cidade (nome_cidade,cod_estado) values (‘Londrina‘,1);

Triggers - As variáveis NEW e OLD

• O Firebird disponibiliza duas variáveis muito úteis para serem usadas nocontexto de uma trigger. São elas: NEW e OLD.

• A variável NEW, no caso do INSERT, armazena o registro que está sendoinserido. No caso do UPDATE, armazena o registro depois de atualizado.

• A variável OLD, no caso do DELETE, armazena o registro que está sendoexcluído. No caso do UPDATE, armazena o registro antes de sofrer aatualização.• Quando esta sendo usando o Insert, não é possível fazer referencia usando a

variável old.• Quando esta sendo usando o Delete não é possível fazer referencia usando a

variável new.

Exemplo:

• SET TERM !! ; Create Trigger TCidade For CidadeBefore Insert Position 0ASBegin

new.cod_cidade = gen_id(gen_cidade,1); End !!

SET TERM ; !!

Criando Mensagens de Exceção

Sintaxe:• CREATE EXCEPTION “Nome_Exceção” ‘Mensagem’;

• Exemplo:▫ CREATE EXCEPTION "NAO_DELETE_UF“ 'Não é possível excluir um estado';

▫ CREATE EXCEPTION "ACABOUESTOQUE" ‘ Não existe quantidade suficiente deste produto em estoque’.

Exemplo:

CREATE EXCEPTION "NAO_DELETE_UF" 'Não é possívelexcluir um estado';

Criar as regras de exceção:

CREATE EXCEPTION "ACABOUESTOQUE“ ‘Não existe quantidade suficiente deste produto em estoque’.

Page 10: SQL – Select Avançado

04/05/2012

10

Exemplo: SET TERM !;CREATE TRIGGER TUF FOR ESTADO BEFORE DELETE ASBEGIN

EXCEPTION NAO_DELETE_UF; END!SET TERM;!

Exemplo: Delete From Estado;

Exemplo:SET TERM ! ;CREATE TRIGGER TItensVenda FOR Itens_vendaBEFORE INSERTPOSITION 0 ASBEGINIF ( NOT EXISTS ( SELECT * FROM PRODUTO

WHERE COD_PRODUTO = NEW.COD_PRODUTO ANDQTDE_ESTOQUE >= NEW.QTDE_VENDIDA ) )

THENEXCEPTION ACABOUESTOQUE;

END !SET TERM ; !

Exemplo:

• Valor menor▫ Insert into itens_venda values (201,456,123,30)

• Valor maior• Insert into itens_venda values (202,456,123,300)

Exemplo: SET TERM !!;ALTER TRIGGER TITENSVENDA BEFORE INSERTPOSITION 0 ASBEGIN

IF ( NOT EXISTS ( SELECT * FROM PRODUTOWHERE COD_PRODUTO = NEW.COD_PRODUTO ANDQTDE_ESTOQUE >= NEW.QTDE_VENDIDA ) )

THENEXCEPTION ACABOUESTOQUE;

UPDATE PRODUTOSET QTDE_ESTOQUE = QTDE_ESTOQUE - NEW.QTDE_VENDIDAWHERE COD_PRODUTO = NEW.COD_PRODUTO;

END !!SET TERM ; !!

Exemplo:

• Valor menor• insert into itens_venda• values (203,456,123,10)

• Valor maior• insert into itens_venda• values (204,456,123,100)

SET TERM !!;CREATE TRIGGER TITENSCOMPRA_ESTOQUE FOR ITENS_COMPRABEFORE INSERTPOSITION 0 ASBEGIN

UPDATE PRODUTOSET QTDE_ESTOQUE = QTDE_ESTOQUE + NEW.QTDE_icompraWHERE COD_PRODUTO = NEW.produto_COD_PRODUTO;

END !!SET TERM ; !!

Atualização da quantidade do produto na tabela de produto

Page 11: SQL – Select Avançado

04/05/2012

11

Exemplo:

Create Table Pessoa (Cod_Pessoa Integer Not Nullprimary key,Pessoa_Idade Int Not Null,Pessoa_Tipo Char(1) );

SET TERM !;CREATE TRIGGER ATUALIZA_PESSOATIPOFOR PESSOABEFORE INSERT OR UPDATEPOSITION 0AS BEGIN

IF (NEW.PESSOA_IDADE < 18)THEN

BEGINNEW.PESSOA_TIPO = ‘J’;

ENDELSENEW.PESSOA_TIPO = ‘A’;

END!SET TERM;!

Exemplo:

Update Pessoa Set Pessoa_Idade = 5;

insert into pessoa (cod_pessoa,pessoa_idade)values (1,10)

insert into pessoa (cod_pessoa,pessoa_idade)values (2,20)

INSERT:

UPDATE:

Triggers

• Excluindo uma triggers:

• DROP TRIGGER nome_trigger;

• Ativando/Desativando uma triggers:

• ALTER TRIGGER nome_trigger INACTIVE;

Exercícios

• Usar o exemplo feito na ultima aula e aplicar os conceitos vistos.

Stored Procedures

• Stored Procedure é um conjunto de comandos, ao qual éatribuído um nome.• Este conjunto fica armazenado no Banco de Dados e podeser chamado a qualquer momento tanto pelo SGBD(Sistema Gerenciador de Banco de Dados) quanto por umsistema que faz interface com o mesmo.• Stored Procedures são pre-compiladas. Portanto, não énecessário mandar o comando pela rede para ser validadoe executado. Elas são simplesmente executadas.• Procedures podem possuir parâmetros e, assim como oSELECT, retornar dados de uma tabela.

Stored Procedures

CREATE PROCEDURE NomedaProcedure <parâmetros de entrada> RETURNS <parâmetros de saída> AS <declaração de variáveis locais> BEGIN <comandos da procedures> END

Page 12: SQL – Select Avançado

04/05/2012

12

Exemplo:

SET TERM !;CREATE PROCEDURE Cliente_CountRETURNS ( ClienteCount Integer)ASBEGIN

SELECT COUNT(*) FROM ClienteINTO :ClienteCount;SUSPEND;

END !SET TERM ; !

Exemplo:

• Select *from Cliente_Count

• Execute “Nome da Procedure”

• DROP PROCEDURE Nome_Procedure;

Exemplo:SET TERM !;CREATE PROCEDURE RESUMO_VENDAS ( VENDEDOR INTEGER)RETURNS (VALOR_TOTAL DOUBLE PRECISION, MEDIA DOUBLE PRECISION, VALOR_MIN DOUBLE PRECISION, VALOR_MAX DOUBLE PRECISION )

ASBEGIN

SELECT SUM(VALOR), AVG(VALOR), MIN(VALOR), MAX(VALOR)FROM VENDAWHERE COD_VENDEDOR = :VENDEDORINTO :VALOR_TOTAL, :MEDIA,:VALOR_MIN,:VALOR_MAX;SUSPEND;

END!SET TERM ; !

Exercícios

• Usar o exemplo feito na ultima aula e aplicar os conceitos vistos.