CTE VS SUBCONSULTAS EN MYSQL: ESCRIBIR CONSULTAS LEGIBLES
Subconsultas Anidadas
SELECT *
FROM (
SELECT *
FROM (
SELECT id
FROM tabla1
WHERE ...
) AS sub1
WHERE ...
) AS sub2
WHERE ...
Problemas
- Consultas difíciles de leer y entender
- Depuración compleja
- Código tipo “espagueti”
- Mantenimiento infernal
CTE (WITH Clause)
MySQL soporta Common Table Expressions, o CTE, desde la versión 8.0 y es una de las mejores mejoras para escribir consultas legibles:
WITH CTE_Paso1 AS (
SELECT id
FROM tabla1
WHERE condicion = 'algo'
),
CTE_Paso2 AS (
SELECT *
FROM tabla2
WHERE id IN (SELECT id FROM CTE_Paso1)
)
SELECT *
FROM CTE_Paso2
WHERE ...
Ventajas de usar CTE en MySQL
- Legible: Se lee de arriba hacia abajo
- Modular: Se divide la lógica en pasos claros
- Reutilizable: Se puede referenciar la misma CTE varias veces
- Fácil de depurar: Se puede hacer "SELECT *" de cada CTE por separado
- Mejor mantenimiento: Ideal para consultas complejas como reportes, analíticas, etc.
Siempre que se tenga más de dos niveles de subconsultas, considerar refactorizarla con CTE
WITH CTE_Paso1 AS (
SELECT id
FROM tabla1
WHERE condicion = 'algo'
),
CTE_Paso2 AS (
SELECT *
FROM tabla2
WHERE id IN (SELECT id FROM CTE_Paso1)
)
SELECT *
FROM CTE_Paso2
WHERE ...