BASES DE DADOS I - di.ubi.pthugomcp/bd1/10_bd1_10_11.pdf · seu conteúdo apenas o estado...
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));