Aprende leyendo en orden

Funciones ② — Funciones de cadena (LENGTH / TRIM / REPLACE / UPPER / SUBSTR)

El segundo de tres artículos sobre funciones SQL. Cubre LENGTH para contar caracteres, TRIM para quitar espacios, REPLACE para sustituciones, UPPER / LOWER para conversión de mayúsculas, y SUBSTR — todo sobre un conjunto de datos staff cargado desde CSV.

Datos usados en este artículo — la tabla staff

El segundo artículo sobre funciones se centra en las funciones de cadena. Recorreremos las funciones que usarás siempre que necesites limpiar o transformar texto sacado de una tabla en producción: longitud, eliminación de espacios, sustitución, conversión de mayúsculas, y extracción de subcadena.

El conjunto de datos es la misma tabla staff que la última vez (10 filas: name / city / salary, etc.). Usando los nombres en la columna name como estrella, cuatro ejercicios cubren cálculo de longitud, sustitución de apellido, conversión a mayúsculas, y extracción de iniciales.

Antes de meterte en los ejercicios, verifiquemos las definiciones de columnas y los datos de muestra de la tabla staff.

① Ejecuta PRAGMA table_info(staff); para ver los nombres de columnas, tipos y clave primaria.

② Ejecuta SELECT * FROM staff LIMIT 5; para previsualizar las primeras 5 filas.

Editor SQL

Ejecutar una consulta para ver el resultado

Longitud de cadena — `LENGTH` y `CHAR_LENGTH`

La función para medir la longitud de una cadena se comporta diferente entre la consola de este curso (SQLite) y MySQL, así que ¡atención!:

- Consola de este curso (SQLite): LENGTH(s) devuelve el conteo de caracteres ('niño' → 4)

- MySQL: LENGTH(s) devuelve el conteo de bytes ('niño' → 5, porque ñ ocupa 2 bytes en UTF-8). Para obtener el conteo de caracteres, usa CHAR_LENGTH(s)

Este artículo usa LENGTH() para los ejercicios, pero es importante conocer la diferencia — cualquier texto con tildes, eñes o caracteres no ASCII cae en esta trampa.

Cómo se diferencian `LENGTH` y `CHAR_LENGTH`
EntradaSQLiteLENGTHMySQLLENGTH (byte)MySQLCHAR_LENGTH'ABC'3 (car.)3 (bytes)3 (car.)'niño'4 (car.)5 (bytes)ñ = 2 bytes en UTF-84 (car.)'Alice'555
La consola de este curso (SQLite) devuelve el conteo de caracteres con LENGTH. MySQL devuelve el conteo de bytes con LENGTH, y el conteo de caracteres con CHAR_LENGTH. La brecha es más visible con caracteres multibyte como el japonés.
-- 1) Cuenta caracteres (en la consola de este curso, LENGTH devuelve el conteo de caracteres)
SELECT LENGTH('Alice');         -- 5
SELECT LENGTH('niño');          -- 4 (aquí), 5 (LENGTH de MySQL = conteo de bytes)

-- 2) Ordena por longitud de columna
SELECT name, LENGTH(name) AS name_len FROM staff
ORDER BY name_len DESC;

-- Referencia: en MySQL, el conteo de caracteres es CHAR_LENGTH(s)
--   SELECT CHAR_LENGTH('niño') FROM dual;  -- 4

Imagina una lista de empleados que destaca el «TOP 3 de empleados por longitud de nombre completo». (Si lo ejecutas correctamente, aparecerá una explicación.)

① Desde la tabla staff, extrae name y `LENGTH(name)` con el alias `name_len` — 2 columnas en total.

② Ordena por name_len descendente. Para empates, desempata por name ascendente (alfabético) — orden multinivel.

③ Limita a las 3 primeras filas.

④ Verifica que el resultado es 3 filas: Iris Watanabe 13 / Alice Tanaka 12 / Carol Tanaka 12.

Editor SQL

Ejecutar una consulta para ver el resultado

Eliminación de espacios y sustitución — `TRIM` y `REPLACE`

En tablas del mundo real, te encontrarás con espacios no deseados — «alguien hizo un copia y pega con espacios al principio o al final», «un sistema previo a la migración dejó espacios de ancho completo dentro de los datos», etc. `TRIM(s)` quita espacios de ambos extremos de una cadena; LTRIM(s) quita solo el lado izquierdo, y RTRIM(s) solo el derecho.

`REPLACE(s, buscar, reemplazar)` reemplaza cada ocurrencia de buscar en s con reemplazar. Es la función ideal para normalización y migraciones — «abreviar el apellido frecuente Tanaka a T. para una visualización compacta», «cambiar el dominio de un correo electrónico por uno nuevo», etc. Combínala con UPDATE y puedes reescribir valores directamente en la tabla.

-- 1) Eliminación de espacios: TRIM / LTRIM / RTRIM
SELECT TRIM('  Hello  ');     -- 'Hello'
SELECT LTRIM('  Hello  ');    -- 'Hello  '
SELECT RTRIM('  Hello  ');    -- '  Hello'

-- TRIM en columna: detecta filas con espacios por diferencia de longitud
SELECT name FROM staff
WHERE LENGTH(name) <> LENGTH(TRIM(name));

-- 2) Sustitución: REPLACE
SELECT REPLACE('I LIKE APPLE', 'APPLE', 'BANANA');
-- 'I LIKE BANANA'

-- REPLACE en columna — abreviar 'Tanaka' a 'T.'
SELECT name, REPLACE(name, 'Tanaka', 'T.') AS short_name
FROM staff;

Aplicar TRIM — combinar con UPDATE para arreglar texto inconsistente

TRIM no es solo para leer — combinada con UPDATE, puede reescribir valores directamente en la tabla. Por ejemplo, para normalizar masivamente una columna name con espacios inesperados al inicio o final, escribe algo como UPDATE staff SET name = TRIM(name) WHERE LENGTH(name) <> LENGTH(TRIM(name)); — el patrón seguro es filtrar primero con WHERE, luego UPDATE. Si quitas el WHERE, cada fila recibe TRIM (casi sin daño pero con UPDATE innecesarios). REPLACE funciona igual: UPDATE tabla SET columna = REPLACE(columna, 'A', 'B') es una técnica básica para arreglar texto inconsistente en masa.

Imagina una petición: «en un dashboard compacto, abreviar el apellido frecuente Tanaka a T.».

① Desde la tabla staff, extrae name y `REPLACE(name, 'Tanaka', 'T.')` con el alias `short_name` — 2 columnas en total.

② Verifica que el resultado tiene 10 filas. Los 4 nombres que contienen Tanaka (Alice / Carol / Frank / Jack) deberían tener short_name como 'Alice T.' / 'Carol T.'.

Editor SQL

Ejecutar una consulta para ver el resultado

Conversión de mayúsculas y subcadena — `UPPER` / `LOWER` / `SUBSTR`

`UPPER(s)` convierte una cadena a todo mayúsculas, y `LOWER(s)` a todo minúsculas. Úsalas cuando quieras condiciones de búsqueda insensibles a mayúsculas (WHERE UPPER(email) = 'X@Y.COM') o un formato de visualización consistente. No tienen efecto en caracteres sin distinción de mayúsculas (como el japonés).

`SUBSTR(s, inicio, longitud)` extrae `longitud` caracteres a partir de la posición `inicio` (también se puede escribir SUBSTRING). Las posiciones en SQL son base 1, así que SUBSTR('Alice Tanaka', 1, 5) devuelve 'Alice'. Omite el tercer argumento y devuelve hasta el final; pasa un inicio negativo como SUBSTR(s, -3) y cuenta desde el final.

UPPER / LOWER / SUBSTR de un vistazo
FunciónEjemplo de llamadaResultadoUPPERUPPER('Alice')'ALICE'LOWERLOWER('ALICE')'alice'SUBSTRSUBSTR('Alice Tanaka', 1, 5)'Alice'
UPPER y LOWER toman un solo argumento y cambian las mayúsculas de toda la cadena. SUBSTR toma 3 argumentos — (objetivo, inicio, longitud) — y la posición de inicio es base 1.
-- 1) UPPER / LOWER
SELECT UPPER('apple'), LOWER('APPLE');
-- 'APPLE', 'apple'

-- Sobre columna: saca los nombres en mayúsculas y minúsculas
SELECT name, UPPER(name) AS upper_name, LOWER(name) AS lower_name
FROM staff;

-- 2) SUBSTR: las posiciones son base 1
SELECT SUBSTR('Alice Tanaka', 1, 5);   -- 'Alice'
SELECT SUBSTR('Alice Tanaka', 7, 6);   -- 'Tanaka'
SELECT SUBSTR('Alice Tanaka', 7);      -- 'Tanaka'  -- omite longitud → hasta el final
SELECT SUBSTR('Alice Tanaka', -6);     -- 'Tanaka'  -- negativo → desde el final

-- Primer carácter de cada nombre
SELECT name, SUBSTR(name, 1, 1) AS initial FROM staff;

-- Referencia: REVERSE es una función MySQL / Oracle — no está en la consola de este curso
--   SELECT REVERSE('Alice Tanaka');  -- 'akanaT ecilA' (funciona en MySQL)

Imagina una petición: «agrupar archivos de empleados por inicial, así que saca cada inicial y ordénalo».

① Desde la tabla staff, extrae name, `UPPER(name)` como `upper_name` y `SUBSTR(name, 1, 1)` como `initial` — 3 columnas en total.

② Ordena por initial ascendente (alfabético), con name ascendente como desempate.

③ Verifica que el resultado tiene 10 filas, empezando con Alice Tanaka / ALICE TANAKA / A y terminando con Jack Tanaka / JACK TANAKA / J.

Editor SQL

Ejecutar una consulta para ver el resultado

Encontrar la posición de una subcadena — `INSTR`

`INSTR(objetivo, buscar)` devuelve la posición (índice base 1) donde `buscar` aparece primero en objetivo. Las posiciones empiezan en 1, y si la cadena buscada no se encuentra, devuelve 0. Por ejemplo, INSTR('Alice Tanaka', ' ') devuelve 6 porque el espacio está en la 6ª posición.

Combínala con SUBSTR y puedes cortar una cadena basándote en un separador en vez de una posición fija. Es el combo ideal para transformar cadenas de longitud variable — «separar un correo alrededor del @», «extraer solo el apellido de un nombre completo», etc.

-- 1) INSTR solo — verifica la posición del espacio
SELECT name, INSTR(name, ' ') AS space_pos FROM staff;
-- 'Alice Tanaka' → 6, 'Bob Suzuki' → 4, ...

-- 2) Combinado con SUBSTR para extraer el apellido
SELECT name,
       SUBSTR(name, INSTR(name, ' ') + 1) AS last_name
FROM staff;

-- 3) Separa alrededor de '@' (ejemplo de correo)
SELECT INSTR('alice@example.com', '@'); -- 6
Cómo INSTR + SUBSTR cortan el apellido
PasoExpresiónResultado① Encuentra laposición del espacioINSTR('Alice Tanaka',' ')6② Calcula el iniciodel apellido6 + 17③ Corta desde ahíhasta el finalSUBSTR('Alice Tanaka', 7)'Tanaka'
Los 3 pasos para extraer el apellido de 'Alice Tanaka'. ① INSTR encuentra la posición del espacio (6º carácter) → ② +1 calcula el inicio del apellido (7º carácter) → ③ SUBSTR corta desde ahí hasta el final, devolviendo 'Tanaka'.

Imagina una petición: «extrae solo la parte apellido de cada nombre completo y muestra el top 5 en orden alfabético por apellido». En staff, name tiene la forma «Alice Tanaka» — «nombre espacio apellido», separado por un espacio de media anchura. Como los nombres varían en longitud, en vez de cortar en una posición fija, usa `INSTR` para encontrar la posición del espacio y luego corta después.

① Desde la tabla staff, extrae name y `SUBSTR(name, INSTR(name, ' ') + 1)` con el alias `last_name` — 2 columnas en total.

② Orden multinivel: `last_name` ascendente, con `name` ascendente como desempate. Limita a las 5 primeras filas.

③ Verifica que el resultado es 5 filas (David Sato / Emi Sato / Henry Sato / Bob Suzuki / Grace Suzuki).

Editor SQL

Ejecutar una consulta para ver el resultado
QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1En la consola de este curso (SQLite), ¿qué devuelve SELECT LENGTH('niño');?

Pregunta 2¿Qué devuelve SELECT REPLACE('I LIKE APPLE', 'APPLE', 'BANANA');?

Pregunta 3¿Qué devuelve SELECT SUBSTR('Alice Tanaka', 7, 6);?