Trabajar con datos de texto es una de las tareas más comunes en SQL. Ya sea que necesites extraer códigos de producto, analizar números telefónicos o limpiar datos desordenados, la función SQL SUBSTRING es tu herramienta principal para obtener exactamente los caracteres que necesitas.
La función SUBSTRING te permite extraer una porción de una cadena basándose en posición y longitud. Es compatible con todas las bases de datos principales y es esencial para la manipulación de texto, limpieza de datos y formateo de reportes.
A lo largo de esta guía, encontrarás ejercicios interactivos de SQL que te permiten practicar SUBSTRING en tu navegador—sin necesidad de configurar una base de datos. Escribe consultas, obtén retroalimentación instantánea y desarrolla habilidades reales con la extracción de texto.
¿Qué es SUBSTRING?
SUBSTRING extrae una porción de una cadena comenzando desde una posición especificada. La sintaxis básica es:
SUBSTRING(cadena, posición_inicial, longitud)
Puntos clave:
- cadena: La columna de texto o valor del cual extraer
- posición_inicial: Dónde comenzar (basado en 1 en SQL, lo que significa que el primer carácter es la posición 1)
- longitud: Cuántos caracteres extraer (opcional en algunas bases de datos)
Si omites el parámetro de longitud, SUBSTRING devuelve todo desde la posición inicial hasta el final de la cadena.
Ejemplos Básicos de SUBSTRING
Comencemos con escenarios simples de extracción.
Extraer desde el Principio
El caso de uso más común es extraer los primeros N caracteres:
SELECT codigo_producto, SUBSTRING(codigo_producto, 1, 3) as prefijo_categoria
FROM productos;
Esto extrae los primeros 3 caracteres de cada código de producto—útil cuando los códigos tienen significado incorporado como “ELE-1234” donde “ELE” indica Electrónicos.
Extraer desde una Posición Específica
Puedes comenzar desde cualquier posición en la cadena:
SELECT numero_orden, SUBSTRING(numero_orden, 5, 4) as año
FROM ordenes;
Si los números de orden tienen el formato “ORD-2024-001”, esto extrae la porción del año.
Inténtalo tú mismo:
[[ testData.title ]]
Consulta la tabla employees para devolver id y los primeros 5 caracteres de full_name como name_prefix. Usa SUBSTRING para extraer los caracteres.
[[ col ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Your Results:
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Expected Results:
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ error ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ testData.solution ]]
Available Tables
[[ table.name ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Extracción con Posiciones Dinámicas
SUBSTRING se vuelve poderoso cuando se combina con otras funciones de cadena para encontrar posiciones dinámicamente.
Trabajando con Datos Delimitados
Muchos escenarios del mundo real involucran extraer partes de cadenas formateadas. Considera los números telefónicos:
SELECT
numero_telefono,
SUBSTRING(numero_telefono, 2, 3) as codigo_area,
SUBSTRING(numero_telefono, 7, 3) as central,
SUBSTRING(numero_telefono, 11, 4) as abonado
FROM contactos;
Para un número telefónico como “(415) 555-1234”, esto extrae cada componente.
Inténtalo tú mismo:
[[ testData.title ]]
Consulta la tabla customers para devolver customer_name y el código de área (primeros 3 dígitos después del paréntesis de apertura) como area_code. Los números telefónicos tienen el formato (XXX) YYY-ZZZZ.
[[ col ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Your Results:
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Expected Results:
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ error ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ testData.solution ]]
Available Tables
[[ table.name ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
SUBSTRING con INSTR o CHARINDEX
El verdadero poder viene cuando combinas SUBSTRING con funciones que encuentran posiciones de caracteres.
Encontrando el @ en Direcciones de Correo Electrónico
Para extraer el dominio de un correo electrónico:
SELECT
email,
SUBSTRING(email, INSTR(email, '@') + 1) as dominio
FROM usuarios;
Esto encuentra dónde está ubicado el símbolo @, luego extrae todo después de él. Diferentes bases de datos usan diferentes nombres de función:
-
SQLite/MySQL:
INSTR(cadena, subcadena) -
PostgreSQL:
POSITION(subcadena IN cadena) -
SQL Server:
CHARINDEX(subcadena, cadena)
Extrayendo Texto Entre Delimitadores
Imagina extraer el segundo nombre de “Nombre Segundo Apellido”:
SELECT
nombre_completo,
SUBSTRING(
nombre_completo,
INSTR(nombre_completo, ' ') + 1,
INSTR(SUBSTRING(nombre_completo, INSTR(nombre_completo, ' ') + 1), ' ') - 1
) as segundo_nombre
FROM empleados;
Esto es complejo—a menudo es más limpio manejar tal análisis en el código de tu aplicación, pero SUBSTRING puede hacerlo cuando es necesario.
Inténtalo tú mismo:
[[ testData.title ]]
Consulta la tabla users para devolver username y extraer el dominio (todo después del @) de la columna email. El dominio debe llamarse email_domain. Pista: Usa INSTR para encontrar la posición del @.
[[ col ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Your Results:
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Expected Results:
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ error ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ testData.solution ]]
Available Tables
[[ table.name ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
SUBSTRING vs SUBSTR vs LEFT/RIGHT
Diferentes bases de datos ofrecen variaciones:
SUBSTR (Alternativa en Oracle, SQLite)
-- Oracle y SQLite también soportan SUBSTR
SELECT SUBSTR(nombre, 1, 5) FROM usuarios;
Funciones LEFT y RIGHT
Para extracción simple del principio/final, algunas bases de datos ofrecen alternativas más limpias:
-- MySQL, SQL Server, PostgreSQL
SELECT LEFT(codigo_producto, 3) as prefijo FROM productos;
SELECT RIGHT(telefono, 4) as ultimos_cuatro FROM contactos;
Eligiendo la Función Correcta
- Usa LEFT/RIGHT cuando extraigas desde el inicio o final (sintaxis más limpia)
- Usa SUBSTRING cuando comiences desde una posición intermedia o uses posiciones dinámicas
- Usa SUBSTR en Oracle o cuando prefieras el nombre más corto
Casos de Uso Prácticos
Enmascarando Datos Sensibles
Mostrar solo los últimos 4 dígitos de tarjetas de crédito:
SELECT
nombre_cliente,
'****-****-****-' || SUBSTRING(numero_tarjeta, 13, 4) as tarjeta_enmascarada
FROM pagos;
Analizando Datos de Ancho Fijo
Los sistemas heredados a menudo usan campos de ancho fijo:
-- Registro: "JUANGARC19850315MEX"
SELECT
SUBSTRING(registro, 1, 8) as nombre,
SUBSTRING(registro, 9, 8) as fecha_nacimiento,
SUBSTRING(registro, 17, 3) as codigo_ciudad
FROM datos_legados;
Creando URLs Amigables
Extraer una URL más limpia de títulos de páginas:
SELECT
titulo,
LOWER(SUBSTRING(REPLACE(titulo, ' ', '-'), 1, 50)) as url_slug
FROM articulos;
Extrayendo Extensiones de Archivo
SELECT
nombre_archivo,
SUBSTRING(nombre_archivo, INSTR(nombre_archivo, '.') + 1) as extension
FROM documentos
WHERE INSTR(nombre_archivo, '.') > 0;
Manejando Casos Límite
Cadenas Más Cortas de lo Esperado
¿Qué pasa cuando la cadena es más corta que tu longitud de extracción?
-- Si nombre es "Bob" y pides SUBSTRING(nombre, 1, 10)
-- Resultado: "Bob" (no es un error, solo devuelve lo disponible)
SELECT SUBSTRING('Bob', 1, 10); -- Devuelve: "Bob"
SUBSTRING maneja esto graciosamente devolviendo los caracteres disponibles.
Cadenas Vacías y NULLs
-- Cadena vacía
SELECT SUBSTRING('', 1, 5); -- Devuelve: ''
-- Manejo de NULL
SELECT SUBSTRING(NULL, 1, 5); -- Devuelve: NULL
Combina con COALESCE para un manejo más seguro:
SELECT COALESCE(SUBSTRING(segundo_nombre, 1, 1), '') as inicial_segundo
FROM empleados;
Posición Inicial Más Allá de la Longitud de la Cadena
-- Posición inicial pasada la longitud de la cadena
SELECT SUBSTRING('Hola', 10, 5); -- Devuelve: '' (cadena vacía)
Consideraciones de Rendimiento
Indexación y SUBSTRING
SUBSTRING en cláusulas WHERE puede prevenir el uso de índices:
-- Esto no usará un índice en codigo_producto eficientemente
SELECT * FROM productos
WHERE SUBSTRING(codigo_producto, 1, 3) = 'ELE';
-- Mejor: Usa LIKE para coincidencia de prefijo (puede usar índice)
SELECT * FROM productos
WHERE codigo_producto LIKE 'ELE%';
Cuando SUBSTRING es Inevitable
Si frecuentemente filtras por porciones extraídas, considera:
- Agregar una columna calculada/generada
- Crear un índice funcional (PostgreSQL, Oracle)
- Desnormalizar los datos en columnas separadas
-- Índice funcional en PostgreSQL
CREATE INDEX idx_productos_prefijo ON productos (SUBSTRING(codigo_producto, 1, 3));
Sintaxis Específica por Base de Datos
MySQL
-- MySQL soporta múltiples sintaxis
SELECT SUBSTRING(nombre, 1, 5) FROM usuarios;
SELECT SUBSTR(nombre, 1, 5) FROM usuarios;
SELECT MID(nombre, 1, 5) FROM usuarios; -- Alias específico de MySQL
SELECT LEFT(nombre, 5) FROM usuarios;
PostgreSQL
-- PostgreSQL soporta SUBSTRING con coincidencia de patrones
SELECT SUBSTRING(email FROM '@(.*)$') as dominio FROM usuarios;
SELECT SUBSTRING(nombre, 1, 5) FROM usuarios;
SQL Server
-- Sintaxis de SQL Server
SELECT SUBSTRING(nombre, 1, 5) FROM usuarios;
SELECT LEFT(nombre, 5) FROM usuarios;
-- Usa CHARINDEX en lugar de INSTR
SELECT SUBSTRING(email, CHARINDEX('@', email) + 1, 100) as dominio FROM usuarios;
SQLite
-- SQLite soporta tanto SUBSTRING como SUBSTR
SELECT SUBSTRING(nombre, 1, 5) FROM usuarios;
SELECT SUBSTR(nombre, 1, 5) FROM usuarios;
Errores Comunes
Indexación Basada en Cero vs Basada en Uno
SQL usa indexación basada en 1. El primer carácter está en la posición 1, no 0:
-- Correcto: El primer carácter es posición 1
SELECT SUBSTRING('Hola', 1, 1); -- Devuelve: 'H'
-- Suposición incorrecta: Posición 0
SELECT SUBSTRING('Hola', 0, 1); -- El comportamiento varía por base de datos
Posiciones Negativas
Algunas bases de datos soportan posiciones negativas (contar desde el final), otras no:
-- PostgreSQL: inicio negativo cuenta desde el final
SELECT SUBSTRING('Hola' FROM -2); -- Devuelve: 'la'
-- MySQL/SQL Server: posiciones negativas no funcionan de la misma manera
Olvidar el Parámetro de Longitud
Sin una longitud, SUBSTRING devuelve todo desde la posición inicial:
SELECT SUBSTRING('Hola Mundo', 6); -- Devuelve: 'Mundo'
Esto es útil pero puede sorprenderte si esperabas solo un carácter.
Trabajando con SUBSTRING en Beekeeper Studio
Cuando trabajas con manipulación de cadenas, tener un editor SQL que te ayude a visualizar resultados hace una gran diferencia. Beekeeper Studio proporciona excelente soporte para probar consultas con SUBSTRING.
Características que ayudan cuando trabajas con SUBSTRING:
- Autocompletado de consultas: Sugiere funciones de cadena mientras escribes
- Resultados instantáneos: Ve el texto extraído inmediatamente en la cuadrícula de resultados
- Historial de consultas: Guarda y reutiliza tus patrones de análisis de texto
- Soporte multi-base de datos: Usa SUBSTRING en PostgreSQL, MySQL, SQLite, SQL Server y más
- Exportación de datos: Exporta tus resultados analizados a CSV u otros formatos
La versión gratuita incluye todo lo que necesitas para dominar las funciones de cadenas SQL.
Puntos Clave
La función SQL SUBSTRING es esencial para trabajar con datos de texto. Esto es lo que debes recordar:
- SUBSTRING extrae caracteres por posición y longitud de cadenas
- Las posiciones están basadas en 1 en SQL (el primer carácter es posición 1)
- Omitir la longitud devuelve todo desde la posición inicial hasta el final
- Combina con INSTR/CHARINDEX para encontrar posiciones dinámicas
- Usa LEFT/RIGHT para extracciones simples del principio/final
- Ten cuidado con los índices - SUBSTRING en WHERE puede afectar el rendimiento
- Maneja casos límite - cadenas cortas y NULLs no causarán errores
- La sintaxis varía ligeramente entre bases de datos, pero el concepto es el mismo
Al dominar SUBSTRING, podrás analizar, limpiar y transformar datos de texto efectivamente. Ya sea que estés extrayendo códigos de IDs de producto, analizando archivos de registro o formateando datos para mostrar, SUBSTRING es una herramienta que usarás regularmente.
¿Listo para practicar más? Prueba los ejemplos interactivos de arriba, o explora más tutoriales de SQL para continuar desarrollando tus habilidades con bases de datos.
Beekeeper Studio Is A Free & Open Source Database GUI
Best SQL query & editor tool I have ever used. It provides everything I need to manage my database. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio is fast, intuitive, and easy to use. Beekeeper supports loads of databases, and works great on Windows, Mac and Linux.
What Users Say About Beekeeper Studio
"Beekeeper Studio completely replaced my old SQL workflow. It's fast, intuitive, and makes database work enjoyable again."
"I've tried many database GUIs, but Beekeeper strikes the perfect balance between features and simplicity. It just works."