Ir al contenido principal

SQL DELETE: Cómo eliminar datos de forma segura

Comprender cómo utilizar SQL DELETE para eliminar registros de una tabla. Aprende la sintaxis clave, los flujos de trabajo de seguridad y las técnicas de optimización para manejar grandes conjuntos de datos.
Actualizado 12 ene 2026  · 9 min leer

Eliminar datos es una operación potencialmente arriesgada en SQL. Un solo comando mal escrito puede alterar las relaciones entre tablas o incluso borrar todo un conjunto de datos.

En este tutorial, te mostraré cómo funciona la instrucción « DELETE », cómo utilizarla correctamente y cómo evitar errores comunes, como borrar todo un conjunto de datos, como acabo de mencionar. 

Si eres nuevo en SQL, comienza con nuestro curso Introducción a SQL o, si ya tienes algo de experiencia, con nuestro curso SQL intermedio

¿Qué hace DELETE en SQL?

Antes de analizar la sintaxis, es importante comprender qué hace realmente la instrucción ` DELETE `. A continuación se indican las diferentes distinciones que existen a la hora de eliminar datos en SQL.

SQL DELETE frente a eliminar filas conceptualmente

La instrucción « DELETE » elimina una o varias filas de una tabla conservando la estructura de la tabla. Por lo tanto, el esquema de la tabla, que incluye los nombres de las columnas, los tipos de datos, los índices y las restricciones, permanece intacto. Después de la eliminación, la tabla sigue existiendo y está lista para aceptar nuevos datos.

Piensa en ello como borrar entradas de un libro de contabilidad, no como arrancar las páginas. El esquema permanece igual; solo se eliminan los registros seleccionados.

SQL DELETE frente a. DROP frente a TRUNCAR

Aunque DELETE, DROP y TRUNCATE eliminan datos de alguna forma, tienenfines muy diferentes. La siguiente tabla resume el uso de cada instrucción:

Características

DELETE

TRUNCAR

DROP

Tipo de comando

DML (Lenguaje de manipulación de datos)

DDL (Lenguaje de definición de datos)

DDL (Lenguaje de definición de datos)

Ámbito de aplicación

Elimina filas específicas (utilizando una cláusul WHERE ).

Elimina todas las filas de una tabla.

Elimina toda la tabla y sus datos.

Velocidad

Más lento (elimina fila por fila)

Más rápido (desasigna páginas)

Instantáneo

Reversibilidad

Se puede revertir

No reversible

No reversible.

Estructura de la tabla

Conservado

Conservado (y restablece los ID)

Eliminado por completo

Sintaxis básica de SQL DELETE

Ahora que ya entiendes cómo funciona la instrucción ` DELETE `, veamos su sintaxis y cómo aplicarla. 

Eliminación de filas específicas con WHERE

La cláusula ` WHERE ` define el ámbito de una operación ` DELETE `. La cláusula « WHERE » siempre es necesaria, ya que indica a la base de datos exactamente qué filas deben eliminarse.

-- Basic DELETE syntax
DELETE FROM table_name
WHERE condition;

Eliminar todas las filas de una tabla

Si omites la cláusula « WHERE » en la instrucción « DELETE », SQL asume que deseas seleccionar todas las filas de la tabla. Si lo haces accidentalmente, el motor de la base de datos revisará cada uno de los registros y los eliminará. Por cada fila eliminada, se realiza una entrada en el registro de transacciones. Si tienes millones de filas, esto puede ser muy lento y hacer que tus archivos de registro se saturen.

Prácticas seguras de SQL DELETE

Dado que una operación de « DELETE » puede ser permanente, implementar prácticas de eliminación seguras te ayudará a reducir la velocidad, verificar la intención y planificar cómo recuperarte si algo sale mal.

Vista previa de las filas antes de eliminarlas

Antes de ejecutar una instrucción ` DELETE `, siempre previsualiza las filas que vas a eliminar utilizando una instrucción ` SELECT ` con la misma condición ` WHERE ` que planeas utilizar en tu ` DELETE`. Si la instrucción « SELECT » devuelve demasiadas filas o filas incorrectas, puedes corregir la condición antes de que se produzca ningún daño. 

Por ejemplo, la consulta siguiente comprueba si hay filas con pedidos cancelados antes del 2023-01-01 y, a continuación, utiliza los mismos filtros para eliminar estos registros.

-- Step 1: Preview the targets
SELECT * FROM Orders 
WHERE Status = 'Cancelled' AND OrderDate < '2023-01-01';

-- Step 2: Once you've verified the list, convert to DELETE
DELETE FROM Orders 
WHERE Status = 'Cancelled' AND OrderDate < '2023-01-01';

Uso de transacciones y reversiones

Si envuelves la operación DELETE dentro de una transacción, esto te permite ejecutar un comando, ver cuántas filas se han visto afectadas y, a continuación, decidir si deseas que el cambio sea permanente o deshacerlo por completo. A continuación, puedes utilizar la herramienta de restauración de datos ( ROLLBACK ) para restaurar los datos a su estado anterior.

La consulta siguiente elimina temporalmente las filas que cumplen los requisitos y, a continuación, las restaura, lo que te permite confirmar el impacto sin perder datos.

BEGIN TRANSACTION;

DELETE FROM Users
WHERE LastLogin < '2020-01-01';

-- Inspect the affected row count
ROLLBACK;

A continuación, puedes utilizar la siguiente consulta para eliminar de forma permanente a los usuarios que iniciaron sesión por última vez antes del 1 de enero de 2020.

BEGIN TRANSACTION;

DELETE FROM Users
WHERE LastLogin < '2020-01-01';

-- Confirm deletion of the required rows
COMMIT;

Sin embargo, debes tener en cuenta que la función « ROLLBACK » solo es posible si aún no has confirmado la transacción.

SQL DELETE con uniones y subconsultas

En las bases de datos del mundo real, los datos rara vez existen de forma aislada. En la mayoría de los casos, es posible que tengas que eliminar filas basándote en valores almacenados en otras tablas, cuentas caducadas, registros huérfanos o entidades relacionadas que ya no sean aplicables.

Eliminación de filas basadas en otra tabla

El uso de subconsultas es el método más portátil y ampliamente compatible para eliminar filas basándose en otra tabla. Funcionan en casi todas las versiones de SQL. Por ejemplo, la consulta siguiente elimina los usuarios inactivos de la tabla Users que tienen cuentas desactivadas de la tabla Accounts.

-- Delete users whose accounts have been deactivated
DELETE FROM Users
WHERE AccountId IN (
    SELECT AccountId
    FROM Accounts
    WHERE Status = 'DEACTIVATED'
);

También puedes utilizar las uniones para eliminar filas de una base de datos, pero la sintaxis varía según la base de datos, como veremos en la siguiente sección.

Sintaxis DELETE específica de la base de datos

Aunque la idea de la instrucción « DELETE » es la misma en SQL, las distintas bases de datos tienen una sintaxis diferente cuando se utiliza « JOIN » para eliminar filas de una tabla basándose en otra.

SQL Server coloca la tabla de destino después de la instrucción « DELETE » y, a continuación, realiza la unión en « FROM ». En el ejemplo siguiente, el alias después de DELETE (u) especifica qué tabla se va a eliminar.

-- SQL Server: Delete users linked to deactivated accounts
DELETE u
FROM Users u
JOIN Accounts a
  ON u.AccountId = a.AccountId
WHERE a.Status = 'DEACTIVATED';

En PostgreSQL, el controlador de eventos ( USING ) actúa como un controlador de eventos ( JOIN). Solo se eliminan las filas de la tabla de destino (Users).

-- PostgreSQL: Delete users linked to deactivated accounts
DELETE FROM Users
USING Accounts
WHERE Users.AccountId = Accounts.AccountId
  AND Accounts.Status = 'DEACTIVATED';

MySQL permite eliminaciones de varias tablas, pero requiere que se especifiquen los nombres de las tablas. Debes colocar la tabla que deseas eliminar antes de la cláusula « FROM ».

-- MySQL: Delete users linked to deactivated accounts
DELETE u
FROM Users u
JOIN Accounts a
  ON u.AccountId = a.AccountId
WHERE a.Status = 'DEACTIVATED';

Recomiendo realizar nuestro curso Joining Data in SQL (Unión de datos enSQL) para aprenderlos diferentes tipos de uniones en SQL y cómo trabajar con diferentes tablas relacionadas en la base de datos.

SQL DELETE e integridad referencial

Como ya sabemos, las tablas rara vez existen de forma aislada en una base de datos relacional. A menudo se vinculan entre sí mediante claves externas. Debido a estos vínculos, eliminar una fila en una tabla puede tener consecuencias no deseadas.

Errores de claves externas y restricciones

Cuando una tabla es referenciadapor una clave externa, la base de datosaplica reglas sobre lo que sucede cuando intentas eliminar una fila principal. De forma predeterminada, la mayoría de las bases de datos impiden la eliminación si aún existen filas relacionadas en una tabla secundaria.

Por ejemplo, si tienes una tabla Orders que hace referencia a la tabla Customers, al eliminar un cliente que aún tiene pedidos se producirá un error de restricción. Esto evita que la base de datos contenga registros huérfanos que ya no tienen un padre válido.

Eliminación en cascada

Si deseas eliminar datos relacionados automáticamente, debes definir explícitamente una regla en cascada que indique a la base de datos cómo manejar los datos relacionados. ON DELETE CASCADE indica a la base de datos que elimine automáticamente las filas secundarias relacionadas cuando se elimina una fila principal.

Por ejemplo, la consulta siguiente indica a la base de datos que elimine automáticamente todas las filas de la tabla Orders que hacen referencia a un cliente cuando ese cliente se elimina de la tabla Customers.

-- Parent table
CREATE TABLE Customers (
    CustomerId INT PRIMARY KEY,
    Name VARCHAR(100)
);

-- Child table with a cascading foreign key
CREATE TABLE Orders (
    OrderId INT PRIMARY KEY,
    CustomerId INT,
    OrderDate DATE,
    CONSTRAINT fk_orders_customers
        FOREIGN KEY (CustomerId)
        REFERENCES Customers(CustomerId)
        ON DELETE CASCADE
);

La ventaja de este enfoque es que mantiene limpia la base de datos sin necesidad de realizar múltiples sentencias manuales « DELETE ». Sin embargo, debes utilizar la instrucción con precaución, ya que una sola eliminación puede desencadenar una reacción en cadena en varias tablas, eliminando muchos más datos de los esperados. Por ejemplo, puedes eliminar una fila de una tabla Departments y borrar accidentalmente 500 filas de una tabla Employees.

Consideraciones sobre el rendimiento al eliminar datos

Al utilizar la instrucción « DELETE », notarás que eliminar unas pocas filas es instantáneo, pero lento si tienes millones de filas. Ten en cuenta las siguientes prácticas recomendadas para eliminar registros de forma segura:

DELETE vs. TRUNCATE para tablas grandes

Como vimos anteriormente, DELETE y TRUNCATE eliminan registros de las siguientes maneras:

  • DELETE: Recorre todas las filas, comprueba si cumplen los criterios, las elimina y registra el cambio en el registro de transacciones. Esto consume muchos recursos y es lento para conjuntos de datos masivos. Permite filtrar con una cláusula « WHERE » y admite la reversión.

  • TRUNCATE: Elimina todas las filas de una sola veze con un registro mínimo. Es significativamente más rápido, pero no se puede filtrar, normalmente no se puede revertir y está bloqueado por restricciones de claves externas.

Eliminación por lotes y operaciones de larga duración

Si eliminas millones de filas en una sola instrucción, podrías ralentizar considerablemente toda la aplicación e incluso provocar un fallo en la base de datos si no se gestiona correctamente. Para reducir este riesgo, elimina siempre los conjuntos de datos grandes por lotes.

Las eliminaciones por lotes eliminan un número limitado de filas a la vez, por ejemplo, unos pocos miles por operación. Esto permite que la base de datos siga siendo receptiva y fácil de supervisar. Si algo sale mal, puedes detener el proceso sin tener que revertir una transacción enorme.

Errores comunes en SQL DELETE

A continuación se enumeran los errores más comunes que debes tener en cuenta al utilizar la instrucción DELETE para eliminar filas de tus tablas:

Olvidando la cláusula WHERE

Olvidar la cláusula « WHERE » es el error más común al utilizar « DELETE ». Sin él, la instrucción elimina todas las filas de la tabla. Asegúrate siempre de utilizar la cláusula « WHERE » para especificar las filas que deseas eliminar. Como medida preventiva, utiliza el hábito « SELECT-before-DELETE » (comprueba antes de borrar) que hemos comentado anteriormente para ver las filas antes de eliminarlas.

Suponiendo que DELETE es reversible

Otro error común es pensar que los datos eliminados siempre se pueden recuperar. Debes tener en cuenta que, de forma predeterminada, la instrucción « DELETE », una vez confirmada, marca los datos como eliminados físicamente del disco, a menos que tengas copias de seguridad, réplicas o registros de auditoría.

Solo puedes «deshacer» un comando « DELETE » si:

  • Se ejecuta dentro de una transacción.
  • La transacción no se ha confirmado.
  • La base de datos y el motor de almacenamiento admiten la reversión.

SQL DELETE en entornos de producción

En los sistemas de producción, la operación « DELETE » tiene más que ver con el control, la visibilidad y la responsabilidad que con la sintaxis. En este tipo de entornos, el objetivo no es solo eliminar datos, sino hacerlo de forma segura y deliberada.

Control de acceso y permisos

En un entorno profesional, la capacidad de eliminar datos debe seguir el principio del mínimo privilegio. No todos los usuarios ni todas las cuentas de servicio de aplicaciones deben tener permisos de DELETE

A la mayoría de los usuarios con permisos de «solo lectura» o herramientas de generación de informes se les debe denegar explícitamente este derecho. La mayoría de las empresas suelen exigir una «revisión por pares», en la que una segunda persona debe verificar la cláusula « WHERE » (no borrar nunca nada) de un script de eliminación manual antes de que se ejecute en producción.

Te recomiendo que pruebes el programa de habilidades SQL Server para administradores de bases de datos sidiseñas o mantienes bases de datos de forma habitual como parte de tu trabajo. 

Auditoría y eliminaciones temporales

Muchos sistemas de producción evitan las eliminaciones definitivas debido a los riesgos que conllevan. En su lugar, utilizan eliminaciones temporales, en las que una fila se marca como eliminada. Por ejemplo, puedes utilizar una marca de tiempo « deleted_at » o un indicador « is_deleted » en lugar de eliminar físicamente un registro.

Las eliminaciones temporales facilitan la recuperación, permiten realizar auditorías y conservan los datos históricos con fines de depuración y cumplimiento normativo.

Conclusión

La conclusión más importante es la siguiente: Define siempre una cláusula WHERE clara, previsualiza las filas afectadas con SELECT y utiliza transacciones siempre que sea posible. En los sistemas de producción, cada eliminación debe ser deliberada y auditable. Trata DELETE con el mismo cuidado que le darías a un cambio de esquema o a una implementación, y seguirá siendo una herramienta útil en lugar de un error costoso.

Te recomiendo que realices nuestrocurso de Diseño de bases de datos, en el que aprenderás a crear y gestionar bases de datos, así como a seleccionar el sistema de gestión de bases de datos (DBMS) más adecuado a tus necesidades. También recomiendo probar nuestroprograma de formación para ingenieros de datos asociados en SQLpara aprender los fundamentos de la ingeniería de datos y el almacenamiento de datos. 

Obtén una Certificación Top SQL

Demuestra tus conocimientos básicos de SQL y avanza en tu carrera de datos.
Certifícate en SQL

Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Creo artículos que simplifican la ciencia de los datos y la analítica, haciéndolos fáciles de entender y accesibles.

Preguntas frecuentes sobre SQL DELETE

¿En qué se diferencia DELETE de TRUNCATE o DROP?

DELETE elimina las filas seleccionadas, TRUNCATE elimina todas las filas rápidamente y DROP elimina la tabla en sí.

¿Por qué es importante la cláusula WHERE en DELETE?

Sin la cláusula « WHERE », « DELETE » elimina todas las filas, con el riesgo de perder todos los datos.

¿Por qué fallan algunas operaciones DELETE?

Las restricciones de clave externa impiden la eliminación si existen filas secundarias dependientes sin reglas en cascada.

¿Cómo puedes previsualizar de forma segura lo que se va a eliminar?

Utiliza una instrucción « SELECT » con la misma condición « WHERE » para inspeccionar primero las filas afectadas antes de eliminarlas.

¿Cómo puedes eliminar conjuntos de datos grandes de forma segura?

Utiliza eliminaciones por lotes para eliminar filas en bloques, a fin de evitar transacciones de larga duración y problemas de rendimiento.

Temas

Aprende SQL con DataCamp

Curso

Manipulación de datos en SQL

4 h
303.1K
Domina las consultas SQL para responder a preguntas de ciencia de datos y prepara conjuntos de datos para analizarlos en PostgreSQL.
Ver detallesRight Arrow
Iniciar curso
Ver másRight Arrow