Clasificaciones, modalidades y tendencias de investigación educativa.
JOIN entre tablas LIBROS y EDITORIALES
1. I C T IAutor: Luis Ortuño Soto
Caso de estudio:
JOINS
2. I C T IAutor: Luis Ortuño Soto
•Un JOIN se utiliza para consultar datos de más de una tabla
•La condición de JOIN se escribe en la cláusula WHERE.
•Si existen columnas con el mismo nombre en las tablas
seleccionadas, se deberán nombrar los campos
Un join es una operación que relaciona dos o más tablas para
obtener un resultado que incluya datos (campos y registros) de
ambas
4. I C T IAutor: Luis Ortuño Soto
Tipos de Join’s
Existen dos tipos principales de Join
• Equijoin
• Non-equijoin
• Y dos mas adicionales
• Outer join
• Self join
5. I C T IAutor: Luis Ortuño Soto
• Cuando se unen más de dos tablas, Oracle
realiza un join a la vez, al inicio con las dos
primeras tablas que encuentra, a partir del
conjunto de datos resultante, se une con la
tercera tabla y así sucesivamente:
• ((A join B) join C) join D …
Marco Teórico
6. I C T IAutor: Luis Ortuño Soto
• En nuestro caso más común basados en el
esquema de prueba
• Select e.empno, e.ename, e.job, d.dname
From emp e, dept d
Where e.deptno = d.deptno;
Ejemplo de EquiJoin
7. I C T IAutor: Luis Ortuño Soto
Ejemplo de EquiJoin
• EQUIJOIN Join sobre dos o más tablas, por igualdad de
campos.
• Select emp.empno, emp.ename, emp.deptno,
dept.deptno, dept.loc
From emp,dept
Where emp.deptno = dept.deptno;
• Ya que la columna DEPTNO es igual en ambas tablas
esta debe de ir prefijada por el nombre de la tabla para
evitar ambigüedad
8. I C T IAutor: Luis Ortuño Soto
• También llamado natural Join, es un caso donde
solo se usan operadores de igualdad para las
condiciones de Join
• Select emp.ename, dept.dname
From emp, dept
Where emp.deptno = dept.deptno
Select emp.ename, dept.dname
From emp
NATURAL JOIN dept on emp.deptno =
dept.deptno
Ejemplo de EquiJoin
9. I C T IAutor: Luis Ortuño Soto
• Digamos que tenemos las siguientes dos
tablas:
Ejemplo de EquiJoin
10. I C T IAutor: Luis Ortuño Soto
Ejemplo de EquiJoin
Store_name Sales Txn_date
Los Angeles 1500 05-Jan-1999
San Diego 2500 07-Jan-1999
Los Angeles 3000 08-Jan-1999
Boston 7000 08-Jan-1999
Tabla Store_Information
Region_name Store_name
East Boston
East New York
Wets Los Angeles
West San Diego
Tabla Geography
11. I C T IAutor: Luis Ortuño Soto
• y queremos saber las ventas por región.
• Al examinar las dos tablas, encontramos que
están enlazadas a través del campo común
“nombre_negocio”
• Entonces la sentencia SQL quedaría de la
siguiente manera:
Ejemplo de EquiJoin
12. I C T IAutor: Luis Ortuño Soto
• SELECT A1.Region_Name
REGION, SUM(A2.Sales) SALES
FROM Geography A1, Store_Information A2
WHERE A1.Store_Name = A2.Store_Name
GROUP BY A1.Region_Name;
• Resultado:
Ejemplo de EquiJoin
Region Sales
East 700
West 2050
13. I C T IAutor: Luis Ortuño Soto
Ejemplo de Non-Equijoin
• Son un tipo de unión no muy utilizado, que
une dos tablas por una condición diferente a
la de igualdad
• Select e.ename, e.sal, s.grade
From emp e, salgrade s
Where e.sal between s.losal and s.hisal
14. I C T IAutor: Luis Ortuño Soto
• SELECT
v.nombre, v.apellidos, vi.numero_dias, t.nomb
re
FROM viajero v, viaje vi, tipo_estancia t
WHERE v.id_viajero = vi.id_viajero
AND vi.numero_dias BETWEEN t.dia_desde
AND t.dia_hasta
ORDER BY fecha;
Ejemplo de Non-Equijoin
15. I C T IAutor: Luis Ortuño Soto
Ejemplo de Outer Join
• Select e.ename, d.deptno, d.dname
From emp e, dept d
Where e.deptno(+) = d.deptno
Order by e.deptno;
• En este ejemplo se muestran los números y
nombres de TODOS los departamentos
incluidos aquellos que no tienen empleados
• Si se añade AND emp.deptno is null, solo se
mostrarán las no coincidencias
16. I C T IAutor: Luis Ortuño Soto
• ¿Qué sucede en los casos donde estamos
interesados en la selección de elementos en
una tabla sin importar si se encuentran
presentes en la segunda tabla? Ahora
necesitaremos utilizar el comando SQL OUTER
JOIN.
Más ejemplos de Outer Join
17. I C T IAutor: Luis Ortuño Soto
• Se colocará un "(+)" en la cláusula WHERE del
otro lado de la tabla para la que queremos
incluir todas las filas.
• Ejemplo en la siguiente lamina:
Más ejemplos de Outer Join
18. I C T IAutor: Luis Ortuño Soto
• SELECT A1.Store_Name, SUM(A2.Sales) SALES
FROM Geography A1, Store_Information A2
WHERE A1.Store_Name = A2.Store_Name (+)
GROUP BY A1.Store_Name;
• Resultado
Más ejemplos de Outer Join
Store_name Sales
Boston 700
New York
Los Angeles 1800
San Diego 250
19. I C T IAutor: Luis Ortuño Soto
Ejemplo de Self Join
• Select trabajador.ename || ‘ trabaja para ‘ ||
jefe.ename
From emp trabajador emp jefe
Where trabajador.mgr = jefe.empno;
• En este ejemplo la clausula where contiene la
combinación “donde un jefe de un trabajador
coincide con el número de empleado para el
jefe”
20. I C T IAutor: Luis Ortuño Soto
Vamos a crear un par de tablas
Create table libros(
Codigo number (4),
Titulo varchar2 (40) not null,
Autor varchar2 (30),
Codigoeditorial number (3) not null,
Precio number (5,2),
Primary key (codigo));
21. I C T IAutor: Luis Ortuño Soto
Y la segunda
Create table editoriales(
Codigo number (3),
Nombre varchar2(20) not null,
Primary key(codigo));
22. I C T IAutor: Luis Ortuño Soto
Consultando libros
• Select * from libros;
• En el campo editorial aparece el código pero
no sabemos el nombre de la editorial,
necesitamos consultar ambas tablas
23. I C T IAutor: Luis Ortuño Soto
Hagamos un Join
• Select *
From libros
Join editoriales
On libros.codigoeditorial = editoriales.codigo;
24. I C T IAutor: Luis Ortuño Soto
Join
• Un join es una operación que relaciona dos o
más tablas para obtener un resultado que
incluya datos (campos y registros) de ambas;
las tablas participantes se combinan según los
campos comunes a ambas tablas.
25. I C T IAutor: Luis Ortuño Soto
Hay tres tipos de combinaciones:
1. combinaciones internas (inner join o join),
2. combinaciones externas
3. combinaciones cruzadas.
26. I C T IAutor: Luis Ortuño Soto
Analicemos
• Select * from libros
Join editoriales
On libros.codigoeditorial = editoriales.codigo;
• especificamos los campos que aparecerán en el
resultado en la lista de selección;
• Indicamos el nombre de la tabla luego del “from”
(“libros”);
• Combinamos esta tabla con “join”y el nombre de
la otra tabla (“editoriales”) se especifica que
tablas se vana a combinar y cómo
27. I C T IAutor: Luis Ortuño Soto
Analicemos
• Select * from libros
Join editoriales
On libros.codigoeditorial = editoriales.codigo;
• Combinamos esta tabla con “join”y el nombre de
la otra tabla (“editoriales”) se especifica que
tablas se vana a combinar y cómo
• Se debe especificar la condición para
enlazarlas, es decir, el campo por el cual se
combinarán, que tienen en común con “ON”
28. I C T IAutor: Luis Ortuño Soto
Analicemos
• Select * from libros
Join editoriales
On libros.codigoeditorial = editoriales.codigo;
• En el ejemplo, si no especificamos
"editoriales.codigo" y solamente tipeamos
"codigo", Oracle no sabrá si nos referimos al
campo "codigo" de "libros" o de "editoriales" y
mostrará un mensaje de error indicando que
"codigo" es ambiguo.
29. I C T IAutor: Luis Ortuño Soto
Analicemos
• Select * from libros
Join editoriales
On libros.codigoeditorial = editoriales.codigo;
• Se puede incluir en la consulta join la cláusula
"where" para restringir los registros que
retorna el resultado; también "order by",
"distinct", etc..
30. I C T IAutor: Luis Ortuño Soto
Analicemos
• Select * from libros
Join editoriales
On libros.codigoeditorial = editoriales.codigo;
• Se emplea este tipo de combinación para
encontrar registros de la primera tabla que se
correspondan con los registros de la otra, es
decir, que cumplan la condición del "on". Si un
valor de la primera tabla no se encuentra en la
segunda tabla, el registro no aparece; si en la
primera tabla el valor es nulo, tampoco aparece.
31. I C T IAutor: Luis Ortuño Soto
Analicemos
• Select *
From libros
Join editoriales
On libros.codigoeditorial = editoriales.codigo;
• Select l.codigo, titulo, autor, nombre
From libros l
Join editoriales e
On l.codigoeditorial = e.codigo;
32. I C T IAutor: Luis Ortuño Soto
• Es aquel en el que se unen dos tablas A y B. En
esta unión se incluyen todos los registros de A
aunque no satisfagan la condición.
• Para hacer esto, se puede usar el Left
Outer Join o el operador (+) en todas las
columnas de B en la parte Where. Ejemplo:
Left Join
33. I C T IAutor: Luis Ortuño Soto
• Select e.empno, e.ename, e.job, d.dname
From emp e
left outer join dept d
On e.deptno = d.deptno;
• Select e.empno, e.ename, e.job, d.dname
From emp e, dept d
Where e.deptno = d.deptno (+);
Left Join
34. I C T IAutor: Luis Ortuño Soto
• Si queremos saber qué registros de una tabla NO
encuentran correspondencia en la otra, es
decir, no existe valor coincidente en la
segunda, necesitamos otro tipo de
combinación, "outer join" (combinación externa).
• Las combinaciones externas combinan registros
de dos tablas que cumplen la condición, más los
registros de la segunda tabla que no la cumplen;
es decir, muestran todos los registros de las
tablas relacionadas, aún cuando no haya valores
coincidentes entre ellas.
Left Join
35. I C T IAutor: Luis Ortuño Soto
• Las combinaciones externas se realizan
solamente entre 2 tablas.
• Hay tres tipos de combinaciones externas:
"left outer join", "right outer join" y "full outer
join"; se pueden abreviar con "left join", "right
join" y "full join" respectivamente.
Left Join
36. I C T IAutor: Luis Ortuño Soto
• Se emplea una combinación externa izquierda
para mostrar todos los registros de la tabla de la
izquierda. Si no encuentra coincidencia con la
tabla de la derecha, el registro muestra los
campos de la segunda tabla seteados a "null".
• Select titulo,nombre
From editoriales e
left join libros l
On codigoeditorial = e.codigo;
Left Join
37. I C T IAutor: Luis Ortuño Soto
• Select titulo,nombre
From editoriales e
left join libros l on codigoeditorial = e.codigo;
• El resultado mostrará el título y nombre de la
editorial; las editoriales de las cuales no hay
libros, es decir, cuyo código de editorial no
está presente en "libros" aparece en el
resultado, pero con el valor "null" en el campo
"titulo".
Left Join
38. I C T IAutor: Luis Ortuño Soto
• Es importante la posición en que se colocan
las tablas en un "left join", la tabla de la
izquierda es la que se usa para localizar
registros en la tabla de la derecha.
• En el siguiente ejemplo solicitamos el título y
el nombre la editorial, la sentencia es similar a
la anterior, la diferencia está en el orden de las
tablas:
Left Join
39. I C T IAutor: Luis Ortuño Soto
• Select titulo,nombre
From libros l
left join editoriales e
On codigoeditorial = e.codigo;
• El resultado mostrará el título del libro y el
nombre de la editorial; los títulos cuyo código de
editorial no está presente en "editoriales"
aparecen en el resultado, pero con el valor "null"
en el campo "nombre".
Left Join
40. I C T IAutor: Luis Ortuño Soto
• Un "left join" puede tener clausula "where" que
restringa el resultado de la consulta considerando
solamente los registros que encuentran
coincidencia en la tabla de la derecha, es decir,
cuyo valor de código está presente en "libros":
• select titulo,nombre
From editoriales e
left join libros l
On e.codigo=codigoeditorial
Where codigoeditorial is not null;
Left Join
41. I C T IAutor: Luis Ortuño Soto
• También podemos mostrar las editoriales que NO
están presentes en "libros", es decir, que NO
encuentran coincidencia en la tabla de la
derecha:
• Select titulo,nombre
From editoriales e
left join libros l
On e.codigo=codigoeditorial
Where codigoeditorial is null;
Left Join
42. I C T IAutor: Luis Ortuño Soto
• Es aquel en el que se unen dos tablas A y B. En
esta unión se incluyen todos los registros de B
aunque no satisfagan la condición. Para hacer
esto, se puede usar el Right Outer Join o el
operador (+) en todas las columnas de A en la
parte Where. Ejemplo:
right outer join o right join
43. I C T IAutor: Luis Ortuño Soto
• Select e.empno, e.ename, e.job, d.dname
From emp e right
outer join dept d
On e.deptno = d.deptno;
• Select e.empno, e.ename, e.job, d.dname
From emp e, dept d
Where e.deptno (+) = d.deptno;
right outer join o right join
44. I C T IAutor: Luis Ortuño Soto
• Una combinación externa derecha opera del
mismo modo sólo que la tabla derecha es la
que localiza los registros en la tabla izquierda.
• Select titulo,nombre as editorial
From libros l
right join editoriales e
On codigoeditorial = e.codigo;
right outer join o right join
45. I C T IAutor: Luis Ortuño Soto
• Es FUNDAMENTAL tener en cuenta la posición
en que se colocan las tablas en los "outer
join". En un "left join" la primera tabla
(izquierda) es la que busca coincidencias en la
segunda tabla (derecha); en el "right join" la
segunda tabla (derecha) es la que busca
coincidencias en la primera tabla (izquierda).
right outer join o right join
46. I C T IAutor: Luis Ortuño Soto
• En la siguiente consulta empleamos un "left
join" para conseguir el mismo resultado que el
"right join" anterior":
• Select titulo,nombre
From editoriales e
left join libros l
On codigoeditorial = e.codigo;
right outer join o right join
47. I C T IAutor: Luis Ortuño Soto
• Note que la tabla que busca coincidencias
("editoriales") está en primer lugar porque es
un "left join"; en el "right join" precedente,
estaba en segundo lugar.
right outer join o right join
48. I C T IAutor: Luis Ortuño Soto
• Un "right join" también puede tener cláusula
"where" que restringa el resultado de la consulta
considerando solamente los registros que
encuentran coincidencia en la tabla izquierda:
• Select titulo,nombre
From libros l
right join editoriales e
On e.codigo=codigoeditorial
Where codigoeditorial is not null;
right outer join o right join
49. I C T IAutor: Luis Ortuño Soto
• Mostramos las editoriales que NO están
presentes en "libros", es decir, que NO
encuentran coincidencia en la tabla de la derecha
empleando un "right join":
• Select titulo,nombre
From libros l
right join editoriales e
On e.codigo=codigoeditorial
Where codigoeditorial is null;
right outer join o right join
50. I C T IAutor: Luis Ortuño Soto
• Finalmente, este join es la combinación del
right outer join y el left outer join;
mostrándonos la información de ambas tablas
unidas A y B no importando que haya registros
que no satisfagan la condición. Para realizar
esto, se usa la cláusula Full Outer Join o
un Union con los dos querys del
operador (+) como se puede apreciar en los
ejemplos siguientes:
full outer join o full join
51. I C T IAutor: Luis Ortuño Soto
• Select e.empno, e.ename, e.job, d.dname
From emp e full outer join dept d
On e.deptno = d.deptno;
• Select e.empno, e.ename, e.job, d.dname
From emp e, dept d
Where e.deptno (+) = deptno
Union
Select e.empno, e.ename, e.job, d.dname
From emp e, dept d
Where e.deptno = d.deptno (+);
full outer join o full join
52. I C T IAutor: Luis Ortuño Soto
• Una combinación externa completa retorna
todos los registros de ambas tablas. Si un
registro de una tabla izquierda no encuentra
coincidencia en la tabla derecha, las columnas
correspondientes a campos de la tabla
derecha aparecen seteadas a "null", y si la
tabla de la derecha no encuentra
correspondencia en la tabla izquierda, los
campos de esta última aparecen conteniendo
"null".
full outer join o full join
53. I C T IAutor: Luis Ortuño Soto
• Select titulo,nombre
From editoriales e
full join libros l
On codigoeditorial = e.codigo;
• La salida del "full join" precedente muestra todos
los registros de ambas tablas, incluyendo los
libros cuyo código de editorial no existe en la
tabla "editoriales" y las editoriales de las cuales
no hay correspondencia en "libros".
full outer join o full join
54. I C T IAutor: Luis Ortuño Soto
• Las combinaciones cruzadas muestran todas
las combinaciones de todos los registros de las
tablas combinadas. Para este tipo de join no
se incluye una condición de enlace. Se genera
el producto cartesiano en el que el número de
filas del resultado es igual al número de
registros de la primera tabla multiplicado por
el número de registros de la segunda tabla, es
decir, si hay 3 registros en una tabla y 4 en la
otra, retorna 12 filas.
cross join
55. I C T IAutor: Luis Ortuño Soto
• Select c.nombre as "plato
principal", p.nombre as "postre"
From comidas c cross join postres p;
• Este tipo de join no es muy utilizado.
cross join
56. I C T IAutor: Luis Ortuño Soto
• Es un join de una tabla consigo misma. Se
realiza de manera similar a un join normal; la
diferencia sustancial, reside en que será
comparada y unida por algún campo de la
misma tabla. Un ejemplo claro de esto, es
cuando se quiere mostrar el jefe de cada
empleado en nuestra tabla emp
Self Join
57. I C T IAutor: Luis Ortuño Soto
• Select
emp.empno, emp.ename, emp.job, mgr.enam
e, mgr.job
From emp emp, emp mgr
Where emp.mgr = mgr.empno;
Self Join
58. I C T IAutor: Luis Ortuño Soto
• Un pequeño restaurante tiene almacenadas
sus comidas en una tabla llamada "comidas"
que consta de los siguientes campos:
• nombre varchar(20),
• precio decimal (4,2) y
• rubro char(6) -- que indica con 'plato' si es un
plato principal y 'postre' si es postre
Self Join
59. I C T IAutor: Luis Ortuño Soto
• Podemos obtener la combinación de todos los
platos empleando un "cross join" con una sola
tabla:
• Select c1.nombre, c2.nombre,
c1.precio+c2.precio as total
From comidas c1
Cross join comidas c2;
Self Join
60. I C T IAutor: Luis Ortuño Soto
• En la consulta anterior aparecerán filas
duplicadas, para evitarlo debemos emplear un
"where":
• select c1.nombre as "plato principal", c2.nombre
as postre, c1.precio+c2.precio as total
From comidas c1
Cross join comidas c2
Where c1.rubro='plato' and c2.rubro='postre';
Self Join
61. I C T IAutor: Luis Ortuño Soto
• También se puede realizar una autocombinación
con "join":
• select c1.nombre as "plato principal", c2.nombre
as postre, c1.precio+c2.precio as total
From comidas c1 join comidas c2
On c1.codigo<>c2.codigo where c1.rubro='plato'
and c2.rubro='postre';
Self Join
62. I C T IAutor: Luis Ortuño Soto
• Para resumir hemos llamado T1 y T2 las tablas de
las que queremos sacar los datos y R la tabla
lógica que representa el resultado de consulta. T1
y T2 podrían ser tablas guardadas o consultas.
• En la última parte cuando se pregunta "En T1 hay
filas que no tienen pareja en T2", la pregunta se
debe de interpretar como "en alguna de las
tablas hay filas que no tienen pareja".
Conclusiones
64. I C T IAutor: Luis Ortuño Soto
• Los Joins son muy útiles para traer
información de dos o más tablas y poder
combinar la información que reside en ellas.
Un abuso o mal uso de ellos sin
embargo, puede causar dolores serios de
cabeza. Para saber si estamos haciendo o no
un buen query, requerimos acudir a nuestro
plan de ejecución y/o algún trace para saber si
realmente, es correcto lo que estamos
construyendo.
Conclusiones