Está en la página 1de 27

II18

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

Subconsultas Departamento de Ingenierı́a y Ciencia de Computadores


Avanzadas
Universidad Jaume I

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

4 Subconsultas frente a Consultas Multitabla

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.

Sı́: Oracle, Access, SQL Server, etc.


No: MySQL 4.0

( 4/ 27)
II18
Bases de Datos Introducción (Cont.)
G. Quintana

Práctica 7.
Subconsultas

Introducción Muchas veces las subconsultas se pueden escribir como


Subconsultas consultas multitabla y viceversa.
de un valor

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:

Subconsultas que devuelven un único valor.


Subconsultas que devuelven un conjunto de filas (0, 1
ó más filas).

( 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

Cuando la subconsulta devuelve un único valor, la consulta


Introducción principal y la subconsulta pueden unirse por un signo de
Subconsultas
de un valor
comparación (=, <>, <, ≤, >, etc.).
Subconsultas
de Conjunto Ejemplo 1: Comparación con igualdad.
Subconsultas
y Consultas select distinct c.nombre
Multitabla from clientes c join facturas f using ( codcli )
Subconsultas where f.dto = ( select max( dto )
Avanzadas
from facturas ) ;

En este caso la subconsulta sólo devuelve un valor: el


máximo descuento aplicado en las facturas.

¿Qué obtiene la consulta?

( 7/ 27)
II18
Bases de Datos Subconsultas que Devuelven un Solo Valor (Cont.)
G. Quintana

Práctica 7.
Subconsultas

Introducción Ejemplo 2: Comparación con desigualdad.


Subconsultas
de un valor select pr.nombre
Subconsultas
from pueblos p join provincias pr using ( codpro )
de Conjunto group by codpro, pr.nombre
Subconsultas having count(*) > ( select 0.5 * max( count(*) )
y Consultas
Multitabla from pueblos p2
Subconsultas group by p2.codpro );
Avanzadas

En este caso la subconsulta sólo devuelve un valor: la


mitad del máximo número de pueblos por provincia.

¿Qué obtiene la consulta?

( 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

La subconsulta devuelve un único valor.

¿Qué obtiene la consulta?

( 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.

Introducción Ejemplo: Clientes con facturas con descuento 10.


Subconsultas select codcli, nombre
de un valor
from clientes c
Subconsultas
de Conjunto where exists ( select *
Subconsultas from facturas f
y Consultas
Multitabla
where f.dto = 10
Subconsultas
and f.codcli = c.codcli );
Avanzadas
codfac codcli dto
1 51 10 codcli nombre
2 51 11 51 Pepe
3 52 30 52 Juan
4 52 40 53 Carlos
5 53 10 54 Alberto
6 53 10
( 13/ 27)
II18
Bases de Datos Subconsultas que Devuelven un Conjunto (Cont.)
G. Quintana

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

Cuidado con el operador not in y el valor nulo:


Introducción
select c.codcli, c.nombre
Subconsultas
de un valor from clientes c
Subconsultas where c.codcli in ( select f.codcli
de Conjunto from facturas f );
Subconsultas
y Consultas codcli nombre codfac codcli iva
Multitabla
1 Pepe 101 1 16
Subconsultas
Avanzadas 2 Juan 102 4 7
3 Carlos 103 1 16
4 Alberto 104 7

¿Resultados con el operador in?

¿Resultados con el operador not in?

( 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

¿Resultados con la tabla de la izquierda?

¿Resultados con la tabla de la derecha?

( 16/ 27)
II18
Bases de Datos Subconsultas que Devuelven un Conjunto (Cont.)
G. Quintana

Práctica 7.
Subconsultas

Introducción

Subconsultas Operador any:


de un valor

Subconsultas select f.codfac


de Conjunto
from facturas f
Subconsultas
y Consultas
where f.iva = 16
Multitabla and f.codcli = any( select c.codcli
Subconsultas from clientes c
Avanzadas
where c.codpostal like ’12%’ )

Cuidado con los nulos y el operador <>.

( 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

Introducción A veces una consulta con una subconsulta se puede


Subconsultas escribir como una consulta multitabla y viceversa.
de un valor

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

Subconsultas codfac codcli fecha


de un valor codcli nombre 1 51 x-8-x
Subconsultas
de Conjunto
51 Pepe 2 51 x-1-x
52 Juan 3 52 x-8-x
Subconsultas
y Consultas 53 Carlos 4 52 x-8-x
Multitabla
54 Alberto 5 53 x-2-x
Subconsultas
Avanzadas 6 53 x-3-x

Búsquedas:

¿Clientes con alguna factura en agosto?


¿Clientes con ninguna factura en agosto?
¿Clientes con todas sus facturas en agosto?
( 22/ 27)
II18
Bases de Datos Búsquedas Avanzadas (Cont.)
G. Quintana

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

En la anterior sentencia el cliente 54 con nombre


Introducción Alberto, que no tiene ninguna factura, aparece en el
Subconsultas
de un valor
listado de clientes con todas sus facturas en agosto.
Subconsultas
de Conjunto Solución: La segunda subconsulta se asegura de que el
Subconsultas cliente tenga al menos una factura.
y Consultas
Multitabla

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

Otra forma de obtener los clientes que todas sus facturas


Introducción
son en agosto.
Subconsultas
de un valor

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)

También podría gustarte