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
oEXISTS
cuando la subconsulta devuelve múltiples filas. - Las correlacionadas son potentes, pero pueden penalizar el rendimiento en tablas grandes. Evalúa alternativas como
JOIN
oWITH
. - Siempre revisa si la subconsulta puede devolver
NULL
, ya que puede cambiar el comportamiento del filtro.