Funciones de cadena básicas en SQL
Lección 3.2 · Tiempo de lectura: ~8 min · Tareas de práctica ↓
En esta lección conocerás las funciones de cadena de SQL, que permiten limpiar y transformar texto directamente en las consultas. Veremos cuándo usar UPPER, LOWER, TRIM, SUBSTRING, CONCAT y otras funciones, con ejemplos prácticos. Al terminar, podrás procesar campos de texto con seguridad en tareas reales.
En la lección anterior viste las funciones integradas de SQL en general. Ahora nos centramos en las funciones de cadena, porque los campos de texto suelen necesitar un procesamiento adicional: normalizar mayúsculas y minúsculas, quitar caracteres sobrantes, combinar valores y extraer fragmentos.
Estas operaciones son habituales en analítica, informes y preparación de datos. Cuanto mejor conozcas las funciones de cadena, menos procesamiento manual necesitarás fuera de SQL.
Qué son las funciones de cadena
Las funciones de cadena trabajan con texto y devuelven una cadena, un número o la posición de una subcadena. Son útiles cuando necesitas:
- llevar el texto a un formato uniforme;
- limpiar valores con ruido;
- extraer parte de una cadena (por ejemplo, el dominio de un email);
- construir un resultado legible para los informes.
Sintaxis básica
FUNCTION_NAME(string_expression, ...)
En la mayoría de los casos, el argumento es una columna de la tabla, un literal de texto o el resultado de otra función.
Funciones de cadena principales
UPPER() y LOWER()
Sirven para normalizar las mayúsculas y minúsculas.
SELECT
customer_id,
UPPER(last_name) AS last_name_upper,
LOWER(first_name) AS first_name_lower
FROM customer
LIMIT 5;
Resultado: el apellido se muestra en mayúsculas y el nombre, en minúsculas.
CHAR_LENGTH() y LENGTH()
Las dos funciones miden la longitud de una cadena, pero no siempre de la misma forma:
CHAR_LENGTH()suele devolver el número de caracteres;LENGTH()en MySQL devuelve el número de bytes.
SELECT
title,
CHAR_LENGTH(title) AS title_chars,
LENGTH(title) AS title_bytes
FROM film
LIMIT 5;
Nota: con caracteres multibyte, el número de bytes puede ser mayor que el número de caracteres.
SUBSTRING(), LEFT(), RIGHT()
Estas funciones extraen parte de una cadena.
SELECT
email,
SUBSTRING(email, 1, 5) AS email_start,
LEFT(email, 3) AS first_3,
RIGHT(email, 10) AS last_10
FROM customer
LIMIT 5;
Resultado: se extraen distintos fragmentos del email para analizarlos y comprobar su formato.
CONCAT() y CONCAT_WS()
Estas funciones combinan varios valores en una sola cadena:
CONCAT()une los argumentos directamente;CONCAT_WS(separator, ...)inserta un separador y suele ser más práctica en los informes.
SELECT
customer_id,
CONCAT(first_name, ' ', last_name) AS full_name,
CONCAT_WS(' | ', first_name, last_name, email) AS customer_label
FROM customer
LIMIT 5;
Nota: el comportamiento con NULL depende del SGBD, así que consulta siempre la documentación de tu sistema.
TRIM() y REPLACE()
Útiles para limpiar valores de texto.
SELECT
address,
TRIM(address) AS address_trimmed,
REPLACE(address, 'Street', 'St.') AS address_short
FROM address
LIMIT 5;
Resultado: se eliminan los espacios sobrantes y se sustituyen fragmentos de texto repetidos.
Búsqueda de subcadenas: POSITION() / INSTR() / CHARINDEX()
El nombre de la función depende del SGBD, pero la idea es la misma: encontrar la posición de una subcadena dentro de una cadena.
SELECT
email,
INSTR(email, '@') AS at_pos
FROM customer
LIMIT 5;
Resultado: devuelve la posición de @, algo útil para validar emails.
Qué hay que tener en cuenta
- Revisa las diferencias entre SGBD: los nombres y el comportamiento de las funciones pueden variar.
- Ten cuidado con
NULL: a menudo cambia el resultado de las expresiones de cadena. - Con texto en cirílico o con emojis, elige conscientemente la función de longitud (caracteres o bytes).
- Evita anidar demasiadas funciones en una consulta; cuando puedas, divide la lógica en pasos.
Ejemplo práctico: preparar los datos de clientes para campañas de email
La siguiente consulta prepara una lista de clientes limpia: normaliza el nombre y el email, y extrae el dominio.
SELECT
c.customer_id,
TRIM(CONCAT_WS(' ', c.first_name, c.last_name)) AS full_name,
LOWER(TRIM(c.email)) AS email_normalized,
SUBSTRING_INDEX(LOWER(TRIM(c.email)), '@', -1) AS email_domain
FROM customer AS c
WHERE c.email IS NOT NULL
ORDER BY c.customer_id
LIMIT 20;
Resultado: obtienes un conjunto de campos de texto limpio y uniforme, listo para el análisis o la exportación.
Puntos clave de esta lección:
- Las funciones de cadena de SQL permiten limpiar, normalizar y formatear texto directamente en las consultas.
UPPER,LOWER,TRIM,REPLACE,SUBSTRING,LEFT,RIGHTyCONCATcubren la mayoría de las tareas habituales.- Al medir la longitud de una cadena, es importante distinguir entre caracteres y bytes.
- Al combinar cadenas, ten en cuenta cómo trata
NULLtu SGBD. - El valor práctico de las funciones de cadena se ve sobre todo en la preparación de datos reales.
Preguntas frecuentes
¿Cómo eliminar espacios de una cadena en SQL?
TRIM(column) elimina los espacios del principio y del final, LTRIM y RTRIM solo de un lado. Para eliminar todos los espacios, también los del interior de la cadena, usa REPLACE(column, ' ', ''). En MySQL y PostgreSQL, TRIM también puede quitar otros caracteres: TRIM(BOTH '.' FROM column).
¿Cómo concatenar cadenas en SQL?
CONCAT(first_name, ' ', last_name) funciona en MySQL, PostgreSQL y SQL Server. El operador estándar || funciona en PostgreSQL, SQLite y Oracle, pero en MySQL significa OR lógico por defecto. CONCAT_WS(' ', first_name, last_name) inserta el separador entre los valores por ti.
¿Cómo comprobar si una cadena contiene una subcadena en SQL?
Para filtrar filas, usa LIKE: WHERE email LIKE '%@sakilacustomer.org'. Para obtener la posición, usa INSTR(email, '@') en MySQL, POSITION('@' IN email) en SQL estándar y PostgreSQL, o CHARINDEX('@', email) en SQL Server. Una posición 0 significa que la subcadena no está.
Preguntas de entrevista
¿Qué diferencia hay entre CHAR_LENGTH() y LENGTH() y por qué importa?
CHAR_LENGTH() suele devolver el número de caracteres, mientras que LENGTH() en MySQL devuelve el número de bytes. Con el cirílico y otros caracteres multibyte, los resultados pueden ser distintos. Importa al validar la longitud de los campos y al aplicar reglas de negocio.
¿Cómo construirías un nombre completo de forma segura si un campo puede ser NULL?
Se suele preferir CONCAT_WS(), porque es práctica para combinar cadenas con un separador. También es habitual tratar explícitamente los valores vacíos con COALESCE() para obtener un resultado predecible en distintos casos.
¿Qué funciones de cadena usarías para limpiar los emails antes del análisis?
Un enfoque habitual es TRIM() + LOWER(), para quitar los espacios sobrantes y normalizar las mayúsculas. Para validar la estructura, también puedes comprobar la presencia de @ con INSTR() o su equivalente en tu SGBD.