"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