🙏 Realmente necesitamos su apoyo. Necesitamos financiamiento para continuar nuestra misión: publicar nuevas lecciones y mejorar la plataforma. Si puede, por favor apoye el proyecto con una donación. Ayude al proyecto ahora →
Código SQL copiado al portapapeles

Lesión 3.2 · Tiempo de lectura: ~8 min

En esta lección, aprenderás las funciones de cadenas SQL que ayudan a limpiar y transformar texto directamente en consultas. Cubriremos cuándo usar UPPER, LOWER, TRIM, SUBSTRING, CONCAT y otras funciones, y recorreremos ejemplos prácticos. Al final de la lección, podrás procesar campos de texto con confianza en tareas reales.

Funciones de Cadenas Fundamentales en SQL

En la lección anterior, se te introdujo a las funciones integradas de SQL en su totalidad. Ahora nos enfocaremos en las funciones de cadenas porque los campos de texto a menudo necesitan procesamiento adicional: normalización de mayúsculas y minúsculas, eliminación de caracteres no deseados, combinación de valores y extracción de fragmentos.

Estas operaciones son comunes en análisis, informes y preparación de datos. Cuanto mejor conozcas las funciones de cadenas, menos procesamiento manual necesitarás fuera de SQL.


Qué Son las Funciones de Cadenas

Las funciones de cadenas trabajan con texto y devuelven una cadena, un número o una posición de subcadena. Son útiles cuando necesitas:

  • llevar el texto a un formato consistente;
  • limpiar valores ruidosos;
  • extraer parte de una cadena (por ejemplo, un dominio de correo electrónico);
  • construir una salida legible para informes.

Sintaxis Básica

FUNCTION_NAME(string_expression, ...)

En la mayoría de los casos, el argumento es una columna de tabla, un literal de cadena o el resultado de otra función.


Funciones de Cadenas Fundamentales

UPPER() y LOWER()

Se utilizan para normalizar el uso de mayúsculas y minúsculas en el texto.

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 de pila en minúsculas.

CHAR_LENGTH() y LENGTH()

Ambas funciones miden la longitud de la cadena, pero no siempre de la misma manera:

  • CHAR_LENGTH() generalmente devuelve el conteo de caracteres;
  • LENGTH() en MySQL devuelve el conteo de bytes.
SELECT
   title,
   CHAR_LENGTH(title) AS title_chars,
   LENGTH(title) AS title_bytes
FROM film
LIMIT 5;

Nota: para caracteres multibyte, el conteo de bytes puede ser mayor que el conteo 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 diferentes fragmentos de correo electrónico para análisis y verificaciones de formato.

CONCAT() y CONCAT_WS()

Estas funciones combinan múltiples valores en una sola cadena:

  • CONCAT() une los argumentos directamente;
  • CONCAT_WS(separator, ...) inserta un separador y a menudo es más práctico en 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 DBMS, así que siempre verifica 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 espacios adicionales y se reemplazan patrones de texto repetidos.

Búsqueda de Subcadenas: POSITION() / INSTR() / CHARINDEX()

El nombre de la función depende del DBMS, 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 @, que es útil para la validación de correos electrónicos.


Qué Tener en Cuenta

  • Verifica las diferencias entre DBMS: los nombres de las funciones y su comportamiento pueden variar.
  • Ten cuidado con NULL: a menudo cambia los resultados de las expresiones de cadena.
  • Para texto en cirílico y emojis, elige funciones de longitud intencionalmente (caracteres vs bytes).
  • Evita anidar demasiadas funciones en una sola consulta; divide la lógica en pasos cuando sea posible.

Ejemplo Práctico: Preparando Datos de Clientes para Campañas de Correo Electrónico

La consulta a continuación prepara una lista de clientes limpia: normaliza el nombre, normaliza el correo electrónico 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 consistente, listo para análisis o exportación.


Conclusiones clave de esta lección:

  • Las funciones de cadenas SQL ayudan a limpiar, normalizar y formatear texto directamente en consultas.
  • UPPER, LOWER, TRIM, REPLACE, SUBSTRING, LEFT, RIGHT y CONCAT cubren la mayoría de las tareas comunes.
  • Para la longitud de cadenas, es importante distinguir entre caracteres y bytes.
  • Al combinar cadenas, considera el comportamiento de NULL en tu DBMS.
  • El valor práctico de las funciones de cadenas es más visible en flujos de trabajo de preparación de datos reales.

Preguntas de Entrevista

¿Cuál es la diferencia entre CHAR_LENGTH() y LENGTH(), y por qué es importante?

CHAR_LENGTH() generalmente devuelve el número de caracteres, mientras que LENGTH() en MySQL devuelve el número de bytes. Para caracteres cirílicos y otros multibyte, los resultados pueden diferir. Esto es importante al validar la longitud de los campos y hacer cumplir las reglas de negocio.

¿Cómo construirías de manera segura un nombre completo si un campo puede ser NULL?

CONCAT_WS() es a menudo preferido porque es práctico al combinar cadenas con un separador. También es común manejar valores vacíos explícitamente con COALESCE() para obtener una salida predecible en diferentes escenarios.

¿Qué funciones de cadenas usarías para limpiar valores de correo electrónico antes del análisis?

Un enfoque común es TRIM() + LOWER() para eliminar espacios adicionales y normalizar el caso. Para validar la estructura, también puedes verificar la presencia de @ usando INSTR() o su equivalente en tu DBMS.

En la próxima lección, pasaremos a las funciones matemáticas de SQL y aprenderemos cómo realizar cálculos numéricos en consultas.