Alias
Un alias es un nombre temporal que le asignas a una columna o a una tabla dentro de una consulta. No modifica nada en la base de datos: solo cambia como se muestra el resultado o como te refieres a una tabla dentro de esa consulta especifica. Los alias hacen las consultas mas legibles y los resultados mas comprensibles, y son una herramienta que usaras constantemente en cualquier proyecto con MySQL.
Piensa en los alias como etiquetas que pegas sobre los nombres reales de columnas y tablas mientras dura la consulta. Cuando la consulta termina, esas etiquetas desaparecen. La tabla sigue llamandose productos y la columna sigue llamandose nombre, pero en el resultado de esa consulta concreta pudiste mostrarlos como "Articulo" o "p". Esta flexibilidad es fundamental cuando trabajas con expresiones calculadas, funciones de agregacion o consultas que involucran varias tablas con columnas del mismo nombre.
Alias de columnas
Los alias de columnas permiten cambiar el nombre que aparece en el encabezado del resultado. Son especialmente utiles cuando las columnas originales tienen nombres tecnicos poco descriptivos o cuando el resultado incluye expresiones calculadas que, sin un alias, mostrarian la formula completa como nombre de columna.
Sintaxis con AS
La forma mas explicita y recomendada de crear un alias de columna es con la palabra clave AS. Esta sintaxis deja clara la intencion: estas asignando un nombre alternativo a una columna del resultado:
SELECT
nombre AS producto,
precio AS precio_euros
FROM productos
LIMIT 5;| producto | precio_euros |
|---|---|
| iPhone 15 Pro | 1299.99 |
| Samsung Galaxy S24 | 899.99 |
| Google Pixel 8 | 699.00 |
| Xiaomi 14 | 599.99 |
| MacBook Air M3 | 1399.00 |
Las columnas en el resultado muestran los nombres producto y precio_euros en lugar de nombre y precio. Los datos son exactamente los mismos, solo cambia el encabezado. Esto es util en muchos contextos: cuando generas informes donde los encabezados deben ser comprensibles para usuarios no tecnicos, cuando la columna de la base de datos tiene un nombre abreviado o en ingles y necesitas mostrarlo en español, o cuando varias tablas tienen columnas con el mismo nombre y necesitas distinguirlas en el resultado.
Sintaxis sin AS
MySQL permite omitir la palabra AS. El alias se coloca directamente despues del nombre de la columna, separado por un espacio:
SELECT
nombre producto,
precio precio_euros
FROM productos
LIMIT 5;El resultado es identico al anterior. Sin embargo, la version con AS es mas clara y menos propensa a confusiones, especialmente cuando la consulta es larga o tiene muchas columnas. Considera esta consulta sin AS: a primera vista, no queda inmediatamente claro donde termina el nombre de la columna y donde empieza el alias. Con AS, esa ambiguedad desaparece por completo. A lo largo de este tutorial usaremos siempre AS por claridad, y es la practica que recomendamos para cualquier proyecto profesional.
Alias con espacios y caracteres especiales
Si necesitas que el alias contenga espacios o caracteres especiales, enciérralo entre comillas dobles o backticks. Esto es comun cuando generas resultados que se exportan directamente a hojas de calculo o informes PDF donde los encabezados deben ser frases descriptivas:
SELECT
nombre AS `Nombre del producto`,
precio AS `Precio (EUR)`,
stock AS `Unidades disponibles`
FROM productos
LIMIT 3;| Nombre del producto | Precio (EUR) | Unidades disponibles |
|---|---|---|
| iPhone 15 Pro | 1299.99 | 45 |
| Samsung Galaxy S24 | 899.99 | 62 |
| Google Pixel 8 | 699.00 | 38 |
Esto puede ser util cuando generas informes o exportas datos donde los encabezados deben ser descriptivos. En el dia a dia y en codigo de aplicacion, es preferible usar alias simples sin espacios. Los alias con espacios pueden causar problemas si intentas referenciarlos en otras partes de la consulta, ya que necesitas envolverlos siempre en backticks. Ademas, la mayoria de los frameworks y ORMs esperan nombres de columna sin espacios para mapearlos a propiedades de objetos.
Alias de expresiones
Los alias son especialmente utiles con expresiones calculadas. Cuando usas operadores aritmeticos, funciones o concatenaciones en el SELECT, MySQL usa la propia expresion como nombre de columna si no proporcionas un alias. El resultado es un encabezado poco legible que muestra la formula en bruto:
SELECT
nombre,
precio * stock
FROM productos
LIMIT 3;| nombre | precio * stock |
|---|---|
| iPhone 15 Pro | 58499.55 |
| Samsung Galaxy S24 | 55799.38 |
| Google Pixel 8 | 26562.00 |
El encabezado precio * stock es la expresion literal. Imagina este resultado en un informe que le entregas a tu jefe o a un cliente: no es nada profesional. Con un alias queda mucho mejor y el significado del calculo queda documentado directamente en el resultado:
SELECT
nombre,
precio * stock AS valor_inventario
FROM productos
LIMIT 3;| nombre | valor_inventario |
|---|---|
| iPhone 15 Pro | 58499.55 |
| Samsung Galaxy S24 | 55799.38 |
| Google Pixel 8 | 26562.00 |
Alias con funciones
Lo mismo aplica cuando usas funciones de MySQL. Sin un alias, el encabezado muestra la llamada completa a la funcion, que puede ser bastante largo y dificil de leer:
SELECT
CONCAT(nombre, ' ', apellidos) AS nombre_completo,
UPPER(ciudad) AS ciudad_mayusculas
FROM clientes
LIMIT 5;| nombre_completo | ciudad_mayusculas |
|---|---|
| Maria Garcia Lopez | MADRID |
| Carlos Rodriguez Martin | BARCELONA |
| Ana Martinez Ruiz | SEVILLA |
| Pedro Fernandez Castro | MADRID |
| Laura Lopez Sanchez | BARCELONA |
Sin los alias, los encabezados serian CONCAT(nombre, ' ', apellidos) y UPPER(ciudad), que son mucho menos legibles. Este patron es especialmente importante con funciones de agregacion como COUNT(), SUM(), AVG(), MIN() y MAX(), que se usan constantemente con GROUP BY:
SELECT
categoria_id,
COUNT(*) AS total_productos,
ROUND(AVG(precio), 2) AS precio_medio,
MAX(precio) AS precio_maximo
FROM productos
GROUP BY categoria_id
ORDER BY total_productos DESC
LIMIT 5;| categoria_id | total_productos | precio_medio | precio_maximo |
|---|---|---|---|
| 1 | 4 | 849.74 | 1299.99 |
| 3 | 4 | 837.37 | 1399.00 |
| 5 | 3 | 33.33 | 49.99 |
| 6 | 3 | 59.99 | 79.99 |
| 7 | 3 | 3599.66 | 6499.00 |
Sin alias, los encabezados serian COUNT(*), ROUND(AVG(precio), 2) y MAX(precio). Con alias descriptivos, el resultado se convierte en una tabla que cualquier persona puede entender sin conocer SQL.
Alias en calculos complejos
Cuando las expresiones son mas complejas, los alias se vuelven absolutamente imprescindibles. Considera una consulta que calcula el precio con IVA, el margen de beneficio y el valor del inventario, todo en una sola sentencia:
SELECT
nombre,
precio AS precio_base,
ROUND(precio * 1.21, 2) AS precio_con_iva,
ROUND(precio * 0.3, 2) AS margen_estimado,
precio * stock AS valor_stock
FROM productos
WHERE stock > 20
ORDER BY valor_stock DESC
LIMIT 5;Sin los alias, los encabezados de esas columnas serian ilegibles. Con alias claros, cada columna se explica a si misma y el resultado es un informe util sin necesidad de documentacion adicional.
Donde se pueden usar los alias de columna
Los alias de columna definidos en el SELECT tienen un alcance limitado. No puedes usarlos en todas las clausulas de la consulta. Esto se debe al orden en que MySQL procesa internamente las clausulas, que es diferente al orden en que las escribes.
Cuando escribes una consulta, la escribes en este orden: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY. Pero MySQL la procesa internamente en un orden distinto: primero FROM (de que tablas leer), luego WHERE (que filas filtrar), luego GROUP BY (como agrupar), luego HAVING (que grupos filtrar), luego SELECT (que columnas calcular y mostrar), y finalmente ORDER BY (como ordenar el resultado). Este orden de procesamiento explica por que los alias funcionan en unas clausulas pero no en otras.
Alias en ORDER BY
Puedes usar alias en el ORDER BY, porque esta clausula se procesa despues del SELECT:
SELECT nombre, precio * stock AS valor_inventario
FROM productos
ORDER BY valor_inventario DESC
LIMIT 5;Esto funciona perfectamente porque cuando MySQL llega al ORDER BY, ya ha procesado el SELECT y conoce el alias valor_inventario. Es una forma comoda de ordenar por una expresion calculada sin tener que repetirla.
Alias en HAVING
El HAVING tambien acepta alias, porque se procesa despues del SELECT en el flujo interno de MySQL:
SELECT categoria_id, AVG(precio) AS precio_medio
FROM productos
GROUP BY categoria_id
HAVING precio_medio > 100;Esta consulta agrupa los productos por categoria, calcula el precio medio de cada una y filtra para quedarse solo con las categorias cuyo precio medio supera los 100. El alias precio_medio funciona aqui porque HAVING tiene acceso a las expresiones definidas en el SELECT.
Alias que NO funcionan en WHERE
No puedes usar alias de columna en el WHERE, porque esta clausula se procesa antes del SELECT. MySQL todavia no ha evaluado las expresiones del SELECT cuando ejecuta el filtrado, asi que no conoce el alias:
-- Esto da ERROR
SELECT nombre, precio * 1.21 AS precio_con_iva
FROM productos
WHERE precio_con_iva > 1000;ERROR 1054 (42S22): Unknown column 'precio_con_iva' in 'where clause'
La solucion es repetir la expresion completa en el WHERE en lugar de usar el alias:
SELECT nombre, precio * 1.21 AS precio_con_iva
FROM productos
WHERE precio * 1.21 > 1000;Esto puede parecer redundante, y de hecho lo es. Pero MySQL optimiza internamente la consulta para no calcular la expresion dos veces, asi que no hay penalizacion de rendimiento. Si la expresion es muy larga o compleja y no quieres repetirla, puedes usar una subconsulta o una CTE para definir la expresion una sola vez y referenciarla por su alias en una consulta exterior.
Alias de tablas
Los alias de tablas asignan un nombre corto a una tabla dentro de la consulta. En las consultas con una sola tabla son opcionales, pero cuando trabajas con varias tablas y necesitas especificar de que tabla proviene cada columna, se vuelven practicamente imprescindibles:
SELECT
p.nombre,
p.precio,
c.nombre AS categoria
FROM productos p
JOIN categorias c ON p.categoria_id = c.id
LIMIT 5;| nombre | precio | categoria |
|---|---|---|
| iPhone 15 Pro | 1299.99 | Smartphones |
| Samsung Galaxy S24 | 899.99 | Smartphones |
| Google Pixel 8 | 699.00 | Smartphones |
| Xiaomi 14 | 599.99 | Smartphones |
| MacBook Air M3 | 1399.00 | Portatiles |
Aqui p es el alias de la tabla productos y c el de categorias. En lugar de escribir productos.nombre y categorias.nombre, escribimos p.nombre y c.nombre. Esto es mas conciso, comodo de escribir y mas facil de leer, sobre todo en consultas largas con multiples JOINs.
Observa que en esta consulta, ambas tablas tienen una columna llamada nombre. Sin los alias de tabla, MySQL daria un error de columna ambigua porque no sabria si nombre se refiere a productos.nombre o a categorias.nombre. Los alias de tabla resuelven esta ambiguedad de forma elegante.
Alias obligatorios: Self Join
Los alias de tablas son obligatorios cuando haces un self join (una tabla consigo misma). Como la misma tabla aparece dos veces en la consulta, necesitas alias distintos para diferenciar las dos "copias":
SELECT
e.nombre AS empleado,
e.puesto,
s.nombre AS supervisor
FROM empleados e
LEFT JOIN empleados s ON e.supervisor_id = s.id;| empleado | puesto | supervisor |
|---|---|---|
| Ricardo | Director General | NULL |
| Sofia | Directora de Ventas | Ricardo |
| Alberto | Director de Logistica | Ricardo |
| Natalia | Vendedora Senior | Sofia |
| Daniel | Vendedor | Sofia |
| Patricia | Vendedora | Sofia |
| Raul | Vendedor Junior | Natalia |
| Cristina | Responsable de Almacen | Alberto |
| Marcos | Operario de Almacen | Cristina |
| Ines | Operaria de Almacen | Cristina |
La tabla empleados aparece dos veces en la consulta: como e (el empleado) y como s (su supervisor). Sin alias, MySQL no podria distinguir entre las dos referencias a la misma tabla. El LEFT JOIN se usa aqui en lugar de INNER JOIN para que el Director General (que no tiene supervisor) tambien aparezca en el resultado con NULL en la columna de supervisor.
Alias obligatorios: subconsultas en FROM
Otro caso donde los alias de tabla son obligatorios es cuando usas una subconsulta en la clausula FROM. MySQL requiere que toda tabla derivada tenga un alias, incluso si no lo vas a referenciar explicitamente:
SELECT resumen.categoria, resumen.total_productos
FROM (
SELECT
c.nombre AS categoria,
COUNT(*) AS total_productos
FROM productos p
JOIN categorias c ON p.categoria_id = c.id
GROUP BY c.nombre
) AS resumen
WHERE resumen.total_productos > 2
ORDER BY resumen.total_productos DESC;La subconsulta en el FROM calcula un resumen por categoria y le asigna el alias resumen. La consulta exterior puede entonces filtrar y ordenar los resultados de esa tabla derivada usando el alias. Si omites el AS resumen, MySQL devolvera el error Every derived table must have its own alias.
Alias de tablas en consultas simples
Incluso en consultas con una sola tabla, los alias de tabla pueden hacer el codigo mas limpio, sobre todo si el nombre de la tabla es largo:
SELECT
ep.producto_id,
ep.etiqueta
FROM etiquetas_producto ep
WHERE ep.etiqueta = 'premium';| producto_id | etiqueta |
|---|---|
| 1 | premium |
| 5 | premium |
| 7 | premium |
| 15 | premium |
Usar ep en lugar de etiquetas_producto hace la consulta mas compacta y mas rapida de escribir. En consultas simples con una sola tabla el prefijo de tabla es opcional (podrias escribir solo producto_id en vez de ep.producto_id), pero incluirlo es una buena practica porque hace el codigo mas consistente y facilita la transicion cuando la consulta crece y necesitas anadir mas tablas.
Convenciones y buenas practicas
Elegir buenos nombres de alias es tan importante como elegir buenos nombres de variables en un lenguaje de programacion. Un alias confuso puede hacer que una consulta sea mas dificil de entender que sin alias.
Para tablas, la convencion mas extendida es usar la primera letra o las iniciales: p para productos, c para categorias, dp para detalle_pedidos, ep para etiquetas_producto. Si dos tablas empiezan por la misma letra, usa dos letras para distinguirlas: pr para productos y pe para pedidos. Lo importante es ser consistente dentro de la misma consulta y, preferiblemente, dentro de todo el proyecto.
Para columnas, usa nombres descriptivos en snake_case que expliquen claramente que contiene la columna: valor_inventario, nombre_completo, precio_con_iva, total_pedidos. El alias debe aclarar que contiene la columna, no oscurecerlo. Evita alias demasiado genericos como x, temp o dato, y evita alias que contradigan el contenido real.
Una buena practica adicional es usar alias de columna siempre que el resultado incluya expresiones calculadas, funciones de agregacion o columnas de multiples tablas que compartan nombre. En estos casos, el alias no es solo estetico sino que mejora la mantenibilidad del codigo. Si dentro de seis meses otro desarrollador (o tu mismo) necesita modificar la consulta, los alias descriptivos haran que el proposito de cada columna sea inmediatamente comprensible.
Errores comunes con alias
Existen varios errores recurrentes que los principiantes cometen al trabajar con alias en MySQL. Conocerlos te ayudara a evitarlos.
El error mas frecuente es intentar usar un alias de columna en la clausula WHERE, como vimos antes. La solucion siempre es repetir la expresion original en lugar del alias, o reestructurar la consulta usando una subconsulta o CTE.
Otro error comun es confundir el alias de una tabla con el nombre real de la tabla. Una vez que defines un alias para una tabla (por ejemplo, FROM productos p), debes usar el alias p en toda la consulta. No puedes mezclar p.nombre y productos.nombre en la misma sentencia cuando has definido un alias, porque MySQL trata el alias como el unico identificador valido para esa tabla dentro de la consulta.
Tambien es frecuente olvidar que los alias de tabla son obligatorios en las subconsultas del FROM. Si escribes SELECT * FROM (SELECT ...) WHERE ... sin dar un alias a la subconsulta, MySQL rechazara la consulta con un error de sintaxis.
Practica con Alias
Usa el editor para experimentar con alias de columnas y tablas:
En el siguiente articulo veremos como usar comentarios en SQL para documentar tus consultas y hacer el codigo mas mantenible.
Escrito por Eduardo Lázaro
