Sie sind auf Seite 1von 17

OBTENER DATOS DE VARIAS TABLAS

En ocasiones tenemos que usar datos de ms de una tabla. En el ejemplo anterior, el informe
muestra datos de dos tablas distintas:

Los identificadores de empleado se encuentran en la tabla EMPLOYEES.


Los identificadores de departamento se encuentran en las tablas EMPLOYEES
y DEPARTMENTS.
Los nombres de departamento se encuentran en la tabla DEPARTMENTS.

Para crear el informe, tenemos que enlazar las tablas EMPLOYEES y DEPARTMENTS y acceder a
sus datos.

Sintaxis para las sentencias:

SELECT table1.column, table2.column

FROM table1

[NATURAL JOIN table2] |

[JOIN table2 USING (column_name)] |

[JOIN table2

ON (table1.column_name = table2.column_name)]|

[LEFT|RIGHT|FULL OUTER JOIN table2

ON (table1.column_name = table2.column_name)]|
DONDE:

table1.column muestra la tabla y la columna de las que se recuperan los datos.

NATURAL JOIN une dos tablas basndose en el mismo nombre de columna.

JOIN table USING column_name realiza una unin igualitaria basndose en el nombre de
columna.

JOIN table ON table1.column_name realiza una unin igualitaria basndose en la condicin de


la clusula ON, = table2.column_name.

LEFT/RIGHT/FULL OUTER se utiliza para realizar uniones externas.

Recuperacin de Registros con Uniones Naturales

Natural Join definicin

La clusula NATURAL JOIN se basa en todas las columnas de las dos tablas que
tienen el mismo nombre.

Si las columnas que tienen los mismos nombres tienen tipos de datos
diferentes, se devuelve un error.

Ejemplo:

Las tablas tienen las siguientes estructuras:

- libros: codigo (clave primaria), titulo, autor, codigoeditorial, precio.

- editoriales: codigoeditorial(clave primaria), nombre.

Hay que tener cuidado con este tipo de "join" porque si ambas tablas tiene
ms de un campo con igual nombre, el gestor no sabr por cual debe realizar la
unin. Por ejemplo, si el campo "titulo" de la tabla "libros" se llamara
"nombre", las tablas tendran 2 campos con igual nombre ("codigoeditorial" y
"nombre").

En el ejemplo siguiente, la tabla LOCATIONS se une a la tabla DEPARTMENT por la columna


LOCATION_ID, que es la nica con el nombre igual en ambas tablas. De haber habido ms
columnas comunes, la unin las habra utilizado todas.
Uniones Naturales con una Clusula WHERE
Las restricciones adicionales de una unin natural se hacen mediante la clusula WHERE. El
ejemplo siguiente limita las filas de salida a aqullas con un identificador de departamento
igual a 20 50.

SELECT department_id, department_name,


location_id, city
FROM hr. departments
NATURAL JOIN locations
WHERE department_id IN (20, 50);
Creacin de Uniones con la Clusula USING
Si hay varias columnas que tienen los mismos nombres pero los tipos de datos no se
corresponden, la clusula NATURAL JOIN se puede modificar mediante la clusula USING
para especificar las columnas que se deben utilizar para una unin igualitaria. Para evitar
que surja el error del ejemplo de libros y autores antes mencionado.

Tenemos que usar la clusula USING para asignar slo una columna cuando corresponde a
ms de una columna.

No debemos usar un alias o un nombre de tabla en las columnas a las que se hace
referencia.

Ejemplos

Esta sentencia es vlida:


SELECT l.city, d.department_name
FROM hr. locations l JOIN hr.departments d USING (location_id)
WHERE location_id = 1400;

Esta no es valida porque la clusula WHERE cualifica a LOCATION_ID:


SELECT l.city, d.department_name
FROM hr.locations l JOIN hr.departments d USING (location_id)
WHERE d.location_id = 1400;

Unin de Nombres de Columna


Uso de la clausula USING para Uniones Igualitarias
Para determinar el nombre de departamento de un empleado, comparamos el valor de la
columna DEPARTMENT_ID de la tabla HR.EMPLOYEES con los valores de DEPARTMENT_ID de
la tabla HR.DEPARTMENTS.

Ejecutamos las siguientes sentencias para luego compararlas

SELECT * FROM HR.DEPARTMENTS;

SELECT * FROM HR.EMPLOYEES;

La relacin entre las tablas HR.EMPLOYEES y HR.DEPARTMENTS es una unin igualitaria (es
decir, los valores de la columna DEPARTMENT_ID de ambas tablas deben ser iguales). Con
frecuencia, este tipo de unin implica complementos de clave primaria y ajena.

Nota: Las uniones igualitarias se denominan tambin uniones simples o uniones internas.

Ejecutamos la siguiente sentencia:


Cualificacin de Nombres de Columna Ambiguos
Debemos cualificar los nombres de las columnas con el nombre de la tabla para evitar
ambigedades. Sin los prefijos de tabla, la columna DEPARTMENT_ID en la lista SELECT podra
ser de la tabla DEPARTMENTS o de la tabla EMPLOYEES. Resulta necesario agregar el prefijo de
tabla para ejecutar la consulta ejemplo:

Si no existen nombres de columna comunes en las dos tablas, no es necesario cualificar las
columnas. Sin embargo, utilizar el prefijo de tabla mejora el rendimiento, ya que le indica a
Oracle Server exactamente dnde puede encontrar las columnas.

Nota: Al realizar uniones mediante la clusula USING, no podemos cualificar una columna que
se utilice en la propia clusula USING. Lo que es ms, si se usa esa columna en cualquier otra
parte de la sentencia SQL, no se puede aplicarle un alias.

Uso de Alias de Tabla

Cualificar nombres de columna con nombres de tabla puede llevar mucho tiempo,
especialmente si los nombres de tabla son largos. Podemos usar un alias de tabla en lugar de
nombres de tabla. Los alias de tabla ayudan a reducir el cdigo SQL, con lo que se consume
menos memoria.

vemos como se identifican en el ejemplo los alias de tabla de la clusula FROM. El nombre de
tabla se especifica entero, seguido de un espacio y, a continuacin, el alias de tabla. Se le dio a
la tabla EMPLOYEES el alias e y a la tabla DEPARTMENTS, el alias d.

Para tener en cuenta:

Los alias de tabla pueden contener hasta 30 caracteres, pero son


mejores los cortos que los largos.

Si se utiliza un alias de tabla para un nombre de tabla concreto en la


clusula FROM, se debe sustituir el nombre de tabla por alias de tabla
en toda la sentencia SELECT.

Los alias de tabla deben ser significativos.


Los alias de tabla son vlidos nicamente para la sentencia SELECT
actual.

Creacin de Uniones con la Clusula ON

La condicin de unin para la unin natural es bsicamente una unin


igualitaria de todas las columnas con el mismo nombre.
Usamos la clusula ON para especificar condiciones arbitrarias o para
especificar las columnas que se unirn.
La condicin de unin se separa de otras condiciones de bsqueda.
La clusula ON facilita la comprensin del cdigo.

En el siguiente ejemplo, las columnas DEPARTMENT_ID de las tablas HR.EMPLOYEES y


HR.DEPARTMENTS se unen mediante la clusula ON. Siempre que un identificador de
departamento de la tabla EMPLOYEES (DEPARTMENT_ID) sea igual a un identificador de
departamento de la tabla DEPARTMENTS (DEPARTMENT_ID), se devuelve la fila.
Tambin se puede usar la clusula ON para unir columnas con nombres diferentes.
Unin de una Tabla a S Misma
A veces, tenemos que unir una tabla a s misma. Ejemplo, para encontrar el nombre del
supervisor de cada empleado, debemos unir la tabla EMPLOYEES a s misma o realizar una
autounin.

Por ejemplo, para encontrar el nombre del supervisor de Lorentz, tenemos que:

Buscar Lorentz en la tabla EMPLOYEES en la columna LAST_NAME.


Buscar el nmero de supervisor para Lorentz en la columna MANAGER_ID. El
nmero del supervisor de Lorentz es 103.
Buscar el nombre del supervisor con el valor EMPLOYEE_ID 103 en la columna
LAST_NAME. El nmero de empleado de Hunold es 103, por lo que Hunold es
el supervisor de Lorentz.
En este proceso, se consulta la tabla dos veces. La primera vez, se consulta la tabla es para
buscar Lorentz en la columna LAST_NAME y el valor MANAGER_ID de 103. La segunda vez, se
consulta la columna EMPLOYEE_ID para buscar 103 y la columna LAST_NAME para buscar
Hunold.
Aplicacin de Condiciones Adicionales a una Unin
Se pueden aplicar condiciones adicionales a la unin.

El ejemplo realiza una unin de las tablas HR.EMPLOYEES y HR.DEPARTMENTS y, adems,


muestra slo a los empleados con el identificador de supervisor 149. Para agregar condiciones
adicionales a la clusula ON, podemos usar clusulas AND. De forma alternativa, podemos usar
una clusula WHERE para aplicar condiciones adicionales.

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


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

Creacin de Uniones en Tres Sentidos con la Clusula ON


Una unin en tres sentidos es una unin de tres tablas. Las uniones se realizan de
izquierda a derecha. De esta forma, la primera unin que se debe realizar es
HR.EMPLOYEES JOIN HR.DEPARTMENTS. La primera condicin de unin puede hacer
referencia a columnas de HR.EMPLOYEES y HR.DEPARTMENTS pero no puede hacer
referencia a columnas de HR.LOCATIONS. La segunda condicin de unin puede hacer
referencia a columnas de las tres tablas.
SELECT employee_id, city, department_name
FROM hr.employees e
JOIN hr.departments d
ON d.department_id = e.department_id
JOIN hr.locations l
ON d.location_id = l.location_id;

En la tabla EMPLEADOS tenemos la clave fornea DEPARTMENTS_ID, la cual es clave primaria de la


tabla DEPARTMENTS, en la cual tenemos la clave fornea LOCATION_ID, la misma es clave primaria
de la tabla LOCATIONS. Lo que nos permite enlazar las tres tablas.
Uniones no Igualiatarias

Una unin no igualitaria es aqulla que contiene algo distinto a un operador de


igualdad (=).
La relacin entre las tablas EMPLOYEES y JOB_GRADES es un ejemplo de unin no
igualitaria. Una relacin entre las dos tablas es que la columna SALARY de la tabla
EMPLOYEES debe estar entre los valores de las columnas LOWEST_SALARY y
HIGHEST_SALARY de la tabla JOB_GRADES. La relacin se obtiene mediante un
operador distinto al de igualdad (=).
En el ejemplo anterior se crea una unin no igualitaria para evaluar el grado del salario
de un empleado. El salario debe estar entre cualquier par de los rangos de salario bajo
y alto.
Podemos ver que todos los empleados aparecen exactamente una vez al ejecutarse
esta consulta. No se repite ningn empleado en la lista. Hay dos motivos:
1. Ninguna de las filas de la tabla de grados de trabajo contiene grados que se solapen. Es
decir, el valor del salario para un empleado slo puede quedar entre los valores de
salario bajo y salario alto de una de las filas de la tabla de grados de salarios.
2. Los salarios de todos los empleados quedan dentro de los lmites que proporciona la
tabla de grados de trabajo. Es decir, ningn empleado gana menos del valor ms bajo
de la columna LOWEST_SAL ni ms del valor ms alto de la columna HIGHEST_SAL.

Nota: Se pueden utilizar otras condiciones (como <= y >=), pero BETWEEN es la ms
sencilla. No nos olvidemos de especificar el valor bajo en primer lugar y el alto al final
cuando usemos BETWEEN.
Se usaron los alias de tabla, por motivos de rendimiento, no por posibles
ambigedades.

Crear tabla JOB_GRADES

Entrar a pgina inicial de base de datos luego entrar como usuario SYS para
gestionar otros usuarios.
Desbloquear hr no olvidar modificar usuario antes de salir, luego conectarse desde SQL
developer:
y tipear el siguiente script.

create table JOB_GRADES (


GRADE_LEVEL VARCHAR2(3),
LOWEST_SAL NUMBER,
HIGHEST_SAL NUMBER);

insert into JOB_GRADES (GRADE_LEVEL, LOWEST_SAL,HIGHEST_SAL)


values ('A',1000, 2999);
insert into JOB_GRADES (GRADE_LEVEL, LOWEST_SAL,HIGHEST_SAL)
values ('B',3000, 5999);
insert into JOB_GRADES (GRADE_LEVEL, LOWEST_SAL,HIGHEST_SAL)
values ('C',6000, 9999);
insert into JOB_GRADES (GRADE_LEVEL, LOWEST_SAL,HIGHEST_SAL)
values ('D',10000, 14999);
insert into JOB_GRADES (GRADE_LEVEL, LOWEST_SAL,HIGHEST_SAL)
values ('E',15000, 24999);
insert into JOB_GRADES (GRADE_LEVEL, LOWEST_SAL,HIGHEST_SAL)
values ('F',25000, 40000);
commit;

Borrar tabla
DROP TABLE JOB_GRADES;

Uniones Externas

Si una fila no satisface una condicin de unin, no aparecer en el resultado de la


consulta. Por ejemplo, en la condicin de unin igualitaria de las tablas EMPLOYEES y
DEPARTMENTS, el identificador de departamento 190 no aparece porque no hay
empleados con ese identificador de departamento registrado en la tabla EMPLOYEES.
En lugar de ver 20 empleados en el juego de resultados, slo ver 19.
Para devolver el registro de departamento que no tiene empleados, podemos usar una
unin externa.
Uniones INNER frente a OUTER

En SQL la unin de dos tablas que devuelve slo filas con


correspondencia se denomina unin interna.
Una unin entre dos tablas que devuelve los resultados de la unin
interna y las filas sin correspondencia de las tablas a la izquierda (o
derecha) se denomina unin externa izquierda (o derecha).
Una unin entre dos tablas que devuelve los resultados de la unin
interna y los resultados de una unin izquierda y derecha es una unin
externa completa.

En otras palabras Unir tablas con las clusulas NATURAL JOIN, USING u ON da como
resultado una unin interna. Las filas sin correspondencias no se muestran en la salida.
Para devolver las filas sin correspondencias, puede utilizar una unin externa. Una
unin externa devuelve todas las filas que satisfacen la condicin de unin y devuelve
tambin algunas o todas las filas de una tabla para las que ninguna fila de la otra tabla
satisface la condicin de unin.
Hay tres tipos de uniones externas:
LEFT OUTER
RIGHT OUTER
FULL OUTER

Ejemplo de LEFT OUTER JOIN


Esta consulta recupera todas las filas de la tabla EMPLOYEES, que es la tabla izquierda
aunque no haya correspondencias en la tabla DEPARTMENTS.

Ejemplo de RIGHT OUTER JOIN


Esta consulta recupera todas las filas de la tabla DEPARTMENTS, que es la tabla
derecha aunque no haya correspondencias en la tabla EMPLOYEES.
Ejemplo de FULL OUTER JOIN
Esta consulta recupera todas las filas de la tabla EMPLOYEES, aunque no haya
correspondencias en la tabla DEPARTMENTS. Tambin recupera todas las filas de la
tabla DEPARTMENTS, aunque no haya correspondencias en la tabla EMPLOYEES.

Resumen
Existen varias formas de unir tablas.
Natural (Natural Join)
En este caso se comparan todas las columnas que tengan el mismo nombre en ambas
tablas. La tabla resultante contiene slo una columna por cada par de columnas con el
mismo nombre.

Combinacin interna (INNER JOIN):


Con esta operacin se calcula el producto cruzado de los registros en la tabla A
combinado con cada registro de la tabla B; pero slo permanecen aquellos registros en
la tabla combinada que satisfacen las condiciones que se especifiquen. Este es el tipo
de JOIN ms utilizado, por lo que es considerado el tipo de combinacin
predeterminado.
Es necesario tener especial cuidado cuando se combinan columnas con valores
nulos NULL, ya que el valor nulo no se combina con otro valor o con otro nulo, excepto
cuando se le agregan predicados tales como IS NULL o IS NOT NULL.

Uniones externas (OUTER JOIN): esta operacin no se requiere que cada registro en las
tablas a tratar tenga un registro equivalente en la otra tabla. El registro es mantenido
en la tabla combinada si no existe otro registro que le corresponda.
PRACTICA:
1-Escriba una consulta para que el departamento de recursos humanos pueda conocer
las direcciones de todos los departamentos. Utilice las tablas LOCATIONS y
COUNTRIES. Muestre en la salida el identificador de ubicacin, el domicilio de calle, la
ciudad, el estado o la provincia y el pas. Utilice una unin natural para generar los
resultados.

2-El departamento de recursos humanos necesita un informe de todos los empleados.


Escriba una consulta para mostrar el apellido, el nmero de departamento y el nombre
de departamento de todos los empleados.

3- El departamento de recursos humanos necesita un informe de los empleados de Toronto.


Muestre el apellido, el puesto, el nmero de departamento y el nombre de departamento de
todos los empleados que trabajan en Toronto.

4-Cree un informe que muestre el apellido del empleado y el nmero de empleado


junto al apellido y nmero de supervisor del supervisor del empleado. Etiquete las
columnas como Employee, Emp#, Manager y Mgr#, respectivamente.

Das könnte Ihnen auch gefallen