Inicio > Cursos > SQL y Bases de Datos > Subconsultas
SQL y Bases de DatosConsultas AvanzadasLección 8 de 20

Subconsultas

Una subconsulta es un SELECT dentro de otro SELECT. Permiten resolver problemas complejos en pasos. Pueden usarse en WHERE (con IN, EXISTS), en FROM (tabla derivada), o en SELECT (columna calculada). Las subconsultas correlacionadas referencian la consulta externa.

-- Subconsulta en WHERE con IN
-- Productos que alguna vez se han vendido
SELECT nombre, precio
FROM products
WHERE id IN (
  SELECT DISTINCT product_id
  FROM order_items
);

-- Subconsulta en WHERE con NOT IN
-- Productos que NUNCA se han vendido
SELECT nombre, precio
FROM products
WHERE id NOT IN (
  SELECT product_id FROM order_items
  WHERE product_id IS NOT NULL  -- necesario con NOT IN y NULLs
);

-- Subconsulta en WHERE con comparación
-- Empleados que ganan más que el promedio
SELECT nombre, salario
FROM empleados
WHERE salario > (
  SELECT AVG(salario) FROM empleados
)
ORDER BY salario DESC;

-- Subconsulta correlacionada (referencia a tabla externa)
-- Para cada usuario, su pedido más reciente
SELECT
  u.nombre,
  (SELECT MAX(o.fecha)
   FROM orders o
   WHERE o.user_id = u.id) AS ultimo_pedido
FROM users u;

-- EXISTS / NOT EXISTS (más eficiente que IN para grandes tablas)
-- Usuarios que tienen al menos un pedido
SELECT nombre, email
FROM users u
WHERE EXISTS (
  SELECT 1 FROM orders o WHERE o.user_id = u.id
);

-- Subconsulta en FROM (tabla derivada / derived table)
-- Top 3 categorías por ingresos con su porcentaje del total
SELECT
  categoria,
  ingresos,
  ROUND(ingresos * 100.0 / SUM(ingresos) OVER (), 2) AS porcentaje
FROM (
  SELECT p.categoria, SUM(oi.precio * oi.cantidad) AS ingresos
  FROM order_items oi
  JOIN products p ON p.id = oi.product_id
  GROUP BY p.categoria
) AS ventas_por_categoria
ORDER BY ingresos DESC
LIMIT 3;
ConsejoPrefiere EXISTS sobre IN cuando la subconsulta puede devolver NULLs o miles de filas. EXISTS se detiene al encontrar el primer resultado, IN evalúa toda la lista. Con NOT IN y NULLs en la lista, NINGUNA fila pasará el filtro.
← GROUP BY y Funciones AgregadasCTEs con WITH →

Practica esta lección

Resuelve los ejercicios del curso de SQL y Bases de Datos en la app, gratis y con corrección automática.

Empezar a practicar