Está en la página 1de 14

SUBCONSULTAS

• Tipos

Es una sentencia select que se utiliza dentro de otra sentencia select.


Los lugares mas habituales son las clausulas: where y having.
Tipos:

Subconsultas que devuelven un único valor.
Expresion operador (subconsulta)

Subconsultas que devuelven una única fila con mas de una
Ejemplo:
columna.
(expr1, expr2, …) operador (subconsulta)

Subconsultas que devuelven un conjunto de filas, es decir, cero,
una o varias filas. (Operadores: In, Exist, all, Any)
Subconsultas que devuelven un único valor

• Escribir una consulta que devuelva el código y la descripción del articulo más
caro.

• Select codart, decrip from articulos


• Where precio = (select max(precio) from articulos);

• Escribir una consulta que devuelva el codigo y descripcion de aquellos


articulos cuyo precio supera la media.

• Subconsultas que devuelven una unica fila


• Escribir una consulta que devuelva el codigo y fecha de aquellas facturas
para las cuales tanto su descuento como su iva son iguales a los maximos.

• Select codfac, fecha from facturas


• Where (dto, iva) = (select max(dto), max(iva) from facturas
Subconsultas que devuelven un conjunto de filas

Operadores : IN, EXIST, ALL, ANY


Operador IN : a in b. Devuelve cierto si a pertenece al conjunto b.
Operador EXISTS : exists( b). Devuelve cierto si el conjunto b
contiene al menos un elemento(una fila).
Ejemplo:

Codigo y nombre de aquellos pueblos donde hay algun cliente.


Select codpue, nombre from pueblos
Where codpue IN (select distinct codpue from clientes)

Select codpue, nombre from pueblos


Where EXISTS (select * from clientes
Where clientes.codpue= pueblos.codpue)
Subconsultas que devuelven un conjunto de filas

Operador : NOT IN, NOT EXISTS.


Ejemplo: Codigo y nombre de aquellos vendedores que no tienen
ninguna factura.
(Esta solucion no es del todo correcta) Nulos de facturas
Select codven, nombre from vendedores where codven NOT IN
(select distinct codven from facturas);
Solucion correcta:
Select codven, nombre from vendedores where codven NOT IN
(select distinct codven from facturas where codven is not null);

Select codven, nombre from vendedores where NOT EXISTS


(select * from facturas where
facturas.codven=vendedores.codven);
Subconsultas que devuelven un conjunto de filas

Operador : ANY. Expresion operador any(subconsulta)


Cuando la subconsulta devuelve una sola columna. El operador
debe ser una comparacion (=, <>, >, <, >=, <=)

Ejemplo: Facturas con descuentos como los de las facturas sin Iva

Select * from facturas where coalesce ( dto, 0) =


Any ( select coalesce(dto, 0) from facturas
where coalesce ( iva, 0)= 0)

Cuando la subconsulta devuelve mas de una columna. El


operador debe ser : = , <> .
Subconsultas que devuelven un conjunto de filas

Cuando la subconsulta devuelve mas de una columna. El


operador debe ser : = , <> .
Ej: Devuelve una columna- operadores: =,<>,>=,<=
Select * from articulos where precio > (select precio from
articulos where codart='4283200')

Ej: Devuelve mas de una columna- operadores: =,<>,


Articulos que tienen el mismo precio y mismo stock minimo que
el articulo de codigo 4283200
Select * from articulos where (precio,stockmin) =
(select precio, stockmin from articulos where codart='4283200')
Subconsultas que devuelven un conjunto de filas

Operador : ALL. Expresion operador all(subconsulta)


Cuando la subconsulta devuelve una sola columna. El operador
debe ser una comparacion (=, <>, >, <, >=, <=)

Ejemplo: Codigo y descripcion de los articulos con mayor precio.

Select codart, descrip from articulos where precio >= ALL


( select precio from articulos where precio is not null)
Operador : EXIST. Exist (subconsulta). Devuelve verdadero si la
subconsulta devuelve al menos una fila.
Ejemplo: Mostrar el codigo y nombre de aquellos pueblos donde
hay clientes
Select codpue, nombre from pueblos where EXIST
(select * from clientes where clientes.codpue= pueblos.codpue)
Subconsultas en el having

La clausula having puede hacer restricciones sobre grupos.

Consulta los datos del cliente que ha realizado mas facturas


durante el año pasado.

Select facturas.codcli, nombre from clientes, facturas where


extract(year from current_date)- extract(year from fecha)=1
Group by 1,2
Having count(codfac)>= ALL
(select count(codfac) from facturas
Where extract(year from current_date)- extract(year from
fecha)=1
group by codcli)
Subconsultas en el having

Primero ejecutamos la subconsulta y calculamos el numero total


de facturas de cada cliente que facturo el año pasado.

Consulta los datos del cliente que ha realizado mas facturas


durante el año pasado.

Select facturas.codcli, nombre from clientes, facturas where


extract(year from current_date)- extract(year from fecha)=1
Group by 1,2
Having count(codfac)>= ALL
(50, 25, 110, 220, 320, 450, 134, 155, 160)
Subconsultas

Se utiliza la cláusula UNION


SELECT columnas
FROM tabla
[WHERE condiciones]
UNION [ALL]
SELECT columnas
FROM tabla
Se utiliza la
[WHERE condiciones];

Ejemplo: ciudad
Barcelona
SELECT ciudad
Girona
FROM clientes
UNION Lleida
SELECT ciudad_dep Tarragona
FROM departamentos;
La intersección

Se utiliza la cláusula INTERSECT


SELECT columnas
FROM tabla
[WHERE condiciones]
INTERSECT [ALL]
SELECT columnas
FROM tabla
Se utiliza la
[WHERE condiciones];

Ejemplo: ciudad
Barcelona
SELECT ciudad
Girona
FROM clientes
INTERSECT Lleida
SELECT ciudad_dep Tarragona
FROM departamentos;
La intersección II
También podemos usar la clausula IN para las intersecciones

SELECT c.ciudad
FROM clientes c
WHERE c.ciudad IN ( SELECT d.ciudad_dep
FROM departamentos d);

Y también la podemos encontrar con EXISTS (subconsultas)

SELECT c.ciudad
FROM clientes c
WHERE EXISTS ( SELECT *
FROM departamentos d
WHERE c.ciudad = d.ciudad_dep);
La diferencia

Se utiliza la cláusula

SELECT columnas
FROM tabla
[WHERE condiciones]
EXCEPT [ALL]
Se utiliza la
SELECT columnas
FROM tabla
[WHERE condiciones];
Ejemplo: codigo_cli
40
SELECT codigo_cli
FROM clientes
EXCEPT
SELECT codigo_cliente
FROM proyectos;
La diferencia II
También podemos usar la clausula NOT IN para la diferencia

SELECT c.codigo_cli
FROM clientes c
WHERE c.codigo_cli NOT IN (SELECT p.codigo_cliente
FROM proyectos p);

Y también la podemos encontrar con NOT EXISTS

SELECT c.codigo_cli
FROM clientes c
WHERE NOT EXISTS (SELECT *
FROM proyectos p
WHERE c.codigo_cli = p.codigo_cliente);

También podría gustarte