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