Cuando creamos una base de datos, estos últimos se distribuyen entre varias tablas. Esto ocurre ya que nuestro diseño se deriva del modelo relacional de datos, el cual considera a la base de datos como un conjunto de relaciones, las cuales en nuestro gestor se implantan como tablas vinculadas a otras por medio de claves foráneas.
Sin pérdida de generalidad, propondremos como ejemplo una base de datos con dos tablas:
Cliente que posee los atributos
código del cliente y nombre y
Factura que posee como atributos el
número de la factura, su fecha de creación y el código del cliente al que pertenece. Los campos señalados en cursivas son las claves primarias de cada tabla.
Escribiendo cada tabla en forma de relaciones, éstas quedan de la siguiente manera:
cliente (id_cliente,nombre)
factura(id_factura, fecha, id_cliente)
Suponiendo que queremos realizar una consulta que nos permita mostrar los clientes con las facturas que han generado, esto nos coloca en una situación de realizar una vinculación o reunión natural (NATURAL JOIN) entre la tabla de clientes y la tabla de facturas. Esto lo podemos resolver de la siguiente manera:
SELECT * FROM CLIENTE AS C, FACTURA AS F
WHERE C.ID_CLIENTE = F.ID_CLIENTE;
Esto solamente nos mostrará los datos de los clientes sí y sólo sí estos clientes tienen al menos una factura.
Supongamos que ahora queremos mejorar la consulta para que traiga los clientes de nombre
Lugo sin importar que los clientes tengan o no facturas. Al modificar la consulta anterior ésta quedaría de la siguiente manera:
SELECT *
FROM CLIENTE AS C, FACTURA AS F
WHERE C.ID_CLIENTE = F.ID_CLIENTE AND NOMBRE='Lugo';
Esta consulta no traerá el resultado esperado ya que sólo traerá a los clientes cuyo nombre es
Lugo pero con la condición adicional de que haya generado
al menos una factura. Observe que el nuevo enunciado indica que debe mostrarse a las personas de nombre
Lugo sin importar que tenga o no facturas.
Necesitamos hacer una consulta por medio de la cual el gestor de base de datos haga el siguiente trabajo:
- Cruzar todos los datos de la tabla de clientes con la de factura.
- Todos los registros coincidentes de la tabla de clientes y facturas traerlos con sus datos completos tanto de clientes como de factura.
- Si existen clientes que no tengan facturas, traer los datos de cliente como están y los de factura en NULL. (Ya que justamente, estos clientes no tienen datos de facturas)
- Una vez unidos los registros de los pasos 3 y 4, filtrar los de nombre Lugo.
Para realizar esto, ejecutaremos la siguiente consulta:
SELECT * FROM
CLIENTE AS C LEFT OUTER JOIN FACTURA AS F
ON C.ID_CLIENTE = F.ID_CLIENTE
WHERE NOMBRE='Lugo';
Esta consulta hará exactamente lo que hemos descrito en los pasos 1, 2, 3 y 4.
Académicamente, los OUTER JOIN se conocen también como “reuniones”. Existen “reuniones por la izquierda” (LEFT OUTER JOIN) en la cual se combinan los valores de la tabla de la izquierda con los de la derecha (como en este ejemplo) y “reuniones por la derecha” donde se combinan los valores de la tabla de la derecha con los de la izquierda.
Finalizaremos diciendo que un OUTER JOIN es un enlace entre dos tablas en el cual se requiere ver todas las filas de una de ellas sin importar que existan correspondencias en los registros de la otra tabla.