Subconsultas en Oracle

Cuando necesitas obtener un resultado basado en otro conjunto de datos, las subconsultas en Oracle son la herramienta perfecta que permite anidar consultas SQL dentro de otras, lo que abre la puerta a una gran variedad de soluciones potentes y flexibles.

En este artículo voy a explicarte qué es una subconsulta en Oracle, cómo se utiliza, los distintos tipos que existen y algunos ejemplos prácticos que puedes reutilizar directamente en tus desarrollos.

¿Qué es una subconsulta?

Una subconsulta es una instrucción SELECT que aparece dentro de otra consulta. Se evalúa primero y su resultado se utiliza en la instrucción principal. Puedes usarlas en el WHERE, FROM, SELECT, HAVING, e incluso dentro de cláusulas como INSERT o UPDATE.

Tipos de subconsultas

  • Escalar: devuelve un único valor.
  • De fila: devuelve una fila completa (varias columnas).
  • De tabla: devuelve varias filas.
  • Correlacionadas: dependen de la fila de la consulta externa.
  • Anidadas: subconsultas dentro de subconsultas.

Sintaxis básica

SELECT columna
FROM tabla
WHERE columna = (SELECT columna FROM otra_tabla WHERE condición);

Ejemplos prácticos

Preparación de datos

CREATE TABLE departamentos (
    id_departamento NUMBER,
    nombre_departamento VARCHAR2(50)
);

INSERT INTO departamentos VALUES (1, 'Recursos Humanos');
INSERT INTO departamentos VALUES (2, 'Tecnología');
INSERT INTO departamentos VALUES (3, 'Finanzas');
CREATE TABLE empleados (
    id_empleado NUMBER,
    nombre VARCHAR2(50),
    id_departamento NUMBER,
    sueldo NUMBER
);

INSERT INTO empleados VALUES (1, 'Miguel Troyano', 1, 60000);
INSERT INTO empleados VALUES (2, 'Ismael Troyano', 1, 70000);
INSERT INTO empleados VALUES (3, 'Pilar Redondo', 2, 80000);
INSERT INTO empleados VALUES (4, 'Laura Núñez', 2, 50000);
INSERT INTO empleados VALUES (5, 'Carlos Ortega', 3, 90000);

Ejemplo 1: Subconsulta escalar

Devuelve un único valor.

SELECT nombre, sueldo
FROM empleados
WHERE sueldo = (
    SELECT MAX(sueldo)
    FROM empleados
);

La subconsulta devuelve el sueldo más alto, y la principal selecciona quién lo cobra.

Ejemplo 2: Subconsulta de fila

Devuelve una fila completa (varias columnas).

SELECT *
FROM empleados
WHERE (id_departamento, sueldo) = (
    SELECT id_departamento, MAX(sueldo)
    FROM empleados
    GROUP BY id_departamento
    HAVING id_departamento = 2
);

Devuelve el empleado con mayor sueldo del departamento 2.

Ejemplo 3: Subconsulta de tabla

Devuelve varias filas (una columna o más).

SELECT nombre
FROM empleados
WHERE id_departamento IN (
    SELECT id_departamento
    FROM departamentos
    WHERE nombre_departamento IN ('Recursos Humanos', 'Finanzas')
);

Selecciona empleados de los departamentos indicados. Aquí la subconsulta devuelve una tabla con varios id_departamento

Ejemplo 4: Subconsulta correlacionada

Depende de la fila de la consulta externa.

SELECT e1.nombre, e1.sueldo
FROM empleados e1
WHERE sueldo > (
    SELECT AVG(e2.sueldo)
    FROM empleados e2
    WHERE e2.id_departamento = e1.id_departamento
);

Compara el sueldo de cada empleado con la media de su propio departamento. La subconsulta se ejecuta para cada fila.

Ejemplo 5: Subconsulta anidada

Subconsulta dentro de otra subconsulta.

SELECT nombre
FROM empleados
WHERE id_departamento IN (
    SELECT id_departamento
    FROM departamentos
    WHERE id_departamento IN (
        SELECT id_departamento
        FROM empleados
        WHERE sueldo > 70000
    )
);

Encuentra empleados que pertenezcan a departamentos donde al menos un empleado cobra más de 70.000. La condición pasa por dos niveles de filtrado.

Buenas prácticas

  • Las subconsultas en Oracle escalar son ideales para comparaciones directas (=, >, <).
  • Usa IN o EXISTS cuando la subconsulta devuelve múltiples filas.
  • Las correlacionadas son potentes, pero pueden penalizar el rendimiento en tablas grandes. Evalúa alternativas como JOIN o WITH.
  • Siempre revisa si la subconsulta puede devolver NULL, ya que puede cambiar el comportamiento del filtro.

Escribir un comentario