subconsultas ou consultas aninhadas

16
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)

Upload: rocio

Post on 19-Jan-2016

33 views

Category:

Documents


0 download

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 Presentation

TRANSCRIPT

Page 1: Subconsultas ou Consultas Aninhadas

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)

Page 2: Subconsultas ou Consultas Aninhadas

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

Page 3: Subconsultas ou Consultas Aninhadas

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)

Page 4: Subconsultas ou Consultas Aninhadas

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

Page 5: Subconsultas ou Consultas Aninhadas

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

Page 6: Subconsultas ou Consultas Aninhadas

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)

Page 7: Subconsultas ou Consultas Aninhadas

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

Page 8: Subconsultas ou Consultas Aninhadas

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)

Page 9: Subconsultas ou Consultas Aninhadas

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)

Page 10: Subconsultas ou Consultas Aninhadas

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)

Page 11: Subconsultas ou Consultas Aninhadas

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) }

Page 12: Subconsultas ou Consultas Aninhadas

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)

Page 13: Subconsultas ou Consultas Aninhadas

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))}

Page 14: Subconsultas ou Consultas Aninhadas

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))

Page 15: Subconsultas ou Consultas Aninhadas

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

Page 16: Subconsultas ou Consultas Aninhadas

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))) )