41 - Combinación de más de dos tablas

Podemos hacer un "join" con más de dos tablas.

Cada join combina 2 tablas. Se pueden emplear varios join para enlazar varias tablas. Cada resultado de un join es una tabla que puede combinarse con otro join.

Problema resuelto

Una librería almacena la información de sus libros para la venta en tres tablas, "libros", "autores" y "editoriales".
Eliminamos las tablas si existen:

drop table if exists libros;
drop table if exists autores;
drop table if exists editoriales;

Creamos las 3 tablas con las siguientes estructuras:

create table libros(
  codigo integer primary key,
  titulo text,
  codigoautor integer,
  codigoeditorial integer,
  precio real
 );

 create table autores(
  codigo integer primary key,
  nombre text
 );

 create table editoriales(
  codigo integer primary key,
  nombre text
 );

Almacenamos los siguientes datos de prueba:

 insert into editoriales(nombre) values('Planeta');
 insert into editoriales(nombre) values('Emece');
 insert into editoriales(nombre) values('Siglo XXI');
 insert into editoriales(nombre) values('Plaza');
 
 insert into autores(nombre) values ('Richard Bach');
 insert into autores(nombre) values ('Borges');
 insert into autores(nombre) values ('Jose Hernandez');
 insert into autores(nombre) values ('Mario Molina');
 insert into autores(nombre) values ('Paenza');
 
 insert into libros(titulo,codigoautor,codigoeditorial,precio) 
   values('El aleph',2,2,20);
 insert into libros(titulo,codigoautor,codigoeditorial,precio)
   values('Martin Fierro',3,1,30);
 insert into libros(titulo,codigoautor,codigoeditorial,precio)
   values('Aprenda PHP',4,3,50);
 insert into libros(titulo,codigoautor,codigoeditorial,precio)
   values('Uno',1,1,15);
 insert into libros(titulo,codigoautor,codigoeditorial,precio)
   values('Java en 10 minutos',0,3,45);
 insert into libros(titulo,codigoautor,codigoeditorial,precio)
   values('Matematica estas ahi',0,0,15);
 insert into libros(titulo,codigoautor,codigoeditorial,precio)
   values('Java de la A a la Z',4,0,50); 

Recuperamos todos los datos de los libros consultando las tres tablas:

  select titulo,a.nombre,e.nombre,precio
    from libros as l
    join autores as a on codigoautor=a.codigo
    join editoriales as e on codigoeditorial=e.codigo;

Los libros cuyo código de autor no se encuentra en "autores" (caso de "Java en 10 minutos" y "Matematica estas ahi") y cuya editorial no existe en "editoriales" (caso de "Matematica estas ahi" y "Java de la A a la Z"), no aparecen porque realizamos una combinación interna.

Podemos combinar varios tipos de join en una misma sentencia:

  select titulo,a.nombre,e.nombre,precio
    from libros as l
    join autores as a on codigoautor=a.codigo
    left join editoriales as e on codigoeditorial=e.codigo;	

Se muestra el libro 'Java de la A a la Z' que tiene un código de editorial inexistente en la tabla "editoriales".

Problema propuesto

Un club dicta clases de distintos deportes. En una tabla llamada "socios" guarda los datos de los socios, en una tabla llamada "deportes" la información referente a los diferentes deportes que se dictan y en una tabla denominada "inscriptos", las inscripciones de los socios a los distintos deportes.
Un socio puede inscribirse en varios deportes el mismo año. Un socio no puede inscribirse en el mismo deporte el mismo año. Distintos socios se inscriben en un mismo deporte en el mismo año.

  1. Borrar la tablas si existen.

  2. Crear las tablas con las siguientes estructuras:

     create table socios(
      documento text primary key, 
      nombre text,
      domicilio text
     );
     
     create table deportes(
      codigo integer primary key,
      nombre text,
      profesor text
     );
    
     create table inscriptos(
      documento text, 
      codigodeporte integer,
      año integer,
      matricula text,--'s'=paga, 'n'=impaga
      primary key(documento,codigodeporte,año)
     );
    
  3. Almacenar estos registros para probar las consultas:

     insert into inscriptos (documento,codigodeporte,año,matricula)
      values ('22222222',3,'2016','s');
     insert into inscriptos (documento,codigodeporte,año,matricula)
      values ('23333333',3,'2016','s');
     insert into inscriptos (documento,codigodeporte,año,matricula)
      values ('24444444',3,'2016','n');
     insert into inscriptos (documento,codigodeporte,año,matricula)
      values ('22222222',3,'2015','s');
     insert into inscriptos (documento,codigodeporte,año,matricula)
      values ('22222222',3,'2017','n');
     insert into inscriptos (documento,codigodeporte,año,matricula)
      values ('24444444',1,'2016','s');
     insert into inscriptos (documento,codigodeporte,año,matricula)
      values ('24444444',2,'2016','s'); 
    
  4. Muestre el nombre del socio, el nombre del deporte en que se inscribió y el año.

Solución
drop table if exists socios;
drop table if exists deportes;
drop table if exists inscriptos;

 create table socios(
  documento text primary key, 
  nombre text,
  domicilio text
 );
 
 create table deportes(
  codigo integer primary key,
  nombre text,
  profesor text
 );

 create table inscriptos(
  documento text, 
  codigodeporte integer,
  año integer,
  matricula text,--'s'=paga, 'n'=impaga
  primary key(documento,codigodeporte,año)
 );

 insert into socios values('22222222','Ana Acosta','Avellaneda 111');
 insert into socios values('23333333','Betina Bustos','Bulnes 222');
 insert into socios values('24444444','Carlos Castro','Caseros 333');
 insert into socios values('25555555','Daniel Duarte','Dinamarca 44');

 insert into deportes(nombre,profesor) values('basquet','Juan Juarez');
 insert into deportes(nombre,profesor) values('futbol','Pedro Perez');
 insert into deportes(nombre,profesor) values('natacion','Marina Morales');
 insert into deportes(nombre,profesor) values('tenis','Marina Morales');

 insert into inscriptos (documento,codigodeporte,año,matricula)
  values ('22222222',3,'2016','s');
 insert into inscriptos (documento,codigodeporte,año,matricula)
  values ('23333333',3,'2016','s');
 insert into inscriptos (documento,codigodeporte,año,matricula)
  values ('24444444',3,'2016','n');
 insert into inscriptos (documento,codigodeporte,año,matricula)
  values ('22222222',3,'2015','s');
 insert into inscriptos (documento,codigodeporte,año,matricula)
  values ('22222222',3,'2017','n');
 insert into inscriptos (documento,codigodeporte,año,matricula)
  values ('24444444',1,'2016','s');
 insert into inscriptos (documento,codigodeporte,año,matricula)
  values ('24444444',2,'2016','s'); 
 
  select s.nombre,d.nombre,año
   from deportes as d
   join inscriptos as i on codigodeporte=d.codigo
   join socios as s on i.documento=s.documento;

Ejecución de ejercicios online

Puede ejecutar comandos de SQLite directamente en el sitio sin tener que instalar nada en su computadora.

Resultado.....