domingo, 5 de mayo de 2013

65 - Varias tablas (right join)



"right join" opera del mismo modo que "left join" sólo que la búsqueda de coincidencias la realiza de modo inverso, es decir, los roles de las tablas se invierten, busca coincidencia de valores desde la tabla de la derecha en la tabla de la izquierda y si un valor de la tabla de la derecha no encuentra coincidencia en la tabla de la izquierda, se genera una fila extra (una por cada valor no encontrado) con todos los campos seteados a "null".

Trabajamos con las tablas de una librería:

-libros: codigo (clave primaria), titulo, autor, codigoeditorial, precio, 
cantidad y
-editoriales: codigo (clave primaria), nombre.
 
Estas sentencias devuelven el mismo resultado:

 select nombre,titulo
  from editoriales as e
  left join libros as l
  on e.codigo=l.codigoeditorial;
 
 select nombre,titulo
  from libros as l
  right join editoriales as e
  on e.codigo=l.codigoeditorial;
 
La primera busca valores de "codigo" de la tabla "editoriales" (tabla de la izquierda) coincidentes con los valores de "codigoeditorial" de la tabla "libros" (tabla de la derecha). La segunda busca valores de la tabla de la derecha coincidentes con los valores de la tabla de la izquierda.



PROBLEMA RESUELTO



Trabajamos con las tablas "libros" y editoriales" de una librería.
Eliminamos dichas tablas, si existen:

 drop table if exists libros, editoriales;
 
Creamos 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 tinyint 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);
 
Necesitamos los títulos y nombres de las editoriales de los libros, incluso de aquellos editoriales 
que no tienen libros:

 select nombre,titulo
  from editoriales as e
  left join libros as l
  on e.codigo=l.codigoeditorial;
 
Esta sentencia busca los nombres de las editoriales que están presentes en "libros". Podemos 
realizar la búsqueda de modo inverso con "right join":

 select nombre,titulo
  from libros as l
  right join editoriales as e
  on e.codigo=l.codigoeditorial;
 
La primera, con "left join", busca valores de "codigo" de la tabla "editoriales" (tabla de la izquierda) coincidentes con los valores de "codigoeditorial" de la tabla "libros" (tabla de la derecha). La segunda, con "right join", busca valores de "codigoeditorial" de la tabla "libros" (tabla de la derecha) coincidentes con los valores de "codigo" de la tabla "editoriales" (tabla de la izquierda).



PROBLEMA PROPUESTO


Un club dicta clases de distintos deportes. En una tabla llamada "socios" 
guarda los datos de sus socios y en una tabla denominada "inscriptos" almacena 
la información necesaria para las inscripciones de los socios a los distintos 
deportes.
 
1- Elimine las tablas si existen.
 
2- Cree las tablas:
 
 create table socios(
  documento char(8) not null,
  nombre varchar(30),
  domicilio varchar(30),
  primary key(documento)
 );
 
 create table inscriptos(
  documento char(8) not null, 
  deporte varchar(15) not null,
  año year,
  matricula char(1), /*si esta paga ='s' sino 'n'*/
  primary key(documento,deporte,año)
 );
 
3- Ingrese algunos registros para ambas tablas:
 
 insert into socios values('22333444','Juan Perez','Colon 234');
 insert into socios values('23333444','Maria Lopez','Sarmiento 465');
 insert into socios values('24333444','Antonio Juarez','Caseros 980');
 insert into socios values('25333444','Marcelo Pereyra','Sucre 349');
 
 insert into inscriptos values ('22333444','natacion','2005','s');
 insert into inscriptos values ('22333444','natacion','2006','n');
 insert into inscriptos values ('23333444','natacion','2005','s');
 insert into inscriptos values ('23333444','tenis','2006','s');
 insert into inscriptos values ('23333444','natacion','2006','s');
 insert into inscriptos values ('24333444','tenis','2006','n');
 insert into inscriptos values ('24333444','basquet','2006','n');
 
4- Realice un "left join" de la tabla "socios" a "inscriptos" buscando 
coincidencia de "documento":
  
 
Note que el socio que no está inscripto en ningún deporte tiene la fila 
seteada a "null".
 
5- Realice un "right join" para obtener la misma salida anterior:
  
 
6- Ingrese una inscripción de alguien que no sea socio (documento que no 
se encuentre en la tabla "socios"):
 
 insert into inscriptos values ('26333444','basquet','2006','n');
 
7- Realice un "right join" desde la tabla "socios" a "inscriptos" buscando 
coincidencia de documento:

 
 
Note que la persona con documento "26333444" no se encuentra en "socios", 
la columna "nombre" (correspondiente a la tabla "socios") contiene "null".





No hay comentarios:

Publicar un comentario