FBD 08 SQL Avancado

120
SQL Avançado Regis Pires Magalhães [email protected]

description

FBD 08 SQL Avancado

Transcript of FBD 08 SQL Avancado

  • 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).

  • [email protected]