UPPER
La función UPPER convierte todos los caracteres alfabéticos de una cadena a mayúsculas, sin alterar números, espacios ni signos. La función UCASE es su alias y se comporta de forma idéntica. Es la contrapartida de LOWER y comparte con ella las mismas consideraciones de colación y rendimiento.
Más allá de poner texto en mayúsculas para mostrarlo, UPPER se usa mucho como pieza de construcción para generar códigos, abreviaturas y etiquetas a partir de nombres existentes. En este artículo veremos su sintaxis, varios usos prácticos combinándola con otras funciones de cadena, y el mismo aviso de rendimiento que aplica a LOWER cuando se usa dentro de un WHERE.
Sintaxis
UPPER recibe una cadena y devuelve su versión en mayúsculas. UCASE es su alias directo.
UPPER(cadena)
-- Alias:
UCASE(cadena)Ejemplo básico
La conversión es directa: cada letra minúscula se transforma en mayúscula.
SELECT UPPER('hola mundo') AS resultado;| resultado |
|---|
| HOLA MUNDO |
Nombres en mayúsculas
Sobre columnas, UPPER devuelve la versión en mayúsculas de cada valor, lo que resulta útil para encabezados o etiquetas destacadas en informes:
SELECT UPPER(nombre) AS nombre_upper, UPPER(apellidos) AS apellidos_upper
FROM clientes
LIMIT 5;| nombre_upper | apellidos_upper |
|---|---|
| MARÍA | GARCÍA LÓPEZ |
| CARLOS | RODRÍGUEZ MARTÍN |
| LAURA | LÓPEZ SÁNCHEZ |
| PEDRO | FERNÁNDEZ CASTRO |
| ANA | MARTÍNEZ RUIZ |
Generar códigos
Una aplicación muy práctica es derivar códigos cortos a partir de un nombre, tomando sus primeras letras con LEFT y pasándolas a mayúsculas. Combinado con DISTINCT puedes obtener códigos únicos por categoría:
SELECT
nombre,
UPPER(LEFT(nombre, 3)) AS codigo
FROM categorias;| nombre | codigo |
|---|---|
| Electrónica | ELE |
| Accesorios electrónicos | ACC |
| Hogar inteligente | HOG |
| Audio | AUD |
| Fotografía | FOT |
Capitalizar la primera letra
MySQL no tiene una función nativa para capitalizar (poner solo la inicial en mayúscula), pero se consigue combinando varias funciones: UPPER sobre la primera letra con LEFT, LOWER sobre el resto con SUBSTRING, y CONCAT para unirlo todo:
SELECT
nombre,
CONCAT(UPPER(LEFT(nombre, 1)), LOWER(SUBSTRING(nombre, 2))) AS capitalizado
FROM categorias;| nombre | capitalizado |
|---|---|
| Electrónica | Electrónica |
| Accesorios electrónicos | Accesorios electrónicos |
| Hogar inteligente | Hogar inteligente |
| Audio | Audio |
| Fotografía | Fotografía |
Ten en cuenta que esta técnica solo capitaliza la primera palabra. Para capitalizar cada palabra de una frase haría falta una función almacenada o procesarlo en la aplicación, ya que MySQL no ofrece un equivalente directo a un "title case".
Etiquetas de estado
UPPER es cómodo para resaltar valores categóricos, como el estado de un pedido, de forma uniforme y visualmente destacada:
SELECT id, UPPER(estado) AS estado
FROM pedidos
LIMIT 5;| id | estado |
|---|---|
| 1 | COMPLETADO |
| 2 | COMPLETADO |
| 3 | PENDIENTE |
| 4 | ENVIADO |
| 5 | COMPLETADO |
UPPER con caracteres acentuados
Al igual que LOWER, UPPER maneja correctamente las letras acentuadas y la eñe cuando la columna usa utf8mb4, conservando los acentos sobre las mayúsculas:
SELECT UPPER('café español') AS resultado;| resultado |
|---|
| CAFÉ ESPAÑOL |
Errores comunes
El error de rendimiento es idéntico al de LOWER: aplicar UPPER a una columna indexada dentro del WHERE impide que MySQL aproveche el índice, y además es innecesario con las colaciones _ci por defecto, que ya ignoran las mayúsculas en las comparaciones. Reserva UPPER en el WHERE para los casos con colaciones sensibles a mayúsculas.
Otro punto que sorprende es que la conversión de algunos caracteres no es perfectamente reversible entre UPPER y LOWER en todos los idiomas. Para texto en español el comportamiento es el esperado, pero en aplicaciones multilingües conviene comprobarlo con datos reales antes de confiar en la conversión.
Cuándo usar UPPER
UPPER es la elección adecuada para generar códigos y abreviaturas a partir de nombres, para destacar etiquetas o encabezados, y para normalizar valores categóricos al mostrarlos. Como con LOWER, evita usarla sobre columnas indexadas en el WHERE cuando la colación ya es insensible a mayúsculas, porque penaliza el rendimiento sin aportar nada.
En el siguiente artículo veremos TRIM, que elimina espacios y otros caracteres de los extremos de una cadena.
Escrito por Eduardo Lázaro
