Listado completo de tutoriales

81 - Borrar registros buscando coincidencias en otras tablas (delete - join)


Tenemos la tabla "libros" en la cual almacenamos los datos de los libros de nuestra biblioteca y la tabla "editoriales" que almacena el nombre de las distintas editoriales y sus códigos.

La tabla "libros" tiene la siguiente estructura:

 -codigo: int unsigned auto_increment,
 -titulo: varchar(30),
 -autor: varchar(30),
 -codigoeditorial: tinyint unsigned,
 -clave primaria: codigo.

La tabla "editoriales" tiene esta estructura:

 -codigo: tinyint unsigned auto_increment,
 -nombre: varchar(20),
 -clave primaria: codigo.

Ambas tablas contienen registros.

Queremos eliminar todos los libros cuyo código de editorial no exista en la tabla "editoriales".

Podemos hacerlo en 2 pasos:

1º paso: realizamos un left join para ver qué "codigoeditorial" en "libros" no existe en "editoriales":

 select l.* from libros as l
  left join editoriales as e
  on l.codigoeditorial=e.codigo
  where e.codigo is null;

recordamos el valor de los códigos de libro devueltos (valor 5) o lo almacenamos en una variable.

2º paso: borramos todos los libros mostrados en la consulta anterior (uno solo, con código 5):

 delete libros
  where codigo=5;

O podemos realizar la eliminción en el mismo momento que realizamos el "left join":

delete libros
  FROM libros
  left join editoriales
  on libros.codigoeditorial=editoriales.codigo
  where editoriales.codigo is null;

Es decir, usamos "delete" junto al nombre de la tabla de la cual queremos eliminar registros, luego realizamos el "left join" correspondiente nombrando las tablas involucradas y agregamos la condición "where" para que seleccione solamente los libros cuyo código de editorial no se encuentre en "editoriales".

Ahora queremos eliminar todas las editoriales de las cuales no haya libros:

 delete editoriales
  from editoriales
  left join libros
  on libros.codigoeditorial=editoriales.codigo
  where libros.codigo is null;

Servidor de MySQL instalado en forma local.

Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones SQL:

 drop table if exists libros, editoriales;

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40),
  autor varchar(30),
  codigoeditorial tinyint unsigned,
  primary key(codigo)
 );

 create table editoriales(
  codigo tinyint unsigned auto_increment,
  nombre varchar(20),
  primary key(codigo)
 );

 insert into editoriales values(1,'Planeta');
 insert into editoriales values(2,'Emece');
 insert into editoriales values(3,'Paidos');
 insert into editoriales values(4,'Plaza & Janes');

 insert into libros values (1,'El aleph','Borges',2);
 insert into libros values (2,'Alicia en el pais de las maravillas','Lewis Carroll',1);
 insert into libros values (3,'Matematica estas ahi','Paenza',2);
 insert into libros values (4,'Martin Fierro','Jose Hernandez',3);
 insert into libros values (5,'Martin Fierro','Jose Hernandez',2);
 insert into libros values (6,'Aprenda PHP','Mario Molina',9);

 -- Queremos eliminar todos los libros cuyo código de editorial no exista
 -- en la tabla "editoriales".
 delete libros
  from libros
  left join editoriales
  on libros.codigoeditorial=editoriales.codigo
  where editoriales.codigo is null;

 select * from libros;

 -- Eliminemos todas las editoriales de las cuales no haya libros:
 delete editoriales
  from editoriales
  left join libros
  on libros.codigoeditorial=editoriales.codigo
  where libros.codigo is null;

 select * from editoriales;

Genera una salida similar a esta:

MySQL delete join

Retornar