Las consultas reales a menudo combinan varias tablas y pasos. La forma de estructurarlas decide si un compañero, o tú dentro de seis meses, podrá seguir la lógica.
Joins
Un join combina filas de dos tablas según una condición.
- INNER JOIN: solo las filas que coinciden en ambas tablas.
- LEFT JOIN: todas las filas de la tabla izquierda, con nulos donde no hay coincidencia a la derecha.
- FULL JOIN: filas de ambos lados donde esté soportado.
Escribe la condición del join en la misma línea que el JOIN. Una condición ON ausente o incorrecta produce un resultado enorme e inesperado, así que un diseño claro hace visible ese error.
Subconsultas
Una subconsulta es una consulta dentro de otra. Puede aparecer en WHERE (por ejemplo id IN (SELECT ...)), en FROM como tabla derivada o en la lista de selección. Son compactas, pero el anidamiento profundo se vuelve difícil de leer.
Expresiones de tabla comunes
Una CTE da nombre a un resultado intermedio con WITH y te permite construir la consulta final por pasos:
WITH recent_orders AS (
SELECT user_id, COUNT(*) AS n
FROM orders
WHERE created_at >= '2026-01-01'
GROUP BY user_id
)
SELECT u.name, r.n
FROM users u
JOIN recent_orders r ON r.user_id = u.id;
Cada CTE se puede probar por separado, y la consulta final queda corta.
Cómo el formato revela problemas
- Los paréntesis desalineados muestran una subconsulta sin cerrar.
- Una cláusula WHERE con AND y OR mezclados en la misma línea oculta errores de precedencia. Pon cada condición en su propia línea y agrupa con paréntesis.
- Una lista de selección muy larga sugiere que la consulta podría dividirse.
Comprueba antes de ejecutar
Formatea la consulta, léela de arriba abajo y pregúntate qué devuelve cada bloque. En una base de datos de producción, prueba con un LIMIT o en una copia primero, y ten cuidado con las sentencias UPDATE y DELETE sin cláusula WHERE.
Preguntas frecuentes
¿Las CTE son más lentas que las subconsultas? Depende de la base de datos. Muchas las optimizan por igual.
¿Cuándo elijo un join en lugar de una subconsulta? Usa un join cuando necesites columnas de ambas tablas, y una subconsulta para una simple prueba de existencia o pertenencia.

