DELETE en SQL: qué es, cómo se usa y ejemplos prácticos

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á DELETE si querés borrar registros específicos.
  • Usá TRUNCATE si querés vaciar toda la tabla.
  • Usá DROP si 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

  1. Olvidar el WHERE DELETE FROM clientes; 👉 Elimina todos los clientes. Este es el error más frecuente y peligroso.
  2. Confundir DELETE con DROP/TRUNCATE
    • DELETE elimina filas.
    • DROP elimina toda la tabla.
    • TRUNCATE elimina todas las filas sin WHERE.
  3. No usar transacciones en entornos de producción.
  4. 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.
  5. Problemas de performance en tablas grandes: DELETE fila 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 con WHERE, es más lento pero flexible.
  • TRUNCATE: borra todo de una vez, sin WHERE.

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.

Scroll al inicio