Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Bases de Datos
G. Quintana
Práctica 7.
Subconsultas
Introducción
Subconsultas
de un valor
Subconsultas
Práctica 7. Subconsultas
de Conjunto
Subconsultas
y Consultas
Multitabla
Curso 2010–11
( 1/ 27)
II18
Bases de Datos Contenido
G. Quintana
Práctica 7.
Subconsultas
Introducción 1 Introducción
Subconsultas
de un valor
Subconsultas
de Conjunto
2 Subconsultas que Devuelven un Solo Valor
Subconsultas
y Consultas
Multitabla 3 Subconsultas que Devuelven un Conjunto
Subconsultas
Avanzadas
5 Subconsultas Avanzadas
( 2/ 27)
II18
Bases de Datos
G. Quintana
Práctica 7.
Subconsultas
Introducción
Subconsultas
de un valor
Subconsultas
de Conjunto
Subconsultas
y Consultas
Multitabla Introducción
Subconsultas
Avanzadas
( 3/ 27)
II18
Bases de Datos Introducción
G. Quintana
Práctica 7.
Subconsultas
Introducción
Definición: Una subconsulta es una sentencia select
Subconsultas
de un valor dentro de otra sentencia select.
Subconsultas
de Conjunto La subconsulta obtiene unos resultados intermedios (uno o
Subconsultas más datos) que se emplean en la consulta principal
y Consultas
Multitabla (habitualmente en el where o en el having).
Subconsultas
Avanzadas Algunos SGBD permiten el uso de subconsultas y otros no.
( 4/ 27)
II18
Bases de Datos Introducción (Cont.)
G. Quintana
Práctica 7.
Subconsultas
Subconsultas
de Conjunto
Las subconsultas siempre deben estar escritas entre
Subconsultas
paréntesis.
y Consultas
Multitabla
Las subconsultas se puede clasificar en dos tipos,
Subconsultas
Avanzadas atendiendo al número de filas y columnas que devuelven:
( 5/ 27)
II18
Bases de Datos
G. Quintana
Práctica 7.
Subconsultas
Introducción
Subconsultas
de un valor
Subconsultas
de Conjunto
Subconsultas
y Consultas
Subconsultas que Devuelven
Multitabla
Subconsultas
Avanzadas
un Solo Valor
( 6/ 27)
II18
Bases de Datos Subconsultas que Devuelven un Solo Valor
G. Quintana
Práctica 7.
Subconsultas
( 7/ 27)
II18
Bases de Datos Subconsultas que Devuelven un Solo Valor (Cont.)
G. Quintana
Práctica 7.
Subconsultas
( 8/ 27)
II18
Bases de Datos Subconsultas que Devuelven un Solo Valor (Cont.)
G. Quintana
Práctica 7.
Subconsultas
Introducción
Subconsultas
Ejemplo 3: Muy habitual. Búsqueda de un ı́tem con una
de un valor caracterı́stica máxima.
Subconsultas
de Conjunto select descrip
Subconsultas from articulos
y Consultas
Multitabla where precio = ( select max( precio )
Subconsultas from articulos );
Avanzadas
( 9/ 27)
II18
Bases de Datos
G. Quintana
Práctica 7.
Subconsultas
Introducción
Subconsultas
de un valor
Subconsultas
de Conjunto
Subconsultas
y Consultas
Subconsultas que Devuelven
Multitabla
Subconsultas
Avanzadas
un Conjunto
( 10/ 27)
II18
Bases de Datos Subconsultas que Devuelven un Conjunto
G. Quintana
Práctica 7.
Subconsultas
Las subconsultas que devuelven un conjunto de valores
devuelven un conjunto indeterminado de filas (no conocido
Introducción
a priori): cero, una o muchas.
Subconsultas
de un valor
Subconsultas
Ejemplo de USO INCORRECTO:
de Conjunto
select descrip
Subconsultas
y Consultas from articulos
Multitabla
where precio = ( select precio from lineas_fac );
Subconsultas
Avanzadas
Existen varias formas de conectar la consulta y la
subconsulta:
1 valor in ( subconsulta )
2 exists( subconsulta )
3 valor operador any( subconsulta )
4 valor =|>|>=|... all( subconsulta )
( 11/ 27)
II18
Bases de Datos Subconsultas que Devuelven un Conjunto (Cont.)
G. Quintana
Práctica 7.
Subconsultas
Conexión mediante in:
Introducción Ejemplo: Clientes con facturas con descuento 10.
Subconsultas
de un valor select codcli, nombre
Subconsultas from clientes
de Conjunto
where codcli in ( select f.codcli
Subconsultas from facturas f
y Consultas
Multitabla where f.dto = 10 );
Subconsultas
Avanzadas
codfac codcli dto
1 51 10 codcli nombre
f.codcli
2 51 11 51 Pepe
51
3 52 30 → 52 Juan
53
4 52 40 53 Carlos
53
5 53 10 54 Alberto
6 53 10
( 12/ 27)
II18
Bases de Datos Subconsultas que Devuelven un Conjunto (Cont.)
G. Quintana
Práctica 7.
Subconsultas Conexión mediante exists: Uso de referencias externas.
Práctica 7.
Subconsultas Otra forma de unir la consulta y la subconsulta es
mediante un not in o un not exists.
Introducción
Subconsultas
Ejemplos de subconsulta con conjunto independiente:
de un valor
select codcli, nombre
Subconsultas from clientes
de Conjunto
where codcli not in ( select f.codcli
Subconsultas
y Consultas from facturas f
Multitabla
where f.dto = 10 );
Subconsultas
Avanzadas
Ejemplos de subconsulta con referencia externa (conjunto
dependiente):
select c.codcli, c.nombre
from clientes c
where not exists( select *
from facturas f
where f.codcli = c.codcli
and ( 14/ 27)f.dto = 10 );
II18
Bases de Datos Subconsultas que Devuelven un Conjunto (Cont.)
G. Quintana
Práctica 7.
Subconsultas
( 15/ 27)
II18
Bases de Datos Subconsultas que Devuelven un Conjunto (Cont.)
G. Quintana
Práctica 7.
Subconsultas
Operador all:
Introducción
select a.codart
Subconsultas
de un valor from articulos a
Subconsultas where a.precio >= all( select a2.precio
de Conjunto from articulos a2 );
Subconsultas
y Consultas codart precio codart precio
Multitabla
A1 4 A1 4
Subconsultas
Avanzadas A2 2 A2 2
A3 5 A3 5
A4 3 A4
( 16/ 27)
II18
Bases de Datos Subconsultas que Devuelven un Conjunto (Cont.)
G. Quintana
Práctica 7.
Subconsultas
Introducción
( 17/ 27)
II18
Bases de Datos Subconsultas que Devuelven un Conjunto (Cont.)
G. Quintana
Práctica 7.
Subconsultas
Los operadores exists y not exists obligan a que la
Introducción
subconsulta tenga al menos una referencia externa.
Subconsultas
de un valor Ejemplo:
Subconsultas
de Conjunto
select codcli, nombre
Subconsultas
from clientes
y Consultas where exists ( select *
Multitabla
from facturas f
Subconsultas
Avanzadas where f.dto = 10
and f.codcli = c.codcli );
select codcli, nombre
from clientes
where exists ( select *
from facturas f
where f.dto = 10 );
( 18/ 27)
II18
Bases de Datos
G. Quintana
Práctica 7.
Subconsultas
Introducción
Subconsultas
de un valor
Subconsultas
de Conjunto
Subconsultas
y Consultas
Subconsultas frente a
Multitabla
Subconsultas
Avanzadas
Consultas Multitabla
( 19/ 27)
II18
Bases de Datos Subconsultas frente a Consultas Multitabla
G. Quintana
Práctica 7.
Subconsultas
Subconsultas
de Conjunto
¿Son exactamente equivalentes las dos sentencias
Subconsultas siguientes?
y Consultas
Multitabla select c.codcli, c.nombre
Subconsultas from clientes c
Avanzadas
where c.codcli in ( select f.codcli
from facturas f );
select c.codcli, c.nombre
from clientes c join facturas f using ( codcli );
( 20/ 27)
II18
Bases de Datos
G. Quintana
Práctica 7.
Subconsultas
Introducción
Subconsultas
de un valor
Subconsultas
de Conjunto
Subconsultas
y Consultas
Multitabla Subconsultas Avanzadas
Subconsultas
Avanzadas
( 21/ 27)
II18
Bases de Datos Subconsultas Avanzadas
G. Quintana
Práctica 7.
Subconsultas
Las subconsultas permiten conseguir información muy
refinada.
Introducción
Búsquedas:
Práctica 7.
Subconsultas ¿Clientes con alguna factura en agosto?
select *
Introducción from clientes
Subconsultas where codcli in( select f.codcli
de un valor
from facturas f
Subconsultas
de Conjunto where to_char(f.fecha,’mm’) = ’08’ );
Subconsultas codfac codcli fecha
y Consultas
Multitabla 1 51 x-8-x
codfac codcli fecha f.codcli
Subconsultas 2 51 x-1-x
Avanzadas 1 51 x-8-x 51
3 52 x-8-x → →
3 52 x-8-x 52
4 52 x-8-x
4 52 x-8-x 52
5 53 x-2-x
6 53 x-3-x
codcli nombre
51 Pepe
52 Juan
53 Carlos
( 23/ 27)
54 Alberto
II18
Bases de Datos Búsquedas Avanzadas (Cont.)
G. Quintana
Práctica 7.
Subconsultas ¿Clientes con ninguna factura en agosto?
select *
Introducción from clientes
Subconsultas where codcli not in( select f.codcli
de un valor
from facturas f
Subconsultas
de Conjunto where to_char(f.fecha,’mm’) = ’08’ )
Subconsultas codfac codcli fecha
y Consultas
Multitabla 1 51 x-8-x
codfac codcli fecha f.codcli
Subconsultas 2 51 x-1-x
Avanzadas 1 51 x-8-x 51
3 52 x-8-x → →
3 52 x-8-x 52
4 52 x-8-x
4 52 x-8-x 52
5 53 x-2-x
6 53 x-3-x
codcli nombre
51 Pepe
52 Juan
53 Carlos
( 24/ 27)
54 Alberto
II18
Bases de Datos Búsquedas Avanzadas (Cont.)
G. Quintana
Práctica 7.
Subconsultas ¿Clientes con todas sus facturas en agosto?
select *
Introducción from clientes
Subconsultas where codcli not in( select f.codcli
de un valor
from facturas f
Subconsultas
de Conjunto where to_char(f.fecha,’mm’) <> ’08’
Subconsultas codfac codcli fecha
y Consultas
Multitabla 1 51 x-8-x
codfac codcli fecha f.codcli
Subconsultas 2 51 x-1-x
Avanzadas 2 51 x-1-x 51
3 52 x-8-x → →
5 53 x-2-x 53
4 52 x-8-x
6 53 x-3-x 53
5 53 x-2-x
6 53 x-3-x
codcli nombre
51 Pepe
52 Juan
53 Carlos
( 25/ 27)
54 Alberto
II18
Bases de Datos Búsquedas Avanzadas (Cont.)
G. Quintana
Práctica 7.
Subconsultas
Subconsultas
select *
Avanzadas from clientes
where codcli not in( select f.codcli
from facturas f
where to_char(f.fecha,’mm’) <> ’08’
and codcli in( select f.codcli
from facturas f );
( 26/ 27)
II18
Bases de Datos Búsquedas Avanzadas (Cont.)
G. Quintana
Práctica 7.
Subconsultas
Subconsultas
Solución: Clientes que tienen facturas en agosto menos
de Conjunto
aquellos clientes que tienen facturas en otros meses.
Subconsultas
y Consultas
Multitabla select f1.codcli
Subconsultas from facturas f1
Avanzadas
where to_char( f1.fecha, ’mm’ ) = ’08’
minus
select f2.codcli
from facturas f2
where to_char( f2.fecha, ’mm’ ) <> ’08’ ;
( 27/ 27)