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.