El comando DELETE en SQL se utiliza para eliminar registros (filas) de una tabla. Es una sentencia de manipulación de datos (DML) y forma parte de las operaciones básicas junto con INSERT, UPDATE y SELECT.
Aunque su sintaxis es simple, DELETE debe usarse con mucho cuidado: un mal uso puede ocasionar la pérdida masiva de datos. Por eso, es esencial conocer bien su funcionamiento, sus variantes y las mejores prácticas para aplicarlo en entornos reales.
Sintaxis básica de DELETE
DELETE FROM nombre_tabla
WHERE condición;
- nombre_tabla: la tabla de donde se eliminarán las filas.
- condición: especifica qué filas borrar. Si no se incluye, se borran todas las filas de la tabla (WHERE).
Ejemplos prácticos de DELETE
1. Eliminar un registro específico
DELETE FROM clientes
WHERE id = 10;
👉 Elimina al cliente cuyo id sea 10.
2. Eliminar múltiples registros con condición
DELETE FROM pedidos
WHERE estado = 'Cancelado';
👉 Borra todos los pedidos cuyo estado esté marcado como Cancelado.
3. Eliminar filas en un rango
DELETE FROM productos
WHERE precio BETWEEN 0 AND 5;
👉 Elimina todos los productos con precio entre 0 y 5 (inclusive). Ejemplo con BETWEEN.
4. Eliminar con múltiples condiciones
DELETE FROM empleados
WHERE departamento = 'Ventas' AND antiguedad < 1;
👉 Borra empleados del área de Ventas con menos de un año de antigüedad. Uso de operadores lógicos como AND / OR.
5. Eliminar todos los registros de una tabla
DELETE FROM usuarios;
👉 Elimina todas las filas de la tabla usuarios, pero la estructura de la tabla permanece. La estructura permanece, a diferencia de DROP TABLE.
6. Eliminar registros usando subconsultas
DELETE FROM pedidos
WHERE cliente_id IN (
SELECT id FROM clientes WHERE inactivo = 1
);
👉 Borra pedidos asociados a clientes marcados como inactivos. Ejemplo con subconsulta.
DELETE vs TRUNCATE vs DROP
Aunque los tres comandos eliminan datos, hay diferencias importantes:
- DELETE:
- Borra filas de una tabla.
- Permite usar
WHERE. - Se puede deshacer (rollback) si se usa dentro de una transacción.
- Más lento en tablas grandes, porque elimina fila por fila.
- TRUNCATE:
- Elimina todas las filas rápidamente.
- No permite
WHERE. - Generalmente no se puede deshacer.
- DROP:
- Elimina la tabla completa, incluyendo su estructura.
👉 Regla práctica:
- Usá
DELETEsi querés borrar registros específicos. - Usá
TRUNCATEsi querés vaciar toda la tabla. - Usá
DROPsi ya no necesitás la tabla.
Uso de DELETE con transacciones
En bases de datos que soportan transacciones (PostgreSQL, SQL Server, Oracle, MySQL InnoDB), es recomendable envolver DELETE en una transacción para evitar errores irreversibles.
BEGIN;
DELETE FROM empleados
WHERE departamento = 'RRHH';
-- Revisar resultados
ROLLBACK; -- Deshace la eliminación
-- o
COMMIT; -- Confirma los cambios
👉 Esto permite revisar los cambios antes de confirmarlos definitivamente.
Errores comunes con DELETE
- Olvidar el WHERE
DELETE FROM clientes;👉 Elimina todos los clientes. Este es el error más frecuente y peligroso. - Confundir DELETE con DROP/TRUNCATE
DELETEelimina filas.DROPelimina toda la tabla.TRUNCATEelimina todas las filas sinWHERE.
- No usar transacciones en entornos de producción.
- Eliminar en cascada sin prever consecuencias
- Si la tabla tiene FOREIGN KEY con ON DELETE CASCADE, al borrar una fila se eliminan automáticamente registros relacionados en otras tablas.
- Problemas de performance en tablas grandes:
DELETEfila por fila puede ser lento.
Buenas prácticas con DELETE
- Siempre usar WHERE para evitar eliminaciones masivas accidentales.
- Probar primero con SELECT:
SELECT * FROM empleados WHERE departamento = 'Ventas';y luego aplicar el DELETE con la misma condición. - Usar LIMIT en motores que lo soportan (ej. MySQL) para eliminar de a bloques:
DELETE FROM logs ORDER BY fecha ASC LIMIT 1000; - Respaldar datos importantes antes de operaciones masivas.
- Documentar y versionar scripts SQL, especialmente los que eliminan datos.
- En bases con relaciones, conocer si hay ON DELETE CASCADE para no borrar de más.
Ejemplo avanzado: limpieza de registros antiguos
DELETE FROM transacciones
WHERE fecha < '2024-01-01'
AND estado = 'Finalizado';
👉 Borra todas las transacciones finalizadas antes de 2024, liberando espacio en la base de datos.
Preguntas frecuentes (FAQ)
1. ¿DELETE elimina la tabla completa?
No. Solo borra las filas. La estructura de la tabla permanece.
2. ¿Qué pasa si uso DELETE sin WHERE?
Se eliminan todas las filas de la tabla, aunque la tabla sigue existiendo.
3. ¿DELETE es reversible?
Solo si se ejecuta dentro de una transacción que aún no se haya confirmado con COMMIT.
4. ¿Qué diferencia hay entre DELETE y TRUNCATE?
DELETE: puede filtrar conWHERE, es más lento pero flexible.TRUNCATE: borra todo de una vez, sinWHERE.
5. ¿DELETE afecta índices y triggers?
Sí. Se actualizan los índices de la tabla y se disparan los triggers definidos sobre la operación DELETE.
Conclusión
El comando DELETE en SQL es fundamental para la gestión de datos: permite eliminar registros específicos o conjuntos de filas que ya no son necesarios. Sin embargo, es una herramienta poderosa que debe usarse con precaución, especialmente en entornos de producción.
Dominar DELETE, junto con las diferencias frente a TRUNCATE y DROP, es clave para administrar bases de datos de manera segura y eficiente.
Repasa operaciones de borrado seguro en INSERT, UPDATE y DELETE y explora el Glosario SQL completo.