El síntoma: el nombre existe en SELECT, pero WHERE no lo reconoce
PostgreSQL documenta que el nombre de una columna de salida puede usarse en ORDER BY y GROUP BY, pero no en WHERE ni HAVING. MySQL también explica que el estándar no permite referenciar un alias de columna en WHERE, porque el filtro se evalúa antes de que ese valor de salida esté determinado.
Por eso una consulta puede mostrar correctamente un alias y aun así fallar cuando intentas filtrarlo en la misma capa.
Ejemplo: calcular el total y filtrarlo con su alias
SELECT id,
precio * cantidad AS total
FROM detalle_pedido
WHERE total > 100;El alias total pertenece a la lista de salida. En PostgreSQL y MySQL, WHERE necesita trabajar con las columnas y expresiones disponibles antes de producir esa lista.
Corrección 1: repite la expresión cuando es sencilla
SELECT id,
precio * cantidad AS total
FROM detalle_pedido
WHERE precio * cantidad > 100;Para una expresión corta, esta forma es clara y portable. El alias sigue siendo útil para nombrar la columna resultante.
Corrección 2: crea una capa cuando la expresión es compleja
Si repetir la expresión dificulta la lectura, calcula primero el alias en una subconsulta o CTE. En la consulta exterior, total ya es una columna de la tabla virtual producida por la consulta interior:
SELECT id, total
FROM (
SELECT id,
precio * cantidad AS total
FROM detalle_pedido
) AS calculos
WHERE total > 100;Portabilidad: no dependas de comportamientos permisivos
Si algún motor o herramienta acepta una variante más permisiva, no la tomes como contrato portable. PostgreSQL y MySQL documentan que un alias de salida no se utiliza directamente en WHERE; para una consulta transferible entre motores, usa la expresión original o una capa intermedia.
Método de diagnóstico
- Localiza dónde se define el alias: normalmente en SELECT.
- Mira dónde lo reutilizas: WHERE, HAVING, ORDER BY u otra cláusula.
- Si está en WHERE, sustituye el alias por la expresión o crea una subconsulta/CTE.
- No confundas alias de tabla con alias de columna: un alias de tabla definido en FROM sí forma parte del espacio de nombres de la consulta.
- Prueba la versión portable si trabajas con varios motores.
Error frecuente: pensar que el orden escrito es el orden lógico
SELECT aparece antes en el texto, pero no decide primero las filas
La consulta se escribe empezando por SELECT, pero WHERE filtra las filas antes de formar la salida final. Ese desfase explica muchos problemas de aliases y también ayuda a entender por qué las funciones de ventana no se filtran directamente en WHERE.
Práctica correctiva
Filtra un precio con descuento
Corrige una consulta que define precio_final como precio * 0.9 y quiere devolver solo valores superiores a 50.
precio * 0.9.Solución razonada
SELECT nombre,
precio * 0.9 AS precio_final
FROM productos
WHERE precio * 0.9 > 50;El filtro trabaja con la expresión disponible en esa etapa y el alias se reserva para nombrar el resultado.
Qué debes recordar
- Un alias de SELECT no es una variable creada al principio de la consulta.
- En SQL portable, no uses un alias de salida directamente en WHERE.
- Repite expresiones sencillas o crea una subconsulta/CTE para expresiones complejas.
- ORDER BY sí suele poder referirse al alias de salida.
Conceptos relacionados
Fuentes técnicas
La sintaxis y las diferencias de motor de esta guía se contrastaron con documentación primaria: