Você está na página 1de 11

Subconsulta na Clusula FROM

Gera uma tabela derivada a partir de uma ou mais tabelas, para uso na consulta externa
otimizao: filtra linhas e colunas de uma tabela que so desejadas pela consulta externa
select lista_atributos from (consulta_SQL) as nome_tabela_derivada

Mapeamento para a lgebra relacional


select a1 from (select x from t1 where d > 5) as t2 join t3 on t3.c = t2.x

a1 (t3 X t2(x ( d > 5 (t1))))


= t3.c = t2.x

Exemplos
lgebra
Mdicos.codm, ..., nroa, hora ( (Mdicos X
= Mdicos.codm = C.codm

SQL
select Medicos.*, C.hora from Medicos join (select codm, hora from Consultas where data = '06/11/13') as C on Mdicos.codm = C.codm

C (codm, hora ( data = 06/11/13 (Consultas))) ) )

select Amb.* Amb.nroa, andar, capacidade ( Amb (nroa, andar (Ambulatrios)) from (select nroa, andar from ambulatorios) as Amb join X (select nroa from Medicos
= Amb.nroa = M_ort.nroa

MFlo (nroa ( cidade = Fpolis (Mdicos))) )

where cidade = Fpolis') as MFlo on Amb.nroa = MFlo.nroa

Ordenao de Resultados
Clusula ORDER BY
select lista_atributos from lista_tabelas [where condio] [order by nome_atributo 1 [desc] {[, nome_atributo n [desc]]} ]

Exemplos
select * from Pacientes order by nome select salrio, nome from Funcionrios order by salrio desc, nome

Ordenao de Resultados
possvel determinar a quantidade de valores ordenados a retornar
select ... limit valor1 [,valor2]

Exemplos

retorna as 5 primeiras tuplas


retorna tuplas 6 a 15

select * from Pacientes order by nome limit 5

select salrio, nome from Funcionrios order by salrio desc, nome limit 5,10

Definio de Grupos
Clusula GROUP BY
select lista_atributos from lista_tabelas [where condio] [group by lista_atributos_agrupamento [having condio_para_agrupamento] ]

GROUP BY
define grupos para combinaes de valores dos atributos definidos em lista_atributos_agrupamento um grupo mantm os atributos da tabela que no esto em lista_atributos_agrupamento apenas atributos definidos em lista_atributos_agrupamento podem aparecer no resultado da consulta geralmente o resultado da consulta possui uma funo de agregao

Definio de Grupos
Exemplo
select especialidade, count(*) from Mdicos group by especialidade
especialidade grupos

especialidade ortopedia pediatira neurologia traumatologia

Count 2 1 1 3

ortopedia

codm 1 4

nome Joo Carlos nome Pedro nome Mrcia nome Maria Joana Mauro

idade 40 28 idade 51 idade 33 idade 42 37 53

CPF 1000010000 1100011000 CPF 1100010000 CPF 1100011100 CPF 1000011000 1111110000 1111000011

cidade Fpolis Joinville cidade Fpolis cidade Biguau cidade Blumenau Fpolis Blumenau 2 3 2 3 2 1

nroa

pediatria

codm 3

nroa

neurologia

codm 5

nroa

traumatologia

codm 2 6 7

nroa

Definio de Grupos
Clusula HAVING
define condies para que grupos sejam formados
condies s podem ser definidas sobre atributos do agrupamento ou serem funes de agregao

existe somente associada clusula GROUP BY

Exemplos
select especialidade, count(*) from Mdicos group by especialidade having count(*) > 1

Atualizao com Consulta


Comandos de atualizao podem incluir comandos de consulta
necessrio toda vez que a atualizao deve testar relacionamentos entre tabelas

Exemplo 1
delete from Consultas where hora > 17:00:00 and codm in (select codm from Mdicos where nome = Maria)

Atualizao com Consulta


Exemplo 2
update Mdicos set nroa = NULL where not exists (select * from Mdicos m where m.codm <> Mdicos.codm and m.nroa = Mdicos.nroa)

Exemplo3
update Ambulatrios set capacidade = capacidade + (select capacidade from Ambulatrios where nroa = 4) where nroa = 2

Atualizao com Consulta


Exemplo 4 (supondo MedNovos(cdigo, nome, especialidade))
insert into MedNovos select codm, nome, especialidade from Mdicos

where idade < 21;

Exemplo 5
insert into Pacientes select p.codp+1, f.nome, f.idade, 'Fpolis', f.CPF, 'gripe' from Pacientes p join Funcionrios f on f.codf = 1 and p.codp = (select max(codp) from Pacientes)

Exerccios
Buscar o que se pede utilizando subconsultas na clusula FROM:
1) todos os dados das consultas marcadas para a mdica Maria 2) cdigo e nome dos pacientes com consulta marcada para horrios aps s 14 horas 3) nome e cidade dos pacientes que tm consultas marcadas com ortopedistas 4) nome e CPF dos pacientes de Florianpolis que no tm consultas com o mdico Joo

Buscar o que se pede utilizando ORDER BY e GROUP BY:


1) os dados de todos os funcionrios ordenados pelo salrio (decrescente) e pela idade (crescente). Buscar apenas os trs primeiros funcionrios nesta ordem 2) o nome dos mdicos e o nmero e andar do ambulatrio onde eles atendem, ordenado pelo nmero do ambulatrio 3) o nome do mdico e o nome dos pacientes com consulta marcada, ordenado pela data e pela hora. Buscar apenas as tuplas 3 a 5, nesta ordem 4) idades dos mdicos e o total de mdicos com a mesma idade 5) datas e o total de consultas em cada data, para horrios aps s 12 hs. 6) andares onde existem ambulatrios e a mdia de capacidade por andar 7) andares onde existem ambulatrios cuja mdia de capacidade no andar seja >= 40 8) nome dos mdicos que possuem mais de uma consulta marcada

Realizar as seguintes atualizaes:

1) passar para s 19hs todas as consultas marcadas para a paciente Ana 2) excluir os pacientes que no possuem consultas marcadas 3) passar para 21/11/2006 todas as consultas do mdico Pedro marcadas antes do meio-dia 4) o ambulatrio 4 foi transferido para o mesmo andar do ambulatrio 1 e sua capacidade agora o dobro da capacidade do ambulatrio de maior capacidade da clnica 5) o funcionrio Caio (codf = 3) tornou-se mdico. Sua especialidade a mesma da mdica Maria (codm = 2) e ele vai atender no mesmo ambulatrio dela. Inserir Caio na tabela Mdicos