Las subconsultas, también conocidas como consultas anidadas, son consultas dentro de otras consultas. Son una herramienta poderosa en SQL que permite realizar consultas complejas y obtener resultados específicos. En este tema, aprenderemos cómo usar subconsultas en las cláusulas SELECT, FROM y WHERE.

Subconsultas en la cláusula SELECT

Las subconsultas en la cláusula SELECT se utilizan para calcular valores que se mostrarán en el resultado final. Estas subconsultas deben devolver un solo valor (escalar).

Ejemplo:

Supongamos que tenemos dos tablas: empleados y departamentos.

Tabla empleados: | id_empleado | nombre | salario | id_departamento | |-------------|----------|---------|-----------------| | 1 | Juan | 5000 | 1 | | 2 | Ana | 6000 | 2 | | 3 | Pedro | 5500 | 1 | | 4 | María | 7000 | 3 |

Tabla departamentos: | id_departamento | nombre_departamento | |-----------------|---------------------| | 1 | Ventas | | 2 | Marketing | | 3 | IT |

Queremos obtener el nombre de cada empleado junto con el nombre de su departamento.

SELECT
    nombre,
    (SELECT nombre_departamento
     FROM departamentos
     WHERE departamentos.id_departamento = empleados.id_departamento) AS nombre_departamento
FROM
    empleados;

Explicación:

  • La subconsulta (SELECT nombre_departamento FROM departamentos WHERE departamentos.id_departamento = empleados.id_departamento) se ejecuta para cada fila de la tabla empleados.
  • Devuelve el nombre_departamento correspondiente al id_departamento del empleado actual.

Subconsultas en la cláusula FROM

Las subconsultas en la cláusula FROM se utilizan para crear una tabla temporal que puede ser referenciada en la consulta principal. Esto es útil para simplificar consultas complejas.

Ejemplo:

Queremos obtener el salario promedio de cada departamento y listar los empleados cuyo salario es mayor que el promedio de su departamento.

SELECT
    e.nombre,
    e.salario,
    d.salario_promedio
FROM
    empleados e
JOIN
    (SELECT
         id_departamento,
         AVG(salario) AS salario_promedio
     FROM
         empleados
     GROUP BY
         id_departamento) d
ON
    e.id_departamento = d.id_departamento
WHERE
    e.salario > d.salario_promedio;

Explicación:

  • La subconsulta (SELECT id_departamento, AVG(salario) AS salario_promedio FROM empleados GROUP BY id_departamento) calcula el salario promedio por departamento.
  • Esta subconsulta se utiliza como una tabla temporal d en la cláusula FROM.
  • La consulta principal une la tabla empleados con la tabla temporal d y filtra los empleados cuyo salario es mayor que el promedio de su departamento.

Subconsultas en la cláusula WHERE

Las subconsultas en la cláusula WHERE se utilizan para filtrar filas basadas en los resultados de otra consulta. Estas subconsultas pueden devolver un solo valor o un conjunto de valores.

Ejemplo:

Queremos listar los empleados que trabajan en el departamento con el salario promedio más alto.

SELECT
    nombre
FROM
    empleados
WHERE
    id_departamento = (
        SELECT
            id_departamento
        FROM
            empleados
        GROUP BY
            id_departamento
        ORDER BY
            AVG(salario) DESC
        LIMIT 1
    );

Explicación:

  • La subconsulta (SELECT id_departamento FROM empleados GROUP BY id_departamento ORDER BY AVG(salario) DESC LIMIT 1) encuentra el id_departamento con el salario promedio más alto.
  • La consulta principal filtra los empleados que pertenecen a ese departamento.

Ejercicios Prácticos

Ejercicio 1:

Lista los nombres de los empleados cuyo salario es mayor que el salario promedio de todos los empleados.

SELECT
    nombre
FROM
    empleados
WHERE
    salario > (SELECT AVG(salario) FROM empleados);

Ejercicio 2:

Encuentra los nombres de los empleados que trabajan en departamentos donde el salario promedio es mayor que 6000.

SELECT
    nombre
FROM
    empleados
WHERE
    id_departamento IN (
        SELECT
            id_departamento
        FROM
            empleados
        GROUP BY
            id_departamento
        HAVING
            AVG(salario) > 6000
    );

Ejercicio 3:

Lista los nombres de los empleados y el nombre de su departamento, pero solo para aquellos empleados cuyo salario es mayor que el salario promedio de su departamento.

SELECT
    e.nombre,
    (SELECT nombre_departamento
     FROM departamentos
     WHERE departamentos.id_departamento = e.id_departamento) AS nombre_departamento
FROM
    empleados e
WHERE
    e.salario > (
        SELECT
            AVG(salario)
        FROM
            empleados
        WHERE
            id_departamento = e.id_departamento
    );

Conclusión

Las subconsultas son una herramienta poderosa en SQL que permiten realizar consultas complejas y obtener resultados específicos. En este tema, hemos aprendido cómo usar subconsultas en las cláusulas SELECT, FROM y WHERE. Practicar con estos ejemplos y ejercicios te ayudará a dominar el uso de subconsultas en tus propias consultas SQL.

Curso de SQL

Módulo 1: Introducción a SQL

Módulo 2: Consultas básicas de SQL

Módulo 3: Trabajando con múltiples tablas

Módulo 4: Filtrado avanzado de datos

Módulo 5: Manipulación de datos

Módulo 6: Funciones avanzadas de SQL

Módulo 7: Subconsultas y consultas anidadas

Módulo 8: Índices y optimización de rendimiento

Módulo 9: Transacciones y concurrencia

Módulo 10: Temas avanzados

Módulo 11: SQL en la práctica

Módulo 12: Proyecto final

© Copyright 2026. Todos los derechos reservados