Subconsultas correlacionadas y no correlacionadas
Comprenda las subconsultas correlacionadas que hacen referencia a la fila externa, sus características de rendimiento y cuándo EXISTS supera a IN.
Subconsultas correlacionadas y no correlacionadas es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
Subconsultas no correlacionadas
Una subconsulta no correlacionada no hace referencia a la fila externa. Se ejecuta una vez y se reutiliza su resultado:
SELECT * FROM users
WHERE id IN (
SELECT user_id FROM orders WHERE status = 'paid'
);Subconsultas correlacionadas
Una subconsulta correlacionada hace referencia a la fila externa; lógicamente se vuelve a ejecutar para cada fila externa:
SELECT u.id, u.email
FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.user_id = u.id
AND o.total > 1000
);Cómo distinguirlas
Si el SELECT interno hace referencia a una columna del FROM externo, está correlacionado.
Implicaciones de rendimiento
Una subconsulta correlacionada ingenua tiene un coste O(externa × interna). Los planificadores modernos suelen reescribirla como una semiunión o una unión hash, pero aun así debe escribir la forma más sencilla cuando sea posible.
EXISTS frente a IN
Para «al menos una coincidencia»:
-- IN with non-correlated subquery (often the planner's favourite):
SELECT u.* FROM users u
WHERE u.id IN (SELECT user_id FROM orders);
-- EXISTS with correlated subquery (NULL-safe alternative):
SELECT u.* FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);NOT EXISTS siempre es mejor que NOT IN
NOT IN falla cuando el conjunto interno contiene NULL. NOT EXISTS no. Prefiera siempre NOT EXISTS para la antiunión:
-- BUG-prone:
SELECT u.* FROM users u
WHERE u.id NOT IN (SELECT excluded_id FROM blocklist);
-- Safe:
SELECT u.* FROM users u
WHERE NOT EXISTS (SELECT 1 FROM blocklist b WHERE b.excluded_id = u.id);Subconsultas correlacionadas en SELECT
El patrón de «búsqueda por fila»:
SELECT u.id, u.email,
(SELECT MAX(created_at) FROM orders o WHERE o.user_id = u.id) AS last_order_at
FROM users u;
-- Often readable, but consider a LEFT JOIN + GROUP BY.Subconsultas correlacionadas en UPDATE
Obtenga un valor derivado para cada fila:
UPDATE products p
SET review_count = (
SELECT COUNT(*) FROM reviews r WHERE r.product_id = p.id
);LATERAL JOIN: un patrón correlacionado más claro
Para «buscar algunas filas por cada fila externa», LATERAL suele ser más claro y rápido; se explica en Patrones avanzados de JOIN.
Almacenamiento en caché de subconsultas
PostgreSQL no almacena en caché los resultados de las subconsultas entre filas de forma predeterminada. Si necesita el mismo resultado interno muchas veces, use una CTE.
Indexe la columna de correlación
La subconsulta interna filtra por la clave de la fila externa. Sin un índice en esa clave, se realiza una exploración completa por cada fila externa.
-- For the orders example, this is essential:
CREATE INDEX orders_user_id_idx ON orders(user_id);Resumen
Las subconsultas correlacionadas hacen referencia a la fila externa.
- EXISTS es la forma correlacionada clásica
- Prefiera NOT EXISTS frente a NOT IN
- Indexe la columna de correlación
- LATERAL es una alternativa más clara en muchos casos
Comprobación rápida
¿Por qué NOT EXISTS es más seguro que NOT IN cuando el conjunto interno puede contener NULL?
Preguntas frecuentes
¿La lección «Subconsultas correlacionadas y no correlacionadas» es gratis?
Sí — el texto completo de «Subconsultas correlacionadas y no correlacionadas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Subconsultas correlacionadas y no correlacionadas»?
Comprenda las subconsultas correlacionadas que hacen referencia a la fila externa, sus características de rendimiento y cuándo EXISTS supera a IN. Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Academy?
No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Subconsultas correlacionadas y no correlacionadas»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Academy?
Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Subconsultas escalares, de fila y de tabla
- Subconsultas correlacionadas y no correlacionadas
- Expresiones de tabla comunes (WITH)
- CTE recursivas para jerarquías