Académique Documents
Professionnel Documents
Culture Documents
JOINS
Consultas combinadas.
Habitualmente cuando necesitamos recuperar la informacin de una base de datos nos
encontramos con que dicha informacin se encuentra repartida en varias tablas, referenciadas a
travs de varios cdigos. De este modo si tuvieramos una tabla de ventas con un campo cliente,
dicho campo contendra el cdigo del cliente de la tabla de cliente.
Sin embargo est forma de almacenar la informacin no resulta muy util a la hora de consultar
los datos. SQL nos proporciona una forma facil de mostrar la informacin repartida en varias
tablas, las consultas combinadas o JOINS.
Las consultas combinadas pueden ser de tres tipos:
Combinacin interna
Combinacin externa
Uniones
Combinacin interna.
La combinacin interna nos permite mostrar los datos de dos o ms tablas a travs de una
condicin WHERE.
Si recordamos los ejemplos de los capitulos anteriores tenemos una tabla de coches, en la que
tenemos referenciada la marca a travs del cdigo de marca. Para realizar la consulta
combinada entre estas dos tablas debemos escribir una consulta SELECT en cuya
clasula FROM escribiremos el nombre de las dos tablas, separados por comas, y una
condicin WHERE que obligue a que el cdigo de marca de la tabla de coches sea igual al cdigo
de la tabla de marcas.
Lo ms sencillo es ver un ejemplo directamente:
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches, tMarcas
WHERE tCoches.marca = tMarcas.codigo
La misma consulta de forma "visual"...
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
INNER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
La clusula INNER JOIN permite separar completamente las condiciones de combinacin con
otros criterios, cuando tenemos consultas que combinan nueve o diez tablas esto realmente se
agradece. Sin embargo muchos programadores no son amigos de la clusula INNER JOIN, la
razn es que uno de los principales gestores de bases de datos, ORACLE, no la soportaba. Si
nuestro porgrama debia trabajar sobre bases de datos ORACLE no podiamos utilizar INNER
JOIN. A partir de la version ORACLE 9i oracle soporta la clusula INNER JOIN.
Combinacin Externa
La combinacin interna es excluyente. Esto quiere decir que si un registro no cumple la
condicin de combinacin no se incluye en los resultados. De este modo en el ejemplo anterior si
un coche no tiene grabada la marca no se devuelve en mi consulta.
Segn la naturaleza de nuestra consulta esto puede ser una ventaja , pero en otros casos
significa un serio problema. Para modificar este comportamiento SQL pone a nuestra disposicin la
combinacin externa. La combinacin externa no es excluyente.
La sintaxis es muy parecida a la combinacin interna,
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
LEFT OUTER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
Esta consulta devolver todos los registros de la tabla
tCoches, independientemente de que tengan marca o no. En
caso de que el coche no tenga marca se devolver el
valor null para los campos de la tabla tMarcas. Visualmente
consulta devuelve los datos en azul)...
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
el
(la
FROM tCoches
RIGHT OUTER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
Esta consulta devolver los registros de la tabla tCoches que
tengan marca relacionada y todos los registros de la tabla
tMarcas, tengan algn registro en tCoches o no.
Visualmente (la consulta devuelve los datos en azul)...
Union
La clusula UNION permite unir dos o ms conjuntos de resultados en uno detras del otro como
si se tratase de una nica tabla. De este modo podemos obtener los registros de mas de una tabla
"unidos".
La sintaxis corresponde a la de varias SELECT unidas a travs de UNION, como se muestra a
continuacin:
Las consultas a unir deben tener el mismo nmero campos, y adems los campos deben
ser del mismo tipo.
Slo puede haber una nica clausula ORDER BY al final de la sentencia SELECT.
El siguiente ejemplo muestra el uso de UNION
SELECT tCoches.matricula,
tMarcas.marca,
tCoches.modelo,
tCoches.color,
tCoches.numero_kilometros,
tCoches.num_plazas
FROM tCoches
INNER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
UNION
SELECT tMotos.matricula,
tMarcas.marca,
tMotos.modelo,
tMotos.color,
tMotos.numero_kilometros,
0
FROM tMotos
INNER JOIN tMarcas ON tMotos.marca = tMarcas.codigo;
Puede observarse el uso de la constante cero en la segunda lista de seleccin para
hacer coincidir el nmero y tipo de
campos que devuelve la consulta UNION.
Join
La sentencia join en SQL permite combinar registros de dos o ms tablas en una base de datos relacional. En
el Lenguaje de Consultas Estructurado (SQL), hay tres tipo de JOIN: interno, externo, y cruzado.
En casos especiales una tabla puede unirse a s misma, produciendo una auto-combinacin, SELF-JOIN.
Matemticamente, JOIN es composicin relacional, la operacin fundamental en el lgebra relacional, y
generalizando es una funcin de composicin.
Tablas de ejemplo
Todas las explicaciones que estn a continuacin usan las siguientes dos tablas para ilustrar el efecto de
diferentes clases de uniones JOIN.
Tabla Empleado
Apellido
IDDepartamento
Andrade
31
Jordn
33
Steinberg
33
Rbinson
34
Zolano
34
Gaspar
36
Tabla Departamento
NombreDepartamento
IDDepartamento
Ventas
31
Ingeniera
33
Produccin
34
Mercadeo
35
La tabla Empleado contiene los apellidos de los empleados junto al nmero del departamento al que
pertenecen, mientras que la tabla Departamento contiene el nombre de los departamentos de la empresa.
Existen empleados que tienen asignado un nmero de departamento que no se encuentra en la
tabla Departamento (Gaspar). Igualmente, existen departamentos a los cuales no pertenece ningn
empleado (Mercadeo). Esto servir para presentar algunos ejemplos ms adelante.
Combinacin interna (INNER JOIN)
Con esta operacin se calcula el producto cruzado de todos los registros; as cada registro en la tabla A es
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.
SQL:2003 especifica dos formas diferentes para expresar estas combinaciones. La primera, conocida
como explcita usa la palabra JOIN, mientras que la segunda es implcita y usa ',' para separar las tablas a
combinar en la sentencia FROM de la declaracin SELECT. Entonces siempre se genera el producto cruzado
del cual se seleccionan las combinaciones que cumplan lo que indica la sentencia WHERE.
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.
Como ejemplo, la siguiente consulta toma todos los registros de la tabla Empleado y encuentra todas las
combinaciones en la tabla Departamento. La sentencia JOIN compara los valores en la columna
IDDepartamento en ambas tablas. Cuando no existe esta correspondencia entre algunas combinaciones,
stas no se muestran; es decir que si el nmero de departamento de un empleado no coincide con los
nmeros de departamento de la tabla Departamento, no se mostrar el empleado con su respectivo
departamento en la tabla resultante.
Las dos consultas siguientes son similares, y se realizan de manera explicita (A) e implcita (B).
A. Ejemplo de la sentencia INNER JOIN explcita:
SELECT Campos
FROM empleado
INNER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
SELECT Campos
FROM empleado, departamento
WHERE empleado.IDDepartamento = departamento.IDDepartamento
Resultados:
Empleado.Apelli Empleado.IDdepartame departamento.NombreDepartam departamento.IDDepartam
do
nto
ento
ento
Zolano
34
Produccin
34
Jordn
33
Ingeniera
33
Rbinson
34
Produccin
34
Steinberg
33
Ingeniera
33
Andrade
31
Ventas
31
El empleado Gaspar y el departamento de Mercadeo no son presentados en los resultados ya que ninguno de
stos tiene registros correspondientes en la otra tabla. No existe un departamento con nmero 36 ni existe
un empleado con nmero de departamento 35.
A la combinacin que utiliza comparaciones dentro del predicado JOIN se le llama theta-join.
C. Ejemplo de combinacin tipo theta:
SELECT *
FROM empleado
INNER JOIN departamento
ON empleado.IDDepartamento < departamento.IDDepartamento
Las operaciones INNER JOIN puede ser clasificadas como de equivalencia, naturales, y cruzadas.
De equivalencia (equi-join)
Es una especie de theta-join que usa comparaciones de igualdad en el predicado JOIN. Cuando se usan
operadores, tales como < o >no se puede clasificar en este rango.
D. Ejemplo de combinacin de equivalencia:
SELECT *
FROM empleado
INNER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
La tabla resultante presenta dos columnas llamadas IDDepartamento, una proveniente de la tabla Empleado
y otra de la tabla Departamento.
SQL:2003 no tiene una sintaxis especfica para esta clase de combinaciones.
Natural (Natural join)
El resultado es un poco diferente al del ejemplo D, ya que esta vez la columna IDDepartamento se muestra
sola una vez en la tabla resultante.
Empleado.Apellido
IDDepartamento
Departamento.NombreDepartamento
Zolano
34
Produccin
Jordn
33
Ingeniera
Rbinson
34
Produccin
Steinberg
33
Ingeniera
Andrade
31
Ventas
El uso de esta sentencia NATURAL puede producir resultados ambiguos y generar problemas si la base de
datos cambia, porque al aadir, quitar, o renombrar las columnas, puede perder el sentido la sentencia; por
esta razn es preferible expresar el predicado usando las otras expresiones nombradas anteriormente
(ejemplos A y B).
Empleado.IDDeparta
mento
Departamento.NombreDepart
amento
Departamento.IDDeparta
mento
Andrade
31
Ventas
31
Jordn
33
Ventas
31
Steinberg
33
Ventas
31
Zolano
34
Ventas
31
Rbinson
34
Ventas
31
Gaspar
36
Ventas
31
Andrade
31
Ingeniera
33
Jordn
33
Ingeniera
33
Steinberg
33
Ingeniera
33
Solano
34
Ingeniera
33
Rbinson
34
Ingeniera
33
Gaspar
36
Ingeniera
33
Andrade
31
Produccin
34
Jordn
33
Produccin
34
Steinberg
33
Produccin
34
Solano
34
Produccin
34
Rbinson
34
Produccin
34
Gaspar
36
Produccin
34
Andrade
31
Mercadeo
35
Jordn
33
Mercadeo
35
Steinberg
33
Mercadeo
35
Solano
34
Mercadeo
35
Rbinson
34
Mercadeo
35
Gaspar
36
Mercadeo
35
Esta clase de combinaciones son usadas pocas veces, generalmente se les agregan condiciones de filtrado
con la sentencia WHERE para hallar resultados especficos.
Combinacin externa (OUTER JOIN)
Mediante 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.
En SQL:2003 no existe una notacin implcita para las combinaciones externas.
Este tipo de operacin se subdivide dependiendo de la tabla a la cual se le admitirn los registros que no
tienen correspondencia, ya sean de tabla izquierda, de tabla derecha, o combinacin completa.
de tabla izquierda (LEFT OUTER JOIN o LEFT JOIN)
El resultado de esta operacin siempre contiene todos los registros de la tabla de la izquierda (la primera
tabla que se menciona en la consulta), aun cuando no exista un registro correspondiente en la tabla de la
derecha, para uno de la izquierda.
La sentencia LEFT OUTER JOIN retorna la pareja de todos los valores de la tabla izquierda con los valores de
la tabla de la derecha correspondientes, o retorna un valor nulo NULL en caso de no correspondencia.
A diferencia del resultado presentado en los ejemplos A y B (de combinacin interna) donde no se mostraba
el empleado cuyo departamento no exista; en el siguiente ejemplo se presentarn los empleados con su
respectivo departamento, e inclusive se presentar el empleado, cuyo departamento no existe.
H. Ejemplo de tabla izquierda para la combinacin externa:
SELECT *
FROM empleado
LEFT OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
Empleado.Apel
lido
Empleado.IDDeparta
mento
Departamento.NombreDepart
amento
Departamento.IDDeparta
mento
Jordn
33
Ingeniera
33
Andrade
31
Ventas
31
Rbinson
34
Produccin
34
Zolano
34
Produccin
34
Gaspar
36
NULL
NULL
Steinberg
33
Ingeniera
33
Empleado.IDDeparta
mento
Departamento.NombreDepart
amento
Departamento.IDDeparta
mento
Zolano
34
Produccin
34
Jordn
33
Ingeniera
33
Rbinson
34
Produccin
34
Steinberg
33
Ingeniera
33
Andrade
31
Ventas
31
NULL
NULL
Mercadeo
35
En este caso el rea de Mercadeo fue presentada en los resultados, aunque an no hay empleados
registrados en dicha rea.
Empleado.IDDeparta
mento
Departamento.NombreDepart
amento
Departamento.IDDeparta
mento
Zolano
34
Produccin
34
Jordn
33
Ingeniera
33
Rbinson
34
Produccin
34
Gaspar
36
NULL
NULL
Steinberg
33
Ingeniera
33
Andrade
31
Ventas
31
NULL
NULL
Mercadeo
35
Como se puede notar, en este caso se encuentra el empleado Gaspar con valor nulo en su rea
correspondiente, y se muestra adems el departamento de Mercadeo con valor nulo en los empleados de esa
rea.
Algunos sistemas de bases de datos no soportan esta funcionalidad, pero esta puede ser emulada a travs de
las combinaciones de tabla izquierda, tabla derecha y de la sentencia de unin union.
K. El mismo ejemplo puede expresarse as:
SELECT *
FROM empleado
LEFT JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
UNION
SELECT *
FROM empleado
RIGHT JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento