Está en la página 1de 38

Desplegando Datos

de Múltiples Tablas

Copyright © EDCON Tecnologías de Información, 2008.


Objetivos

Al completar esta lección podrá realizar lo siguiente:


• Escribir sentencias SELECT para acceder a datos
desde más de una tabla usando uniones de
igualdad o desigualdad
• Ver datos que generalmente no se cumplen la
condición del “join” mediante el uso de “outer
joins”
• Unir una tabla a sí misma usando “self join”

5-2
Obteniendo Datos desde Múltiples Tablas
EMPLOYEES DEPARTMENTS

5-3
Tipos de Uniones

Propiedad de Oracle SQL: 1999


Joins (8i y anterior): Joins:
• Equijoin • Cross joins
• Non-equijoin • Natural joins
• Outer join • Using clause
• Self join • Full or two sided outer
joins
• Arbitrary join conditions
for outer joins

5-4
Uniendo Tablas Usando SQL:
Sintaxis de 1999

Usar una unión en una búsqueda de datos desde más


de una tabla.
SELECT
SELECT table1.column,
table1.column, table2.column
table2.column
FROM
FROM table1
table1
[CROSS
[CROSS JOIN
JOIN table2]
table2] ||
[NATURAL
[NATURAL JOIN
JOIN table2]
table2] ||
[JOIN
[JOIN table2
table2 USING
USING (column_name)]
(column_name)] ||
[JOIN
[JOIN table2
table2
ON(table1.column_name
ON(table1.column_name == table2.column_name)]
table2.column_name)] ||
[LEFT|RIGHT|FULL
[LEFT|RIGHT|FULL OUTER
OUTER JOIN
JOIN table2
table2
ON
ON (table1.column_name
(table1.column_name == table2.column_name)];
table2.column_name)];

5-5
Creando Uniones Naturales

• La cláusula NATURAL JOIN está basada en todas


las columnas en las dos tablas que tengan el
mismo nombre.
• Los registros seleccionados de las dos tablas que
tengan los mismos valores en todas las columnas
que hagan coincidencia.
• Si las columnas tienen los mismos nombres y
tienen diferentes tipos de datos, se devuelve un
error.

5-6
Recuperando Registros
con Uniones Naturales
SELECT department_id, department_name,
location_id, city
FROM departments
NATURAL JOIN locations ;

5-7
Creando Uniones con la cláusula USING

• Si varias columnas tienen los mismos nombres,


pero los tipos de datos no corresponden, la
cláusula NATURAL JOIN puede ser modificada con
la cláusula USING para especificar las columnas
que deban ser usadas para una unión de igualdad.
• Usar la cláusula USING para hacer
correspondencia una sola columna cuando más
de una columna corresponde.
• No usar el nombre de la tabla o alias en las
columnas referenciadas.
• Las cláusulas NATURAL JOIN y USING son
mutuamente exclusivas.

5-8
Uniendo nombres de columnas

EMPLOYEES DEPARTMENTS

… …

Llave foránera Llave primaria


5-9
Recuperando Registros
con la cláusula USING

SELECT e.employee_id, e.last_name, d.location_id


FROM employees e JOIN departments d
USING (department_id) ;

5-10
Calificando Nombres
de Columnas Ambiguas

• Usar prefijos de tablas para calificar nombres de


columnas que estén en múltiples tablas.
• Mejorar el funcionamiento usando prefijos de
tablas.
• Distinguir columnas que tengan nombres
idénticos pero que residan en diferentes tablas
usando alias de columnas.

5-11
Usando Alias de Tablas

• Facilitar búsquedas usando alias de tablas.


• Mejorando el funcionamiento usando prefijos de
tablas.
SELECT e.employee_id, e.last_name,
d.location_id, department_id
FROM employees e JOIN departments d
USING (department_id) ;

5-12
Creando Uniones con la cláusula ON

• La condición de unión para las uniones naturales


es básicamente una unión de igualdad de todas
las columnas con el mismo nombre.
• Para especificar condiciones arbitrarias o
especificar las columnas a unir, se usa la cláusula
ON.
• La condición de unión es separada de otras
condiciones de búsqueda.
• La cláusula ON hace fácil de entender el código.

5-13
Recuperando Registros con la cláusula ON

SELECT e.employee_id, e.last_name, e.department_id,


d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id);

5-14
Creando Tres maneras de
Unión con la cláusula ON
SELECT employee_id, city, department_name
FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l
ON d.location_id = l.location_id;

5-15
Condiciones Adicionales

SELECT e.employee_id, e.last_name, e.department_id,


d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
AND e.manager_id = 149 ;

5-16
Producto Cartesiano

• Un producto cartesiano se forma cuando:


– Una condición de la unión es omitida
– Una condición de la unión es invalida
– Todos los registros en la primera tabla son unidos
a todos los registros de la segunda tabla
• Para evitar un producto cartesiano, siempre se
debe incluir una condición válida del “join” en la
cláusula WHERE.

5-17
Generando un Producto Cartesiano
EMPLOYEES (20 registros) DEPARTMENTS (8 registros)

Producto
Cartesiano:
20x8=160
registros …

5-18
Creando Uniones Cruzadas

• La cláusula CROSS JOIN produce productos


cruzados de dos tablas.
• Esto es lo mismo que producto cartesiano entre
dos tablas.

SELECT last_name, department_name


FROM employees
CROSS JOIN departments ;

5-19
Uniendo Tablas Usando
Sintaxis de Oracle

Usar un “join” para querys desde más de una tabla.


SELECT
SELECT table1.column,
table1.column, table2.column
table2.column
FROM
FROM table1,
table1, table2
table2
WHERE
WHERE table1.column1
table1.column1 == table2.column2;
table2.column2;

•Escribir la condición del “join” en la cláusula WHERE.


•Poner prefijo al nombre de columna con el nombre
de la tabla cuando la misma columna aparezcan en
más de una tabla.

5-20
¿Qué es un Equijoin?
EMPLOYEES DEPARTMENTS

… …

Llave Foránea Llave Primaria

5-21
Recuperando Registros
con “Equijoins”

SELECT employees.employee_id, employees.last_name,


employees.department_id, departments.department_id,
departments.location_id
FROM employees, departments
WHERE employees.department_id = departments.department_id;

5-22
Condiciones de búsqueda Adicionales
Usando el Operador AND
EMPLOYEES DEPARTMENTS

… …

5-23
Uniendo mas de dos tablas
EMPLOYEES DEPARTMENTS LOCATIONS


• Para unir n tablas, se necesitan un mínimo de n-1
condiciones de “join”. Por ejemplo, para unir tres
tablas, se requieren un mínimo de dos “joins”.

5-24
Non-Equijoins
EMPLOYEES JOB_GRADES

El salario en la tabla
EMPLOYEES debe estar
… entre el salario más bajo y
el salario más alto
en la tabla JOB_GRADES.

5-25
Recuperando Registros con
Non-Equijoins

SELECT e.last_name, e.salary, j.grade_level


FROM employees e, job_grades j
WHERE e.salary
BETWEEN j.lowest_sal AND j.highest_sal;

5-26
“Outer Joins”

DEPARTMENTS EMPLOYEES


No hay empleados en el
departamento 190.

5-27
Sintaxis de “Outer Joins”

• Se puede usar un “outer join” para también ver


registros que no cumplen la condición de la unión.
• El operador de “Outer join” es el signo de más (+).

SELECT
SELECT table1.column,
table1.column, table2.column
table2.column
FROM
FROM table1,
table1, table2
table2
WHERE
WHERE table1.column(+)
table1.column(+) == table2.column;
table2.column;

SELECT
SELECT table1.column,
table1.column, table2.column
table2.column
FROM
FROM table1,
table1, table2
table2
WHERE
WHERE table1.column
table1.column == table2.column(+);
table2.column(+);

5-28
Usando “Outer Joins”

SELECT e.last_name, e.department_id, d.department_name


FROM employees e, departments d
WHERE e.department_id(+) = d.department_id ;

5-29
“Self Joins”

EMPLOYEES (TRABAJADOR) EMPLOYEES (JEFE)

… …

MANAGER_ID en la tabla WORKER es igual a


EMPLOYEE_ID en la tabla MANAGER.

5-30
Uniendo una Tabla a si misma

SELECT worker.last_name || ' works for '


|| manager.last_name
FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id ;

5-31
Práctica 5, Parte uno: Visión General

Esta práctica cubre la escritura de unión de tablas


usando sintaxis de Oracle.

5-32
INNER contra OUTER Joins

• En SQL: 1999, la unión de dos tablas retorna


solamente registros correspondientes como un
“inner join”.
• Una unión entre dos tablas que regrese los
resultados del “inner join” así como los registros
no concordantes de la tabla de la izquierda (o
derecha) es un “outer join” de izquierda (o
derecha).
• Una unión entre dos tablas que retorne resultados
de un “inner join” como resultados de un “left y
right join” es un “outer join” completo.

5-33
LEFT OUTER JOIN

SELECT e.last_name, e.department_id, d.department_name


FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

5-34
RIGHT OUTER JOIN

SELECT e.last_name, e.department_id, d.department_name


FROM employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

5-35
FULL OUTER JOIN

SELECT e.last_name, e.department_id, d.department_name


FROM employees e
FULL OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

5-36
Resumen

En esta lección se habrá aprendido acerca de cómo


usar uniones para desplegar datos desde múltiples
tablas en:
•Sintaxis propiedad de Oracle
•SQL: 1999

5-37
Práctica 5, Parte dos: Visión General

Esta práctica cubre los siguientes temas:

• Uniones de tablas usando un “equijoin”


• Ejecutar “outer” y “self joins”
• Agregando condiciones

5-38

También podría gustarte