SUBSELECT en SQL
Una SUBSELECT o subconsulta, es una consulta anidada dentro de otra consulta SELECT
, SUBSELECT o bien otras sentencias SQL
como INSERT
, UPDATE
o DELETE
. En esta sección nos centraremos en las SUBSELECT dentro de las sentencias SELECT
y veremos cómo aplicarlas con ejemplos sobre nuestras tablas Clientes
y Pedidos
.
Una SELECT
puede contener internamente otra SELECT
en alguna de sus cláusulas. Esta SELECT
interna encerrada entre paréntesis es la denominada SUBSELECT.
Las SUBSELECT ayudan en el filtrado de datos y atienden a las siguientes características y recomendaciones:
-
Deben ir siempre entre paréntesis.
-
Generalmente no pueden utilizar ORDER BY a no ser que vayan precedidas de la cláusula
TOP
. -
Suelen ir precedidas de cláusulas
ALL
,IN
,NOT IN
,EXISTS
,NOT EXISTS
. -
No es recomendable utilizar campos calculados ya que pueden ralentizar la consulta.
Veremos a continuación ejemplos de acuerdo a la ubicación de la expresión de una sentencia SELECT
:
Cláusula SELECT
Una SUBSELECT, puede ubicarse en el listado de columnas de la expresión SELECT
para devolver el resultado como un campo más del conjunto de resultados:
SELECT nombre,
apellidos,
(SELECT SUM (totalPrecio)
FROM Pedidos
WHERE idClientes = 4) AS gastoTotal
FROM Clientes
WHERE idClientes = 4
nombre | apellidos | gastoTotal |
---|---|---|
Luis | Sanchez García | 4999 |
Como podemos observar, la ejecución nos devuelve el nombre
y apellidos
de la tabla Clientes
y el resultado de la suma de todos los totalPrecio
de la tabla Pedidos
.
Cláusula FROM
La cláusula FROM
admite en lugar de la definición de una tabla, una SUBSELECT que devuelva resultados filtrados:
SELECT C.*
FROM Clientes C
INNER JOIN
(SELECT *
FROM Pedidos
WHERE fechaPedido >= '2022-09-01') AS S
ON C.idClientes = S.idClientes
WHERE S.idClientes IS NOT NULL
idClientes | nombre | apellidos | direccion | cuenta |
---|---|---|---|---|
4 | Luis | Sanchez García | C/ de la luz 21 | 447824556 |
4 | Luis | Sanchez García | C/ de la luz 21 | 447824556 |
5 | Alejandro | Valero Martinez | C/ Serrano 67 | 778345112 |
Cláusula WHERE
En la cláusula WHERE
, es sin duda el lugar donde a menudo son utilizadas más SUBSELECT para realizar comparaciones y filtrar resultados:
SELECT *
FROM Clientes
WHERE idClientes IN
(SELECT idClientes
FROM Pedidos
WHERE producto = 'Play Station 5');
idClientes | nombre | apellidos | direccion | cuenta |
---|---|---|---|---|
2 | María | Lopez ruiz | C/ Alcalá 138 | 123456789 |
En esta ejecución sin necesidad de establecer un JOIN
entre las tablas Clientes
y Pedidos
, podemos devolver la información de un cliente
de acuerdo al nombre de un producto
de un pedido que haya realizado. A continuación, veremos otro ejemplo:
SELECT idClientes,
idPedidos,
producto,
precio
FROM Pedidos
WHERE precio > ALL
(SELECT precio
FROM Pedidos
WHERE idClientes = 2)
idClientes | idPedidos | producto | precio |
---|---|---|---|
1 | 4 | MacBook Pro M1 | 2449,5 |
NULL | 8 | Horno Balay | 699,55 |
Esta ejecución nos está devolviendo los registros de la tabla Pedidos
cuyos precios sean mayores a todos los precios del idClientes = 2
.