62 - Varias tablas (join)


Problema:

Trabajamos con las tablas "libros" y editoriales" de una librería.

Elimine las tablas, si existen:

 drop table if exists libros, editoriales;

Cree las siguientes tablas:

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30) not null default 'Desconocido',
  codigoeditorial tinyint unsigned not null,
  precio decimal(5,2) unsigned,
  cantidad smallint unsigned default 0,
  primary key (codigo)
 );

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

Cargamos algunos registros en la tabla "editoriales":

 insert into editoriales (nombre) values('Paidos');
 insert into editoriales (nombre) values('Emece');
 insert into editoriales (nombre) values('Planeta'); 
 insert into editoriales (nombre) values('Sudamericana');

Cargamos algunos registros en la tabla "libros":

 insert into libros (titulo, autor,codigoeditorial,precio,cantidad)
  values('El Aleph','Borges',3,43.5,200);
 insert into libros (titulo, autor,codigoeditorial,precio,cantidad)
  values('Alicia en el pais de las maravillas','Lewis Carroll',2,33.5,100);
 insert into libros (titulo, autor,codigoeditorial,precio,cantidad)
  values('Aprenda PHP','Mario Perez',1,55.8,50);
 insert into libros (titulo, autor,codigoeditorial,precio,cantidad)
  values('Java en 10 minutos','Juan Lopez',1,88,150);
 insert into libros (titulo, autor,codigoeditorial,precio,cantidad)
  values('Alicia a traves del espejo','Lewis Carroll',1,15.5,80);
 insert into libros (titulo, autor,codigoeditorial,precio,cantidad)
  values('Cervantes y el quijote','Borges- Bioy Casares',3,25.5,300);

Mostramos todos los datos de la tabla "libros":

 select * from libros;

Queremos también el nombre de la editorial, necesitamos ambas tablas:

 select * from libros
  join editoriales
  on libros.codigoeditorial=editoriales.codigo;

Analicemos la consulta: indicamos el nombre de la tabla luego del "from" ("libros"), unimos esa tabla con "join" y el nombre de la otra tabla ("editoriales"), luego especificamos la condición para enlazarlas con "on", es decir, el campo por el cual haremos coincidir los registros de las dos tablas, el campo "codigoeditorial" de "libros" y el campo "codigo" de "editoriales" son los que enlazarán ambas tablas.

Si no especificamos por qué campo relacionamos ambas tablas, es decir, omitimos la condición "on":

 select * from libros
  join editoriales;

el resultado es el producto cartesiano de ambas tablas. Un "join" sin condición "on" para la unión genera un resultado en el que aparecen todas las combinaciones de los registros de ambas tablas.

Veamos lo que sucede si omitimos la referencia a las tablas al nombrar el campo "codigo" (nombre de campo que contienen ambas tablas):

 select * from libros
  join editoriales
  on codigoeditorial=codigo;

aparece un mensaje de error indicando que "codigo" es ambiguo.

Por ello, si hacemos referencia a un campo de una tabla que tiene el mismo nombre que el campo de la otra tabla consultada, debemos especificar a cuál tabla pertenece dicho campo.

Para simplificar la sentencia podemos usar un alias para cada tabla:

 select * from libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigo;

En la consulta anterior, el código de la editorial aparece 2 veces, desde la tabla "libros" y "editoriales". Podemos solicitar que nos muestre algunos campos:

 select titulo,autor,nombre from libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigo;

Si queremos ver el código del libro, al presentar el campo "codigo", debemos especificar de qué tabla, porque el campo "codigo" se repite en ambas tablas ("libros" y "editoriales"):

 select l.codigo,titulo,autor,nombre from libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigo;

Si obviamos la referencia a la tabla, la sentencia no se ejecuta y aparece un mensaje indicando que el campo "codigo" es ambiguo:

 select codigo,titulo,autor,nombre from libros as l
  join editoriales as e
  on l.codigoeditorial=e.codigo;
 



Retornar