Você está na página 1de 29

Banco de Dados

Structured Query
Language (SQL)
4

Livros Texto : Introduo a Sistemas de Banco de


Dados - Date
Sistemas de Banco de Dados Korth &
Silberschatz
Sistemas de
Banco de Dados Fundamentos e
Aplicaes Elmasri
& Navathe
Structured
Query Language - Slide 1

SQL
Manipulao de Dados
Subconsultas
Uma subconsulta uma declarao select, usada
como uma expresso, como parte de outra
declarao select, update, insert ou delete.
A subconsulta (select aninhado) resolvida e
depois os resultados so substitudos na
consulta mais externa.
Se a declarao where da consulta mais externa
incluir o nome de uma coluna, esta dever ser
compatvel com a coluna nomeada na lista de
seleo da subconsulta (ou seja: mesmo
domnio ).
Structured Query Language - Slide 2

SQL
Manipulao de Dados

Subconsultas
Existem 4 tipos bsicos de sub consultas:
consultas
1) operador-de-comparao (subconsulta)
2) [NOT] IN (subconsulta)
3) operador-de-comparao [ANY/SOME/ALL]
(subconsulta)
4) [NOT] EXISTS (subconsulta)
Structured Query Language - Slide 3

SQL
Manipulao de Dados

Subconsultas
Tipo 1 operador-de-comparao (subconsulta)
Subconsulta devolve um nico valor
Ex : Lista dos empregados que ganham o menor
salrio
select e.nome from empregado e
where salario = (select min(salario) from
empregado);
Structured Query Language - Slide 4

SQL
Manipulao de Dados
Subconsultas
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 combinao (projeto, horas) em algum projeto no
qual o empregado de matricula 111 trabalha
select mat from trabalhaem
where (codproj, horas) in
(select codproj, horas from trabalhaem where mat =
111);
Structured Query Language - Slide 5

SQL
Manipulao de Dados

Subconsultas
Tipo 2 [NOT] IN (subconsulta)
Ex : Selecione o nome do departamento que no
tem empregados
select d.nome from departamento d
where cod not in
(select coddepart from empregado);

Structured Query Language - Slide 6

SQL
Manipulao de Dados
Subconsultas
Tipo 3 operador-de-comparao [ANY/SOME/ALL]
(subconsulta)
Usado para encontrar tuplas que satisfazem a comparao
com alguma ou todas as tuplas da subconsulta
Ex: Obter os nomes dos empregados com salrio maior que o
dos empregados do departamento 5
select nome from empregado
where salario > ALL
(select distinct salario from empregado
where coddepart = 5);
Structured Query Language - Slide 7

SQL
Manipulao de Dados

Subconsultas
Equivalncia entre operadores
IN
= ANY
IN
= SOME
NOT IN <> ALL

Structured Query Language - Slide 8

SQL
Manipulao de Dados
Subconsultas
Tipo 4 [NOT] EXISTS (subconsulta)
Funciona como um teste de existncia, a subconsulta
retorna verdadeiro se existir pelo menos uma tupla ou falso
se no existir tupla.
Ex: Obter os nomes dos empregados com pelo menos um
dependente
select e.nome from empregado e
where exists
(select d.nome from dependente d
where d.matricula = e.matricula);
Structured Query Language - Slide 9

SQL
Manipulao de Dados

Subconsultas
Tipo 4 [NOT] EXISTS (subconsulta)
Ex: Obter os nomes dos empregados sem
dependentes
select e.nome from empregado e
where not exists
(select d.nome from dependente d
where d.matricula = e.matricula);

Structured Query Language - Slide 10

SQL
Manipulao de Dados
Subconsultas
Exists implementa a interseo algbrica
Not Exists implementa a diferena algbrica
Peas que so fornecidas por algum fornecedor
select p.nome from pecas p where exits
(select * from pecasfornecedor pf
where pf.peca = p.peca)
Peas que no so fornecidas por nenhum fornecedor
Select p.nome from pecas p where not exists
(select * from pecasfornecedor pf
where pf.pecas = p.peca)
Structured Query Language - Slide 11

SQL
Manipulao de Dados

Subconsultas
possvel utilizar a subconsulta na clusula 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 12

SQL
Manipulao de Dados

Recomendaes sobre SELECT :


Evitar o uso do * na lista de seleo;
Sempre qualificar os atributos com nome ou alias
das tabelas;
Dar preferncia ao uso de JOIN no lugar de
subconsultas;
Utilizar apenas as tabelas e os atributos necessrios;
Evitar consultas que varrem toda tabela;
Structured Query Language - Slide 13

SQL
Manipulao de Dados
Subconsultas
1. Recupere os nomes e salrios dos empregados cujos
salrios sejam maiores que a mdia do departamento 1.
2. Recupere os nomes dos empregados que no possuem
dependentes
3. Que empregados moram no mesmo bairro de Luis Incio?
4. Quais empregados ganham mais que o salrio mdio dos
empregados?
5. Que empregados ganham comisso acima das dos
empregados do departamento Administrao?
Structured Query Language - Slide 14

SQL
Manipulao de Dados
Subconsultas
6. Que empregados participaram de projeto j concludos?
7. Que dependentes tm 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 no tm empregados ?
10. Que empregados no esto alocados em projetos ?
11. Que empregados ganham menos que os de funo
auxiliar ?
Structured Query Language - Slide 15

SQL
Definio de Dados
Criao de tabelas com select
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;

Structured Query Language - Slide 16

SQL
Manipulao de Dados
Atualizaes com select
INSERT INTO tabela (atributo1, atributo2, ..., atributon)
VALUES
(valor1, valor2, ..., valorn)
ou
comando select
insert into InfoDepart (nome, totalemp, totalsalario)
select d.nome, count(*), sum(e.salario) from
Departamento d join Empregado e
on e.coddepart = d.cod
group by d.nome;
Obs : nmero de colunas no select e no insert devem ser
iguais e os domnios compatveis
Structured Query Language - Slide 17

SQL
Manipulao de Dados
UPDATE tabela SET <atribuies> WHERE <condio>;
<atribuies> = <atribuies> = <atributo=constantes>
ou
<atributo=atributo>
ou
<atributo=operaes de atributos e constantes>
ou
<atributo=comando select>
update Departamento set totsalario = (select
sum(e.salario) from empregado e join departamento d1 on
e.coddepart=d.cod
where d.nome=Informtica) where nome = Informtica;

Structured Query Language - Slide 18

SQL
Manipulao de Dados
UPDATE tabela SET <atribuies> WHERE <condio>;
<condio> = <atributo> <operador>
<constante>
ou
<atributo> <operador> <atributo>
ou
<atributo> <operador> <comando select>
update Empregado set salario = salario * 1.1 where
coddepart =
(select cod from Departamento
where nome = Informtica);

Structured Query Language - Slide 19

SQL
Manipulao de Dados
DELETE FROM tabela WHERE <condio>;
<condio> = <atributo> <operador> <constante>
ou
<atributo> <operador> <atributo>
ou
<atributo> <operador> <comando select>
delete from Empregado where matricula in
(select mat from Trabalhaem
where codproj = 01);

Structured Query Language - Slide 20

SQL
Manipulao de Dados
DML Comandos de manipulao SQL
Simples: apenas 4 comandos;
Poderosa: cobre toda a gama de operaes possveis
sobre um conjunto de tabelas;
Flexvel: permite escrever uma consulta de diversas
formas e diversos graus de complexidade

Structured Query Language - Slide 21

SQL
Manipulao de Dados

Exerccio
1. Recupere o nome do departamento, a funo, o
total de empregados e o total de salrios por
departamento e funo cujo total de salrios seja
maior que a mdias dos slarios ordenados por
departamento e funo.
2. Selecionar todos os empregados do departamento
Informtica que desempenham papel de
Coordenao por mais de 40 hs.

Structured Query Language - Slide 22

SQL
Viso
Tabela virtual cujo contedo definido por uma consulta
SQL.
Caractersticas:
No possui existncia fsica, no possui dados prprios
Pode ser derivada de uma ou mais tabelas ou vises
Sua existncia reduz-se sua definio, sendo
armazenada como uma consulta Select
Seu contedo calculado no momento
Usurios podem fazer uso das vises referenciando-se
ao nome delas na clusula from dos comandos SQL-DMl
Structured Query Language - Slide 23

SQL
Viso

Sua utilizao :
Independncia lgica de dados
Segurana
Simplicidade
Flexibilidade

Structured Query Language - Slide 24

SQL
Viso
CREATE VIEW <nome da viso> [(atributo1, atributo2,...)]
AS SELECT ... [WITH CHECK OPTION]
WITH CHECK OPTION garante que as modificaes
executadas sobre as vises (Insert, Update e Delete) no
violem os critrio da clusula WHERE do SELECT.
create view infodepart
(nomedepart,totempregados,totsalarios) as
select d.nome, count(*), SUM(e.salario) from
Departamento d, Empregado e
where d.cod = e.coddepart
group by d.nome;
Structured Query Language - Slide 25

SQL
Viso

create view trabalhaem1 as


select e.nome, p.nome, horas from
Empregado e, Trabahaem t, Projeto p
where e.matricula=t.mat and
t.codproj = p.cod;

Structured Query Language - Slide 26

SQL
Viso
Atualizaes sobre Vises - Limitaes
WITH CHECK OPTION garante que as atualizaes no
violem os condies impostas na Viso
INSERT Pode ser executado em Vises que manipulem
apenas uma tabela e todos os atributos not null devem estar
presentes na viso.
UPDATE Pode ser executado em Vises que manipulem
apenas uma tabela, ou mltiplas tabelas quando o comando
afetar apenas atributos de um nica tabela.
DELETE - Pode ser executado em Vises que manipulem uma
nica tabela.
Para eliminar uma viso : DROP VIEW <nome da viso>

Structured Query Language - Slide 27

SQL
Viso
Exerccio
Crie uma viso contendo matricula, nome e funo 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 violao da clusula where da
view WITH CHECK OPTION
insert into Analista values (222, 'Carlos Antonio',
'Analista'); Erro
atributo salario obrigatrio (not null)
Structured Query Language - Slide 28

SQL
Viso

Exerccio
Crie uma viso (MaioresSalarios) contendo a
matricula, funo e salrio dos empregados que
ganham mais de R$ 3000 use a opo with check
option
O que acontecer na execuo dos seguintes
comandos:
insert into MaioresSalarios (matricula, funcao, salario)
values (999, Analista, 3500);

Structured Query Language - Slide 29