Skip to content

Clase 18 – Subconsultas

En SQL, las subconsultas son una herramienta poderosa que te permite realizar consultas dentro de consultas.

En esta clase, nos sumergiremos en el intrigante universo de las subconsultas, explorando su sintaxis, casos de uso y cómo pueden elevar tus habilidades de consulta a un nuevo nivel.

Comprendiendo la Sintaxis Básica de las Subconsultas

Una subconsulta, también conocida como consulta interna, es una consulta SQL que se incorpora dentro de otra consulta principal. Su sintaxis básica se ve así:

SELECT columna1, columna2, ...
FROM tabla1
WHERE condicion_columna operator (SELECT columna FROM tabla WHERE condicion);

Donde:

  • columna1, columna2, … son las columnas que deseas seleccionar en la consulta principal.
  • tabla1 es la tabla principal de la consulta.
  • condicion_columna operator es la condición que compara con el resultado de la subconsulta.
  • columna, tabla, condicion son los elementos de la subconsulta.

Ejemplo Básico de Subconsulta

Supongamos que tenemos dos tablas, empleados y departamentos, y queremos obtener los empleados que trabajan en el departamento de Ventas:

SELECT nombre
FROM empleados
WHERE id_departamento = (SELECT id_departamento FROM departamentos WHERE nombre = 'Ventas');

En este ejemplo, la subconsulta se encarga de recuperar el id_departamento para el departamento de Ventas, y la consulta principal utiliza este resultado para seleccionar los empleados correspondientes.

Tipos de Subconsultas

Subconsulta Escalar

Una subconsulta escalar devuelve un solo valor y se utiliza generalmente en una condición de comparación.

Por ejemplo, determinar si un empleado tiene un salario superior al promedio:

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

Subconsulta de Tabla

Una subconsulta de tabla devuelve un conjunto de filas y se utiliza en una condición de filtrado o en la cláusula FROM.

Por ejemplo, seleccionar empleados cuyos salarios superan los salarios promedio de sus respectivos departamentos:

SELECT nombre
FROM empleados
WHERE salario > (SELECT AVG(salario) FROM empleados e2 WHERE e2.id_departamento = empleados.id_departamento);

Subconsulta Correlativa

Una subconsulta correlativa utiliza columnas de la consulta externa en la subconsulta.

Por ejemplo, seleccionar empleados cuyos salarios superan el salario promedio de su departamento, pero esta vez utilizando una subconsulta correlativa:

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

Utilizando Subconsultas con Operadores

Las subconsultas se pueden combinar con varios operadores para lograr resultados específicos.

Operador IN

El operador IN se utiliza para verificar si un valor se encuentra dentro de un conjunto de valores devueltos por una subconsulta.

Por ejemplo, seleccionar empleados que trabajan en los departamentos de Ventas o Marketing:

SELECT nombre
FROM empleados
WHERE id_departamento IN (SELECT id_departamento FROM departamentos WHERE nombre IN ('Ventas', 'Marketing'));

Operador EXISTS

El operador EXISTS verifica si la subconsulta devuelve algún resultado.

Por ejemplo, seleccionar empleados que tienen al menos una venta registrada:

SELECT nombre
FROM empleados e
WHERE EXISTS (SELECT 1 FROM ventas v WHERE v.id_empleado = e.id_empleado);

Operador ALL

El operador ALL se utiliza para comparar un valor con todos los valores devueltos por una subconsulta.

Por ejemplo, seleccionar empleados cuyos salarios son mayores que todos los salarios de los empleados en el departamento de Ventas:

SELECT nombre
FROM empleados e
WHERE salario > ALL (SELECT salario FROM empleados WHERE id_departamento = (SELECT id_departamento FROM departamentos WHERE nombre = 'Ventas'));

Operador ANY o SOME

El operador ANY o SOME se utiliza para comparar un valor con algunos de los valores devueltos por una subconsulta.

Por ejemplo, seleccionar empleados cuyos salarios son mayores que al menos uno de los salarios de los empleados en el departamento de Ventas:

SELECT nombre
FROM empleados e
WHERE salario > ANY (SELECT salario FROM empleados WHERE id_departamento = (SELECT id_departamento FROM departamentos WHERE nombre = 'Ventas'));

Subconsultas y Joins

Las subconsultas también se pueden utilizar en combinación con JOIN para realizar consultas más complejas.

Supongamos que queremos obtener el nombre de los empleados y el nombre de su departamento:

SELECT e.nombre AS empleado, d.nombre AS departamento
FROM empleados e
JOIN departamentos d ON e.id_departamento = d.id_departamento
WHERE e.id_departamento = (SELECT id_departamento FROM departamentos WHERE nombre = 'Ventas');

Esta consulta utiliza una subconsulta para obtener el id_departamento del departamento de Ventas y luego realiza un JOIN para obtener el nombre de los empleados y sus departamentos.

Subconsultas Anidadas

Las subconsultas se pueden anidar, lo que significa que puedes tener una subconsulta dentro de otra.

Supongamos que queremos obtener el nombre de los empleados que tienen salarios superiores al promedio de sus departamentos y que trabajan en el departamento de Ventas:

SELECT nombre
FROM empleados
WHERE salario > (SELECT AVG(salario) FROM empleados WHERE id_departamento = (SELECT id_departamento FROM departamentos WHERE nombre = 'Ventas'));

En este ejemplo, la subconsulta más interna obtiene el id_departamento del departamento de Ventas, luego la siguiente subconsulta calcula el salario promedio en ese departamento, y finalmente, la consulta principal selecciona empleados con salarios superiores a ese promedio.

Subconsultas y Control de Transacciones

Las subconsultas también se pueden utilizar en operaciones de modificación dentro de transacciones.

Supongamos que queremos aumentar el salario de todos los empleados en un 10%, pero solo para aquellos que trabajan en el departamento de Ventas:

BEGIN; -- Iniciar una transacción

UPDATE empleados
SET salario = salario * 1.1
WHERE id_departamento = (SELECT id_departamento FROM departamentos WHERE nombre = 'Ventas');

-- Confirmar la transacción
COMMIT;

Esta actualización utiliza una subconsulta para limitar la operación a los empleados del departamento de Ventas.

Consideraciones de Desempeño

Al utilizar subconsultas, es importante considerar el rendimiento de las consultas, especialmente cuando se trata de conjuntos de datos grandes. Indexar las columnas utilizadas en las subconsultas puede mejorar significativamente el rendimiento.

Por ejemplo:

CREATE INDEX idx_id_departamento ON empleados (id_departamento);

Este comando crea un índice en la columna id_departamento de la tabla empleados, mejorando las consultas que utilizan subconsultas con esta condición.


Las subconsultas en SQL ofrecen una potente capacidad para realizar consultas complejas y avanzadas.

Ya sea para realizar comparaciones, filtrar resultados, o combinar con operadores y JOIN, las subconsultas son una herramienta versátil en tu caja de herramientas de SQL.

Con su capacidad para anidarse y utilizarse en diversas situaciones, te permiten realizar análisis de datos detallados y tomar decisiones informadas en tus bases de datos relacionales.