BASES DE DADOS I - di.ubi.pthugomcp/bd1/10_bd1_10_11.pdf · seu conteúdo apenas o estado...

25
BASES DE DADOS I LTSI/2 Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2010/2011

Transcript of BASES DE DADOS I - di.ubi.pthugomcp/bd1/10_bd1_10_11.pdf · seu conteúdo apenas o estado...

BASES DE DADOS I LTSI/2 Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2010/2011

SQL-DDL (Vistas)

  Vistas

  Ao contrário das tabelas, que são entidades onde os dados estão realmente (fisicamente) armazenados, as “views” sáo, como o próprio nome indica, perspectivas de parcelas da base de dados, reflectindo o seu conteúdo apenas o estado momentâneo de cada uma das tabelas fonte de informação.

A B C

a1 b1 c1

a2 b2 c2

C D

c1 d1

c2 d2

c3 d3

c4 d4 CREATE VIEW AS ...

A C D

a1 c1 d1

a2 c2 d2

Existência “lógica”

SQL-DDL (Vistas)

  Criação de Vistas

CREATE VIEW <nome_vista>

AS

SELECT...

<nome_vista> Nome pelo qual a vista será referenciada.

  Exemplo:

CREATE VIEW Vista_Nova AS SELECT A.Numero, A.Nome, D.Descricao FROM Aluno A, Inscricao I, Disciplina D WHERE A.CodAluno=I.CodAluno AND I.CodDisciplina=D.CodDisciplina;

Vistas

  Vistas

  A definição de cada “vista” é armazenada no dicionário de dados e o seu conteúdo calculado sempre que esta se encontrar referida nalgum bloco SQL. Para o nível aplicacional esta é uma operação completamente transparente, uma vez que uma vista se comporta perante o comando “SELECT” exactamente como uma tabela.

SELECT Numero, Nome

FROM Vista_Nova

WHERE Numero > 100;

Vistas

  Vistas

  Algumas das vantagens tipicamente associadas à utilização de vistas serão:   Restringir o acesso à base de dados, mostrando (filtrando) apenas parte dos

dados.   Simplificar a consulta dos dados, substituindo consultas complexas (sobre

várias tabelas) por consultas directas a uma vista.   Permitir que os mesmos dados sejam visualizados de diferentes formas por

diferentes utilizadores.

  Por não possuírem existência física, sobre “vistas” apenas se podem realizar operações de consulta de informação. (De facto, é também possível alterar informação através de “vistas”, mas não tal não constitui objectivo deste curso.

Vistas

  Vistas

  Podemos encarar as vistas como selecções de informação pré-definidas e potencialmente residentes em memória no SGBD, por forma a optimizar consultas bastante frequentes e / ou computacionalmente bastante exigentes.

  A sua utilização torna-se imprescindível, especialmente em projectos de maior dimensão e em situações onde o tempo de resposta constitui um factor importante.

SQL-DDL (Vistas)

  Eliminação de Vistas

  DROP VIEW <nome_vista>

  <nome_vista> Nome pelo qual a vista será referenciada.

  Exemplo:

DROP VIEW Nova_Vista;

Eventos (Triggers)

  Evento (Trigger)

  Num SGBD, um trigger é um procedimento SQL que inicia uma acção, ao ocorrer determinado evento (Inserção, alteração ou remoção)

  São guardados e administrados directamente pelo SGBD, pelo que não é possível efectuar a sua chamada ou pedido de execução.

  Cabe ao SGBD a execução automática do trigger, sempre que o evento que lhe está associado ocorrer.

Eventos (Triggers)

  Evento (Trigger)

  São utilizados para manter a consistência (integridade referencial) dos dados.

  Cada trigger está associado a uma tabela da base de dados.

  A acção provocada pela execução de um trigger pode por sua vez desencadear eventos que levam à execução de outros.

  Desta forma é possível a execução sequencial de múltiplos triggers em múltiplas relações.

Eventos (Triggers)

  Evento (Trigger) - Criação

CREATE TRIGGER <nome_trigger> ON <tabela> FOR <acção> AS <BLOCO_SQL>

  <nome_trigger> Identificador do trigger   <tabela> Relação que gera o evento que permite a execução do trigger.   <acção> {INSERT || UPDATE || DELETE}   <BLOCO_SQL> Código sql executado após a ocorrência do evento.

Eventos (Triggers)

  Evento (Trigger) - Exemplo

CREATE trigger Tg_actualiza_dir_data on directorio

FOR insert

AS

insert into directorio_update (directorio_id,update_date)

select max(directorio_id) as directorio_id, date()

from directorio;

  Serve para actualizar o contéudo de uma relação “directorio_update” sempre que for inserida uma nova instancia na relação “directorio”

Eventos (Triggers)

  Evento (Trigger) - Exemplo

  Para eliminar um trigger, o procedimento é o seguinte:

  DROP trigger <nome_trigger> ON <nome_tabela>

  <nome_trigger> Identificador do trigger.   <nome_tabela> Nome da tabela sobre a qual o trigger foi

definido.

SQL – Exemplos / Auto-Avaliação

  Tendo o seguinte esquema de relações:

  Departamento(CodDepartamento, Nome, Piso, CodChefe(*))

  Empregado(CodEmpregado, Nome, Salario, CodSuperior, Departamento(*))

  Venda(Departamento(*), CodProduto(*), Data, Quantidade)

  Produto(CodProduto, Descricao, Valor)

SQL – Exemplos / Auto-Avaliação

  Listar o nome de todos os empregados, ordenados alfabeticamente.

SELECT Nome FROM Empregado ORDER BY Nome;

SQL – Exemplos / Auto-Avaliação

  Determinar o total de salários que a empresa paga por mês.

SELECT Sum(Salario) AS Total FROM Empregado;

SQL – Exemplos / Auto-Avaliação

  Determinar os produtos que nunca foram vendidos.

SELECT CodProduto, Descricao FROM Produto WHERE CodProduto NOT IN(

SELECT CodProduto FROM Venda);

SQL – Exemplos / Auto-Avaliação

  Qual a soma dos salários dos empregados que trabalham no segundo piso?

SELECT SUM(E.Salario) AS Total FROM Empregado E, Departamento D WHERE E.Departamento=D.CodDepartamento AND D.Piso=2;

SQL – Exemplos / Auto-Avaliação

  Determinar o nome dos funcionários que têm como chefe o “João Armando”

SELECT Nome FROM Empregado WHERE Departamento IN(

SELECT D.CodDepartamento FROM Departamento D, Empregado E WHERE D.CodChefe=E.CodEmpregado AND E.Nome=‘João Armando’);

SQL – Exemplos / Auto-Avaliação

  Determinar os produtos que foram vendidos em pelo menos 2 departamentos.

SELECT DISTINCT P.CodProduto, P.Descricao FROM Produto P, Venda V WHERE P.CodProduto=V.CodProduto GROUP BY P.CodProduto, P.Descricao HAVING COUNT (DISTINCT CodDepartamento)>=2;

SQL – Exemplos / Auto-Avaliação

  Determinar os produtos que foram vendidos em todos os pisos.

SELECT DISTINCT P.CodProduto, P.Descricao FROM Produto P, Venda V, Departamento D WHERE P.CodProduto=V.CodProduto AND D.CodDepartamento=V.Departmento GROUP BY P.CodProduto, P.Descricao HAVING COUNT (DISTINCT Piso)=

(SELECT COUNT (DISTINCT Piso) FROM Departamento);

SQL – Exemplos / Auto-Avaliação

  Determinar os produtos que foram vendidos exclusivamente pelo departamento de “Criança”

SELECT DISTINCT P.CodProduto, P.Descricao FROM Produto P, Venda V, Departamento D WHERE P.CodProduto=V.CodProduto AND V.Departamento=D.CodDepartamento AND D.Nome=‘Criança’ AND P.CodProduto NOT IN (

SELECT P.CodProduto FROM Produto P, Venda V, Departamento D WHERE P.CodProduto=V.CodProduto AND V.Departamento=D.CodDepartamento AND D.Nome<>‘Criança’)

SQL – Exemplos / Auto-Avaliação

  Qual a soma dos salários dos empregados que trabalham em departamentos com menos de 10 funcionários.

SELECT SUM(E0.Salario) AS TOTAL FROM Empregado E0 WHERE Departamento IN

(SELECT D.CodDepartamento FROM Departamento D, Empregado E WHERE D.CodDepartamento=E.Departamento GROUP BY CodDepartamento HAVING COUNT(*)<10);

SQL – Exemplos / Auto-Avaliação

  Em que departamentos todos os empregados ganham menos que o respectivo patrão?

SELECT D.Nome FROM Departamento D, Empregado E0 WHERE D.CodDepartamento=E0.Departamento GROUP BY D.Nome HAVING COUNT(*)=(

SELECT COUNT(*) FROM Empregado E1, Departamento D1 WHERE E1.Departamento=D1.CodDepartamento AND E1.Departamento=E0.Departamento AND E1.salario< ( SELECT Salario FROM Empregado E2 WHERE E2.CodEmpregado=D1.CodChefe));

SQL – Exemplos / Auto-Avaliação

  Quais os departamentos em que todos os empregados ganham menos que o chefe pior remunerado da empresa.

SELECT D.Nome FROM Departamento D, Empregado E0 WHERE D.CodDepartamento=E0.Departamento GROUP BY D.Nome HAVING COUNT(*)=(

SELECT COUNT(*) FROM Empregado E1, Departamento D1 WHERE E1.Departamento=D1.CodDepartamento AND E1.Departamento=E0.Departamento AND E1.salario< ( SELECT Min(Salario) FROM Empregado E2, Departamento D2 WHERE E2.CodEmpregado=D2.CodChefe));

“THE END”

SQL – Exemplos / Auto-Avaliação