Modificación de tablas: INSERT, UPDATE, DELETE

Intermedio
SQL
SQL
Actualizado: 02/09/2025

INSERT

La instrucción INSERT es la herramienta fundamental para añadir nuevos registros a nuestras tablas. Después de crear una estructura con CREATE TABLE, necesitamos poblar esas tablas con datos reales para que nuestra base de datos sea útil.

Sintaxis básica de INSERT

La forma más simple de insertar datos utiliza la siguiente estructura:

INSERT INTO nombre_tabla (columna1, columna2, columna3)
VALUES (valor1, valor2, valor3);

Consideremos una tabla de empleados como ejemplo práctico:

-- Insertar un empleado específico
INSERT INTO empleados (nombre, apellido, edad, departamento)
VALUES ('Juan', 'García', 28, 'Ventas');

Este comando inserta un registro completo en la tabla empleados, especificando valores para todas las columnas indicadas.

Inserción sin especificar columnas

Cuando queremos insertar datos en todas las columnas de la tabla en su orden original, podemos omitir la lista de columnas:

-- Insertar valores para todas las columnas en orden
INSERT INTO empleados
VALUES ('María', 'López', 32, 'Marketing');

Sin embargo, esta práctica requiere mucha precaución, ya que cualquier cambio en la estructura de la tabla puede romper nuestro código. Es más seguro especificar siempre las columnas explícitamente.

Inserción de múltiples registros

Una característica muy útil del SQL moderno es la capacidad de insertar múltiples filas en una sola instrucción:

INSERT INTO empleados (nombre, apellido, edad, departamento)
VALUES 
    ('Ana', 'Martín', 25, 'Desarrollo'),
    ('Carlos', 'Ruiz', 30, 'Ventas'),
    ('Laura', 'Jiménez', 27, 'Marketing');

Esta sintaxis es mucho más eficiente que ejecutar tres instrucciones INSERT separadas, especialmente cuando trabajamos con grandes volúmenes de datos.

Manejo de valores NULL y predeterminados

Las columnas pueden tener diferentes comportamientos cuando no especificamos un valor:

-- Insertar con algunos valores NULL explícitos
INSERT INTO empleados (nombre, apellido, edad, departamento)
VALUES ('Pedro', 'Sánchez', NULL, 'Recursos Humanos');

-- Omitir columnas opcionales (usará valores predeterminados)
INSERT INTO empleados (nombre, apellido)
VALUES ('Sofía', 'Torres');

Si una columna tiene un valor predeterminado definido, se aplicará automáticamente cuando no proporcionemos un valor específico.

Inserción desde otra tabla

Una funcionalidad avanzada permite insertar datos provenientes de consultas SELECT:

-- Crear una tabla temporal de empleados senior
INSERT INTO empleados_senior (nombre, apellido, edad, departamento)
SELECT nombre, apellido, edad, departamento
FROM empleados
WHERE edad >= 30;

Esta técnica es especialmente útil para migrar datos, crear copias filtradas de información, o generar reportes que requieran persistencia.

Consideraciones importantes

Al trabajar con INSERT, debemos tener en cuenta varias restricciones y validaciones:

  • Los tipos de datos deben coincidir entre los valores y las columnas
  • Las restricciones de clave primaria impiden insertar valores duplicados
  • Las restricciones de clave foránea requieren que los valores existan en las tablas referenciadas
  • Las restricciones NOT NULL obligan a proporcionar un valor para esas columnas
-- Ejemplo con manejo de restricciones
INSERT INTO pedidos (cliente_id, producto_id, cantidad, fecha)
VALUES (15, 204, 2, '2024-01-15');
-- cliente_id debe existir en la tabla clientes
-- producto_id debe existir en la tabla productos

UPDATE

La instrucción UPDATE es la herramienta esencial para modificar registros existentes en nuestras tablas. A diferencia de INSERT, que crea nuevos registros, UPDATE nos permite cambiar valores específicos en filas que ya existen en la base de datos.

Sintaxis básica de UPDATE

La estructura fundamental de UPDATE sigue un patrón claro y directo:

UPDATE nombre_tabla
SET columna1 = nuevo_valor1, columna2 = nuevo_valor2
WHERE condición;

Consideremos un ejemplo práctico con nuestra tabla de empleados:

-- Actualizar el departamento de un empleado específico
UPDATE empleados
SET departamento = 'Desarrollo'
WHERE id = 5;

Este comando modifica únicamente el registro del empleado con ID 5, cambiando su departamento a 'Desarrollo'.

Actualización de múltiples columnas

Una de las ventajas del UPDATE es su capacidad para modificar varias columnas simultáneamente en una sola operación:

-- Promocionar un empleado: cambiar cargo y salario
UPDATE empleados
SET departamento = 'Gerencia',
    salario = 45000,
    fecha_promocion = '2024-02-01'
WHERE nombre = 'Juan' AND apellido = 'García';

Esta aproximación es mucho más eficiente que realizar múltiples UPDATE individuales para cada columna.

Actualización con cálculos

UPDATE permite realizar operaciones matemáticas directamente sobre los valores existentes:

-- Aplicar un aumento salarial del 10% a todo el departamento de Ventas
UPDATE empleados
SET salario = salario * 1.10
WHERE departamento = 'Ventas';

-- Incrementar la edad de todos los empleados en 1 año
UPDATE empleados
SET edad = edad + 1;

Estas operaciones son especialmente útiles para ajustes masivos como aumentos generales o actualizaciones periódicas.

Actualización con subconsultas

Una funcionalidad avanzada permite usar resultados de SELECT dentro de UPDATE:

-- Actualizar el salario basándose en el salario promedio del departamento
UPDATE empleados
SET salario = (
    SELECT AVG(salario) * 1.05
    FROM empleados AS e2
    WHERE e2.departamento = empleados.departamento
)
WHERE rendimiento = 'Excelente';

Esta técnica es útil para cálculos complejos que requieren información de múltiples registros o tablas.

UPDATE con JOIN

El SQL moderno permite actualizar tablas utilizando información de otras tablas mediante JOIN:

-- Actualizar información del empleado basándose en datos de otra tabla
UPDATE empleados
SET salario = departamentos.salario_base * 1.2
FROM empleados
INNER JOIN departamentos ON empleados.departamento_id = departamentos.id
WHERE empleados.experiencia > 5;

Esta sintaxis es especialmente valiosa para sincronizar datos entre tablas relacionadas.

Actualización condicional con CASE

Para lógica compleja de actualización, podemos utilizar expresiones CASE:

-- Asignar bonificaciones según el rendimiento
UPDATE empleados
SET bonus = CASE
    WHEN rendimiento = 'Excelente' THEN salario * 0.15
    WHEN rendimiento = 'Bueno' THEN salario * 0.10
    WHEN rendimiento = 'Regular' THEN salario * 0.05
    ELSE 0
END
WHERE fecha_evaluacion >= '2024-01-01';

Esta aproximación permite diferentes tratamientos según las condiciones específicas de cada registro.

Consideraciones importantes de seguridad

La cláusula WHERE es crucial en UPDATE. Sin ella, se modificarán todos los registros de la tabla:

-- ¡PELIGRO! Esto actualizará TODOS los empleados
UPDATE empleados
SET departamento = 'Desarrollo';

-- CORRECTO: Actualizar solo empleados específicos
UPDATE empleados
SET departamento = 'Desarrollo'
WHERE id IN (1, 3, 7);

Verificación antes de actualizar

Una buena práctica es verificar los datos antes de realizar la actualización:

-- Primero, verificar qué registros se van a actualizar
SELECT nombre, apellido, salario, salario * 1.10 AS nuevo_salario
FROM empleados
WHERE departamento = 'Marketing';

-- Después, realizar la actualización
UPDATE empleados
SET salario = salario * 1.10
WHERE departamento = 'Marketing';

Actualización con límites

Algunos sistemas permiten limitar el número de registros a actualizar:

-- Actualizar solo los primeros 10 empleados más jóvenes
UPDATE empleados
SET estado = 'En revisión'
WHERE edad < 30
ORDER BY edad
LIMIT 10;

DELETE

La instrucción DELETE es la herramienta que nos permite eliminar registros específicos de nuestras tablas de forma permanente. A diferencia de INSERT que añade datos y UPDATE que los modifica, DELETE los retira completamente de la base de datos.

Sintaxis básica de DELETE

La estructura fundamental de DELETE es directa pero requiere especial atención:

DELETE FROM nombre_tabla
WHERE condición;

Veamos un ejemplo práctico con nuestra tabla de empleados:

-- Eliminar un empleado específico que ya no trabaja en la empresa
DELETE FROM empleados
WHERE id = 10;

Esta instrucción elimina permanentemente el registro del empleado con ID 10 de la tabla.

La importancia crítica de WHERE

La cláusula WHERE es absolutamente esencial en DELETE. Sin ella, eliminaríamos todos los registros de la tabla:

-- ¡PELIGRO! Esto eliminará TODOS los empleados
DELETE FROM empleados;

-- CORRECTO: Eliminar solo empleados específicos
DELETE FROM empleados
WHERE fecha_baja IS NOT NULL;

Esta diferencia puede ser devastadora para una base de datos en producción. Una buena práctica es siempre verificar la condición antes de ejecutar el DELETE.

Verificación antes de eliminar

Antes de ejecutar cualquier DELETE, es recomendable confirmar qué registros se van a eliminar:

-- Primero, verificar qué empleados se eliminarán
SELECT id, nombre, apellido, fecha_baja
FROM empleados
WHERE fecha_baja < '2023-01-01';

-- Después, realizar la eliminación
DELETE FROM empleados
WHERE fecha_baja < '2023-01-01';

Esta aproximación nos permite validar que estamos eliminando exactamente los registros correctos.

DELETE con condiciones complejas

Podemos utilizar múltiples condiciones para ser más precisos en nuestras eliminaciones:

-- Eliminar empleados temporales que no han trabajado en el último año
DELETE FROM empleados
WHERE tipo_contrato = 'Temporal'
  AND ultima_actividad < DATEADD(year, -1, GETDATE())
  AND estado = 'Inactivo';

También podemos usar subconsultas para condiciones más sofisticadas:

-- Eliminar pedidos de clientes que han cancelado su cuenta
DELETE FROM pedidos
WHERE cliente_id IN (
    SELECT id
    FROM clientes
    WHERE estado = 'Cancelado'
    AND fecha_cancelacion < '2024-01-01'
);

DELETE con JOIN

Algunos sistemas de bases de datos permiten eliminar registros utilizando información de otras tablas mediante JOIN:

-- Eliminar empleados de departamentos que han cerrado
DELETE empleados
FROM empleados
INNER JOIN departamentos ON empleados.departamento_id = departamentos.id
WHERE departamentos.estado = 'Cerrado';

Esta sintaxis es especialmente útil cuando necesitamos eliminar basándose en relaciones entre múltiples tablas.

Limitación del número de eliminaciones

Para operaciones de limpieza gradual, algunos sistemas permiten limitar el número de registros eliminados:

-- Eliminar solo los primeros 100 registros antiguos
DELETE FROM logs
WHERE fecha < DATEADD(month, -6, GETDATE())
ORDER BY fecha
LIMIT 100;

Esta aproximación es útil para evitar bloqueos prolongados en tablas grandes durante operaciones de mantenimiento.

Consideraciones de rendimiento y seguridad

DELETE puede ser una operación costosa en tablas grandes. Algunas estrategias para mejorar el rendimiento incluyen:

  • Eliminar en lotes pequeños para evitar bloqueos prolongados
  • Usar índices en las columnas de la cláusula WHERE
  • Ejecutar durante horas de menor actividad para minimizar el impacto
-- Eliminación por lotes para mejor rendimiento
DELETE TOP (1000) FROM auditoria
WHERE fecha < DATEADD(year, -2, GETDATE());
-- Repetir hasta eliminar todos los registros necesarios

Soft Delete: una alternativa práctica

En lugar de eliminar permanentemente, muchas aplicaciones implementan "eliminación lógica" o soft delete:

-- En lugar de DELETE, marcar como eliminado
UPDATE empleados
SET eliminado = 1, fecha_eliminacion = GETDATE()
WHERE id = 15;

-- Las consultas normales ignoran registros eliminados
SELECT nombre, apellido, departamento
FROM empleados
WHERE eliminado = 0 OR eliminado IS NULL;

Esta técnica permite recuperar datos si es necesario y mantiene la integridad referencial.

Transacciones y DELETE

Para operaciones críticas, es recomendable usar transacciones:

BEGIN TRANSACTION;

-- Verificar cuántos registros se van a eliminar
SELECT COUNT(*) as registros_a_eliminar
FROM productos
WHERE stock = 0 AND ultima_venta < '2023-01-01';

-- Realizar la eliminación
DELETE FROM productos
WHERE stock = 0 AND ultima_venta < '2023-01-01';

-- Confirmar si todo está correcto, o deshacer si no
-- COMMIT; o ROLLBACK;

DELETE vs TRUNCATE

Para eliminar todos los registros de una tabla, existe una alternativa más eficiente:

-- DELETE elimina fila por fila (más lento, permite WHERE)
DELETE FROM tabla_temporal;

-- TRUNCATE elimina todos los datos de una vez (más rápido)
TRUNCATE TABLE tabla_temporal;

TRUNCATE es mucho más rápido pero no permite condiciones WHERE y resetea contadores de identidad.

Fuentes y referencias

Documentación oficial y recursos externos para profundizar en SQL

Documentación oficial de SQL
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, SQL es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de SQL

Explora más contenido relacionado con SQL y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

  • Comprender la sintaxis y uso básico de INSERT para añadir registros.
  • Aprender a actualizar registros existentes con UPDATE, incluyendo operaciones avanzadas.
  • Conocer cómo eliminar registros con DELETE de forma segura y eficiente.
  • Identificar buenas prácticas y precauciones para evitar errores comunes en modificaciones.
  • Explorar técnicas avanzadas como inserciones desde SELECT, actualizaciones con JOIN y eliminación lógica (soft delete).