MYSQL – Borrar registros desde un select

Uno de los escenarios que con frecuencia se nos presenta cuando estamos trabajando en MySql es la necesidad de borrar un conjunto de registros a partir del resultado de un select.  Es precisamente por esta razón que he redactado esta breve entrada que puede ser muy útil para quienes se están iniciando en el lenguaje SQL de MySql.

La documentación de MySql sobre la sentencia Delete nos dice que para borrar registros desde múltiples tablas debemos seguir la siguiente sintaxis:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
       tbl_name[.*] [, tbl_name[.*] ...]
       FROM table_references
       [WHERE where_definition]

Lo cual se ajusta a la vieja notación implícita de Join que desde mi muy particular punto de vista es poco clara. Así que usaré la notación explicita para ejemplificar como podemos realizar borrados de registros usando como filtro el resultado de una sentencia Select.

Supongamos el siguiente escenario: Tenemos una tabla que contiene a los empleados dados de baja en el último año y tenemos la tabla general de empleados. Recursos humanos nos solicita eliminar de la tabla general a todos aquellos que existen en la tabla de bajas:

Eso podría resolverse de la siguiente manera:

Delete 
  From Empleados
where clave in (Select clave from empleadosbaja)

Pero ello sería sumamente ineficiente pues por cada fila en la tabla Empleados se hará una comprobación sobre el total de filas de la tabla empleadosbaja desperdiciando así el uso de los índices existentes en ambas tablas.

Una mejor solución para realizar este borrado parte del armado de la consulta que nos devuelva a los empleados existentes en ambas tablas:

    Select clave
      from empleados empleados
Inner Join empleadosbaja baja
        on empleados.clave = baja.clave

Esta sentencia nos devolverá solo aquellos empleados existentes en ambas tablas que son precisamente los que buscamos eliminar de la tabla empleados. Así que una vez que tenemos definida la sentencia que nos devuelve el conjunto de registros a eliminar, creamos su correspondiente sentencia Delete:

    Delete empleados
      from empleados 
Inner Join empleadosbaja 
        on empleados.clave = empleadosbaja.clave

Esta sentencia eliminará todos aquellos empleados existentes en la tabla de empleadosbaja aprovechando los índices en ambas tablas, ganando con ello mejores tiempos de procesamiento y una mayor claridad en la sintaxis de nuestras sentencias SQL.

 

2 Comments

  1. Buenas tardes, estoy a prendiendo a programar en mysql con netbeans, si me pueden colaborar , tengo una base de datos llamada electores compuesta por tres tablas una llamada personas con ide_per como id, relacionada con dos tablas llamadas : hijos y conyuge, quiero que cuando elimine un registro de la tabla personas me elimine los datos que tengo relacionados en hijos y conyuge, me pueden decir como es el codigo para netbeans

1 Trackback / Pingback

  1. » MYSQL – Usar Joins en sentencias Update

Deja un comentario