🧚 Listen! Beekeeper Studio is a fast, modern, and open source database GUI Download
January 13, 2026 By Matthew Rathbone

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:

[[ expanded ? '▼' : '▶' ]]

[[ 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.

Interactive Example ✓ Completed
Expected columns: [[ col ]]
Correct! Your query produced the expected results.
[[ col ]]
[[ formatCell(cell) ]]
Not quite right. Your query ran but the results don't match.
Your Results:
[[ col ]]
[[ formatCell(cell) ]]
Expected Results:
[[ col ]]
[[ formatCell(cell) ]]
SQL Error:
[[ error ]]
💡 Hint: [[ testData.hint ]]
📊 Expected Result:
[[ col ]]
[[ formatCell(cell) ]]
✨ Solution:
[[ 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:

[[ expanded ? '▼' : '▶' ]]

[[ 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.

Interactive Example ✓ Completed
Expected columns: [[ col ]]
Correct! Your query produced the expected results.
[[ col ]]
[[ formatCell(cell) ]]
Not quite right. Your query ran but the results don't match.
Your Results:
[[ col ]]
[[ formatCell(cell) ]]
Expected Results:
[[ col ]]
[[ formatCell(cell) ]]
SQL Error:
[[ error ]]
💡 Hint: [[ testData.hint ]]
📊 Expected Result:
[[ col ]]
[[ formatCell(cell) ]]
✨ Solution:
[[ 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:

[[ expanded ? '▼' : '▶' ]]

[[ 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 @.

Interactive Example ✓ Completed
Expected columns: [[ col ]]
Correct! Your query produced the expected results.
[[ col ]]
[[ formatCell(cell) ]]
Not quite right. Your query ran but the results don't match.
Your Results:
[[ col ]]
[[ formatCell(cell) ]]
Expected Results:
[[ col ]]
[[ formatCell(cell) ]]
SQL Error:
[[ error ]]
💡 Hint: [[ testData.hint ]]
📊 Expected Result:
[[ col ]]
[[ formatCell(cell) ]]
✨ Solution:
[[ 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:

  1. Agregar una columna calculada/generada
  2. Crear un índice funcional (PostgreSQL, Oracle)
  3. 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.

Beekeeper's Linux version is 100% full-featured, no cut corners, no feature compromises.

What Users Say About Beekeeper Studio

★★★★★
"Beekeeper Studio completely replaced my old SQL workflow. It's fast, intuitive, and makes database work enjoyable again."
— Alex K., Database Developer
★★★★★
"I've tried many database GUIs, but Beekeeper strikes the perfect balance between features and simplicity. It just works."
— Sarah M., Full Stack Engineer

Ready to Improve Your SQL Workflow?

download Download Free