Structured Query Language - Slide 1 Banco de Dados Banco de Dados Structured Query Structured Query Language (SQL) Language (SQL) 4 4 Livros Texto : Introdução a Sistemas de Banco de Dados - Date Sistemas de Banco de Dados – Korth & Silberschatz Sistemas de Banco de Dados Fundamentos e Aplicações – Elmasri & Navathe
Banco de DadosLivros Texto : Introdução a Sistemas de Banco de
Dados - Date
Sistemas de Banco de Dados – Korth & Silberschatz Sistemas de
Banco de Dados Fundamentos e Aplicações – Elmasri &
Navathe
Banco de Dados
Subconsultas
Uma subconsulta é uma declaração select, usada como uma expressão,
como parte de outra declaração select, update, insert ou
delete.
A subconsulta (select aninhado) é resolvida e depois os resultados
são substituídos na consulta mais externa.
Se a declaração where da consulta mais externa incluir o nome de
uma coluna, esta deverá ser compatível com a coluna nomeada na
lista de seleção da subconsulta (ou seja: mesmo domínio ).
Structured Query Language - Slide *
operador-de-comparação (subconsulta)
Ex : Lista dos empregados que ganham o menor salário
select e.nome from empregado e
where salario = (select min(salario) from empregado);
Structured Query Language - Slide *
Tipo 2 – [NOT] IN (subconsulta)
Compara se um valor pertence ao conjunto de valores gerado pela
subconsulta
Ex : Selecione matricula dos empregados que trabalham na mesma
combinação (projeto, horas) em algum projeto no qual o empregado de
matricula 111 trabalha
select mat from trabalhaem
where (codproj, horas) in
Structured Query Language - Slide *
Ex : Selecione o nome do departamento que não tem empregados
select d.nome from departamento d
where cod not in
(select coddepart from empregado);
Structured Query Language - Slide *
Tipo 3 – operador-de-comparação [ANY/SOME/ALL] (subconsulta)
Usado para encontrar tuplas que satisfazem a comparação com alguma
ou todas as tuplas da subconsulta
Ex: Obter os nomes dos empregados com salário maior que o dos
empregados do departamento 5
select nome from empregado
where coddepart = 5);
Tipo 4 – [NOT] EXISTS (subconsulta)
Funciona como um teste de existência, a subconsulta retorna
verdadeiro se existir pelo menos uma tupla ou falso se não existir
tupla.
Ex: Obter os nomes dos empregados com pelo menos um
dependente
select e.nome from empregado e
where exists
where d.matricula = e.matricula);
Ex: Obter os nomes dos empregados sem dependentes
select e.nome from empregado e
where not exists
where d.matricula = e.matricula);
Not Exists – implementa a diferença algébrica
Peças que são fornecidas por algum fornecedor
select p.nome from pecas p where exits
(select * from pecasfornecedor pf
(select * from pecasfornecedor pf
Subconsultas
É possível utilizar a subconsulta na cláusula from representando
uma tabela
select e.nome from (select * from empregado) e where
e.coddepart=4;
Select d.nome from (select * from departamento where localizacao =
‘Predio 1’) d;
Structured Query Language - Slide *
Sempre qualificar os atributos com nome ou alias das tabelas;
Dar preferência ao uso de JOIN no lugar de subconsultas;
Utilizar apenas as tabelas e os atributos necessários;
Evitar consultas que varrem toda tabela;
Structured Query Language - Slide *
Subconsultas
Recupere os nomes e salários dos empregados cujos salários sejam
maiores que a média do departamento 1.
Recupere os nomes dos empregados que não possuem dependentes
Que empregados moram no mesmo bairro de Luis Inácio?
Quais empregados ganham mais que o salário médio dos
empregados?
Que empregados ganham comissão acima das dos empregados do
departamento ‘Administração’?
Structured Query Language - Slide *
6. Que empregados participaram de projeto já concluídos?
7. Que dependentes têm o mesmo parentesco do dependente Antonio
Carlos?
8. Que empregados possuem algum dependente com parentesco
semelhante aos dos dependentes de ‘Ana Maria’?
9. Quais departamentos não têm empregados ?
10. Que empregados não estão alocados em projetos ?
11. Que empregados ganham menos que os de função auxiliar ?
Structured Query Language - Slide *
create table Empregado1 as select * from Empregado;
create table InfoDepart as select d.nome, count(*) as totalemp ,
sum(e.salario) as totalsalario
from departamento d join empregado e on e.coddepart = d.cod
group by d.nome
order by totalsalario;
(valor1, valor2, ..., valorn)
select d.nome, count(*), sum(e.salario) from
Departamento d join Empregado e
on e.coddepart = d.cod
group by d.nome;
Obs : número de colunas no select e no insert devem ser iguais e os
domínios compatíveis
Structured Query Language - Slide *
<atribuições> = <atribuições> =
<atributo=constantes>
ou
update Departamento set totsalario = (select sum(e.salario) from
empregado e join departamento d1 on e.coddepart=d.cod
where d.nome=‘Informática’) where nome = ‘Informática’;
Structured Query Language - Slide *
<condição> = <atributo> <operador>
<constante>
(select cod from Departamento
<condição> = <atributo> <operador>
<constante>
(select mat from Trabalhaem
Simples: apenas 4 comandos;
Poderosa: cobre toda a gama de operações possíveis sobre um
conjunto de tabelas;
Flexível: permite escrever uma consulta de diversas formas e
diversos graus de complexidade
Structured Query Language - Slide *
Exercício
1. Recupere o nome do departamento, a função, o total de empregados
e o total de salários por departamento e função cujo total de
salários seja maior que a médias dos sálarios ordenados por
departamento e função.
2. Selecionar todos os empregados do departamento Informática que
desempenham papel de Coordenação por mais de 40 hs.
Structured Query Language - Slide *
Tabela virtual cujo conteúdo é definido por uma consulta SQL.
Características:
Pode ser derivada de uma ou mais tabelas ou visões
Sua existência reduz-se à sua definição, sendo armazenada como uma
consulta Select
Seu conteúdo é calculado no momento
Usuários podem fazer uso das visões referenciando-se ao nome delas
na cláusula from dos comandos SQL-DMl
Structured Query Language - Slide *
AS SELECT ... [WITH CHECK OPTION]
WITH CHECK OPTION – garante que as modificações executadas sobre as
visões (Insert, Update e Delete) não violem os critério da cláusula
WHERE do SELECT.
create view infodepart (nomedepart,totempregados,totsalarios)
as
select d.nome, count(*), SUM(e.salario) from
Departamento d, Empregado e
Empregado e, Trabahaem t, Projeto p
where e.matricula=t.mat and
Atualizações sobre Visões - Limitações
WITH CHECK OPTION – garante que as atualizações não violem os
condições impostas na Visão
INSERT – Pode ser executado em Visões que manipulem apenas uma
tabela e todos os atributos not null devem estar presentes na
visão.
UPDATE – Pode ser executado em Visões que manipulem apenas uma
tabela, ou múltiplas tabelas quando o comando afetar apenas
atributos de um única tabela.
DELETE - Pode ser executado em Visões que manipulem uma única
tabela.
Para eliminar uma visão : DROP VIEW <nome da visão>
Structured Query Language - Slide *
SQL
Visão
Exercício
Crie uma visão contendo matricula, nome e função dos empregados
Analista.
create view Analista as select matricula, nome, funcao from
empregado where funcao = ‘Analista’ with check option
update Analista set funcao = ‘Programador’ where matricula = 117
Erro violação da cláusula where da view WITH CHECK OPTION
insert into Analista values (222, 'Carlos Antonio', 'Analista');
Erro
atributo salario é obrigatório (not null)
Structured Query Language - Slide *
SQL
Visão
Exercício
Crie uma visão (MaioresSalarios) contendo a matricula, função e
salário dos empregados que ganham mais de R$ 3000 use a opção with
check option
O que acontecerá na execução dos seguintes comandos:
insert into MaioresSalarios (matricula, funcao, salario)
values (999, ‘Analista’, 3500);