Vous êtes sur la page 1sur 12

Consultas combinadas.

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"...

Dmonos cuenta que hemos antepuesto el


nombre de
cada tabla a el nombre del campo, esto no es
obligatorio
si los nombres de campos no se repiten en
las tablas,
pero es acondajable para evitar conflictos de
nombres
entre campos. Por ejemplo, si para referirnos al campo marca no anteponemos el nombre del
campo la base de datos no sabe si queremos el campo marca de la tabla tCoches, que contiene el
cdigo de la marca, o el campo marca de la tabla tMarcas, que contiene el nombre de la marca.
Otra opcin es utilizar la clusula INNER JOIN. Su sintaxis es identica a la de una
consulta SELECT habitual, con la particularidad de que n la clusula FROM slo aparece una
tabla o vista, aadiendose el resto de tablas a travs de clusulas INNER JOIN .

SELECT [ALL | DISTINCT ]


<nombre_campo> [{,<nombre_campo>}]
FROM <nombre_tabla>
[{INNER JOIN <nombre_tabla> ON <condicion_combinacion>}]
[WHERE <condicion> [{ AND|OR <condicion>}]]
[GROUP BY <nombre_campo> [{,<nombre_campo >}]]
[HAVING <condicion>[{ AND|OR <condicion>}]]
[ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC]
[{,<nombre_campo>|<indice_campo> [ASC | DESC ]}]]
El ejemplo anterior escrito utilizando la clausula INNER JOIN quedaria de la siguiente manera:

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 [ALL | DISTINCT ]


<nombre_campo> [{,<nombre_campo>}]
FROM <nombre_tabla>
[{LEFT|RIGHT OUTER JOIN <nombre_tabla> ON <condicion_combinacion>}]
[WHERE <condicion> [{ AND|OR <condicion>}]]
[GROUP BY <nombre_campo> [{,<nombre_campo >}]]
[HAVING <condicion>[{ AND|OR <condicion>}]]
[ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC]
[{,<nombre_campo>|<indice_campo> [ASC | DESC ]}]]
La combinacin externa puede ser diestra o siniestra, LEFT OUTER JOIN o RIGHT OUTER
JOIN. Con LEFT OUTER JOIN obtenemos todos los registros de en la tabla que situemos a la
izquierda de la clusula JOIN, mientras que con RIGHT OUTER JOIN obtenmos el efecto
contrario.
Como mejor se ve la combinacin externa es con un ejemplo.

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)...

El mismo ejemplo con RIGHT OUTER JOIN.

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:

SELECT [ALL | DISTINCT ]


<nombre_campo> [{,<nombre_campo>}]
FROM <nombre_tabla>
[{LEFT|RIGHT OUTER JOIN <nombre_tabla> ON <condicion_combinacion>}]
[WHERE <condicion> [{ AND|OR <condicion>}]]
[GROUP BY <nombre_campo> [{,<nombre_campo >}]]
[HAVING <condicion>[{ AND|OR <condicion>}]]
{
UNION [ALL | DISTINCT ]
SELECT [ALL | DISTINCT ]
<nombre_campo> [{,<nombre_campo>}]
FROM <nombre_tabla>
[{LEFT|RIGHT OUTER JOIN <nombre_tabla> ON <condicion_combinacion>}]
[WHERE <condicion> [{ AND|OR <condicion>}]]
[GROUP BY <nombre_campo> [{,<nombre_campo >}]]
[HAVING <condicion>[{ AND|OR <condicion>}]]
}
[ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC]
[{,<nombre_campo>|<indice_campo> [ASC | DESC ]}]]
Para utilizar la clusula UNION debemos cumplir una serie de normas.

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

B. Ejemplo de la sentencia INNER JOIN implcita:

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)

Es una especializacin de la combinacin de equivalencia, anteriormente mencionada. 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.
E. Ejemplo de combinacin natural:
SELECT *
FROM empleado NATURAL JOIN departamento

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).

Cruzada (Cross join)


Presenta el producto cartesiano de todos los registros de las dos tablas.
El cdigo SQL para realizar este producto cartesiano enuncia las tablas que sern combinadas, pero no
incluye algn predicado que filtre el resultado.
F. Ejemplo de combinacin cruzada explcita:
SELECT *
FROM empleado CROSS JOIN departamento

G. Ejemplo de combinacin cruzada implcita:


SELECT *
FROM empleado, departamento;
Empleado.Apel
lido

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

de tabla derecha (RIGHT OUTER JOIN o RIGHT JOIN)


Esta operacin es inversa a la anterior; el resultado de esta operacin siempre contiene todos los registros de
la tabla de la derecha (la segunda tabla que se menciona en la consulta), aun cuando no exista un registro
correspondiente en la tabla de la izquierda, para uno de la derecha.
La sentencia RIGHT OUTER JOIN retorna la pareja de todos los valores de la tabla derecha con los valores de
la tabla de la izquierda correspondientes, o retorna un valor nulo NULL en caso de no correspondencia.
I. Ejemplo de tabla derecha para la combinacin externa:
SELECT *
FROM empleado
RIGHT OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
Empleado.Apel
lido

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.

Combinacin completa (FULL OUTER JOIN)


Esta operacin presenta los resultados de tabla izquierda y tabla derecha aunque no tengan correspondencia
en la otra tabla. La tabla combinada contendr, entonces, todos los registros de ambas tablas y presentar
valores nulos NULLs para registros sin pareja.
J. Ejemplo de combinacin externa completa:
SELECT *
FROM empleado
FULL OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
Empleado.Apel
lido

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

WHERE empleado.IDDepartamento IS NULL

Vous aimerez peut-être aussi