subconsultas ou consultas aninhadas

Post on 19-Jan-2016

33 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

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

top related