subconsultas ou consultas aninhadas
DESCRIPTION
Subconsultas ou Consultas Aninhadas. Forma alternativa de especificar consultas envolvendo relacionamentos entre tabelas Otimização filtragens prévias de dados na subconsulta apenas tuplas/atributos de interesse são combinados com dados da(s) tabela(s) da consulta externa - PowerPoint PPT PresentationTRANSCRIPT
Subconsultas ou Consultas Aninhadas
• Forma alternativa de especificar consultas envolvendo relacionamentos entre tabelas
• Otimização– filtragens prévias de dados na subconsulta
• apenas tuplas/atributos de interesse são combinados com dados da(s) tabela(s) da consulta externa
• Cláusulas de subconsulta– nome_atributo [NOT] IN (consulta_SQL)– nome_atributo [< | <= | > | >= | < > | !=] ANY
(consulta_SQL)– nome_atributo [< | <= | > | >= | < > | !=] ALL
(consulta_SQL)
Subconsultas com IN • Testam uma relação de pertinência elemento-
conjunto
select lista_atributos
from tabela1 [...]
where atributo_ou_expressão [NOT] IN(consulta_SQL)
• Mapeamento para a álgebra relacionalselect a1, ..., an
from t1
where c IN (select x from t2
where d > 5)
a1, ..., an (t1 X (x ( d > 5 (t2)))) = t1.c = t2.x
ExemplosÁlgebra SQL
nome ((Médicos X = Médicos.codm = Consultas.codm
(codm ( data = ’06/06/13’ (Consultas))) ) )
Select nomeFrom MédicosWhere codm in (select codm from Consultas where data = ‘06/06/13’)
(RG (Funcionários)) (RG (Pacientes))
Select RG From FuncionáriosWhere RG not in(select RG from Pacientes)
(RG (Médicos)) (RG (Pacientes))
Select RGFrom MédicosWhere RG in(select RG from Pacientes)
Diferença/Intersecção de Tabelas• Exige tabelas compatíveis
• Exemplos
• Observação– MySQL não implementa estas operações
Álgebra SQL
relação1 relação2 consultaSQL1 except consultaSQL2
relação1 relação2 consultaSQL1 intersect consultaSQL2
(RG (Funcionários)) (RG (Pacientes))
Select RG From Funcionários except
Select RG From Pacientes
(RG (Médicos)) (RG (Pacientes))
Select RG From Médicos intersect
Select RG From Pacientes
Subconsultas com ANY • Permitem outras comparações do tipo
elemento-conjunto– testam se um valor é >, <, =, ... que algum valor
em um conjuntoselect lista_atributos
from tabela1 [, ...]
where atributo_ou_expressão [=|<|<=|>|>=|<>| !=] ANY(consulta_SQL)
• Mapeamento para a álgebra relacionalselect a1, ..., an
from t1
where c > ANY (select x from t2
where d > 5)
a1, ..., an (t1 X (x ( d > 5 (t2)))) = t1.c > t2.x
Exemplos
Álgebra SQL
nome ((Médicos X = Médicos.codm = Consultas.codm
(codm ( data = ’06/06/13’ (Consultas))) ) )
Select nomeFrom MédicosWhere codm = any (ou in)(select codm from Consultas where data = ‘06/06/13’)
Funcionários.idade ((( idade (Funcionários)) X = Funcionários.idade < f2.idade
( idade ( f2 (Funcionários)))
Select nomeFrom Funcionários Where idade < any (Select idade from Funcionários)
Subconsultas com ALL • Realizam uma comparação de igualdade ou
desigualdade de um elemento com todos os elementos de um conjunto ao mesmo tempo
select lista_atributos
from tabela1 [, ...]
where atributo_ou_expressão [=|<|<=|>|>=|<>| !=] ALL(consulta_SQL)
• Não há correspondência com a álgebra relacional– não é equivalente a divisão
• não filtra automaticamente atributos do dividendo• na divisão, os operandos podem ter mais de um atributo• na divisão existe apenas comparação de igualdade
Exemplos
Select nomeFrom FuncionáriosWhere salário > all
(Select salário From Funcionários Where departamento = ‘enfermaria’)
Select nomeFrom FuncionáriosWhere RG < > all (or not in)
(Select RG From Pacientes)
Comparações Elemento-Elemento
• Casos em que a subconsulta retorna uma única tupla como resultado– não é utilizada nenhuma cláusula de
subconsulta neste caso
select lista_atributos
from tabela1 [, ...]
where atributo_ou_expressão [=|<|<=|>|>=|<>| !=] (consulta_SQL com um único elemento)
Exemplos
Select nomeFrom FuncionáriosWhere salário >
(Select salário From Funcionários Where RG = 2200020000)
select nome, RGfrom Médicoswhere RG < > 1000010000and especialidade =
(select especialidade from Médicos where RG = 1000010000)
Subconsultas com EXISTS • Quantificador existencial do cálculo relacional
– testa se um predicado é V ou F na subconsulta– para cada tupla da consulta externa a ser
analisada, a subconsulta é executadaselect lista_atributos
from tabela1 [, ...]
where [NOT] EXISTS(consulta_SQL)
• Mapeamento para o cálculo relacionalselect a1, ..., an
from T1
where EXISTS (select * from T2
where d > 5 and T2.x = T1.c)
{t1.a1, ..., t1.an | t1 T1 t2 T2 (t2.d > 5 t2.x = t1.c) }
ExemplosCálculo SQL
{m.nome | m Médicos c Consultas (c.data = ’06/06/13’ c.codm = m.codm)}
Select nomeFrom Médicos mWhere exists (Select * From consultas Where data = ‘06/06/13’ and codm = m.codm)
{f.nome | f Funcionários f.depto = ‘adm’ p Pacientes (p.RG = f.RG)}
Select f.nomeFrom Funcionários fWhere f.depto = ‘adm’and not exists (Select * From pacientes Where RG = f.RG)
Relembrando...
t R (P(t)) t R ( P(t))
• Buscar o nome dos médicos que têm consulta marcada com todos os pacientes
{m.nome | m Médicos p Pacientes ( c Consultas (p.codp = c.codp c.codm = m.codm))}
{m.nome | m Médicos p Pacientes ( c Consultas
(p.codp = c.codp c.codm = m.codm))}
Exemplo
Cálculo SQL
{m.nome | m Médicos p Pacientes ( c Consultas (p.codp = c.codp c.codm = m.codm))}
Select nomeFrom Médicos mWhere not exists (Select * From Pacientes p Where not exists (Select * From Consultas c Where c.codp = p.codp and c.codm = m.codm))
Subconsulta na Cláusula FROM • Permite a geração de uma tabela derivada a
ser utilizada na consulta externa– otimização: filtra linhas e colunas de uma tabela
que são desejadas pela consulta externa
select lista_atributos
from (consulta_SQL) as nome_tabela_derivada
• Mapeamento para a álgebra relacionalselect 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 SQL
select Medicos.*, C.horafrom Medicos join (select codm, hora from Consultas where data = '06/06/13') as Con Médicos.codm = C.codm
Médicos.codm, ..., nroa, hora (
(Médicos X
= Médicos.codm = C.codm
C (codm, hora ( data = ’06/06/13’ (Consultas))) ) )
select Amb.*from (select nroa, andar from ambulatorios) as Amb join (select nroa from Medicos where cidade = ‘Fpolis') as M_orton Amb.nroa = M_ort.nroa
Amb.nroa, andar, capacidade (Amb (nroa, andar (Ambulatórios)) X
= Amb.nroa = M_ort.nroa
M_ort (nroa ( cidade = ’Fpolis’ (Médicos))) )