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.