Combinaciones internas - INNER JOIN
Las combinaciones internas se realizan mediante la instrucción INNER JOIN.
Devuelven únicamente aquellos registros/filas que tienen valores idénticos en los
dos campos que se comparan para unir ambas tablas. Es decir aquellas que tienen
elementos en las dos tablas, identificados éstos por el campo de relación.
La mejor forma de verlo es con un diagrama de Venn que ilustre en qué parte de la
relación deben existir registros:
En este caso se devuelven los registros que tienen nexo de unión en ambas tablas.
Por ejemplo, en la relación entre las tablas de clientes y pedidos, se devolverán los
registros de todos los clientes que tengan al menos un pedido, relacionándolos por
el ID de cliente.
Esto puede ocasionar la desaparición del resultado de filas de alguna de las dos
tablas, por tener valores nulos, o por tener un valor que no exista en la otra tabla
entre los campos/columnas que se están comparando.
Así, para seleccionar los registros comunes entre la Tabla1 y la Tabla2 que tengan
correspondencia entre ambas tablas por el campo Col1, escribiríamos:
SELECT T1.Col1, T1.Col2, T1.Col3, T2.Col7
FROM Tabla1 T1 INNER JOIN Tabla2 T2 ON T1.Col1 = T2.Col1
Variante LEFT JOIN
Se obtienen todas las filas de la tabla colocada a la izquierda, aunque no tengan
correspondencia en la tabla de la derecha.
Así, para seleccionar todas las filas de la Tabla1, aunque no tengan correspondencia
con las filas de la Tabla2, suponiendo que se combinan por la columna Col1 de ambas
tablas escribiríamos:
SELECT T1.Col1, T1.Col2, T1.Col3, T2.Col7
FROM Tabla1 T1 LEFT JOIN Tabla2 T2 ON T1.Col1 = T2.Col1
Esto se ilustra gráficamente de la siguiente manera:
Por ejemplo, entre dos tablas cliente y pedido se obtienen todos los clientes y sus
pedidos, incluso aunque no tengan pedido alguno. Los que no tienen pedidos
carecen de la relación apropiada entre las dos tablas. Sin embargo se añaden al
resultado final dejando la parte correspondiente a los datos de la tabla de pedidos
con valores nulos, como se puede ver en esta captura:
Variante RIGHT JOIN
Análogamente, usando RIGHT JOIN se obtienen todas las filas de la tabla de la
derecha, aunque no tengan correspondencia en la tabla de la izquierda.
Así, para seleccionar todas las filas de la Tabla2, aunque no tengan correspondencia
con las filas de la Tabla1 podemos utilizar la cláusula RIGHT:
SELECT T1.Col1, T1.Col2, T1.Col3, T2.Col7
FROM Tabla1 T1 RIGHT JOIN Tabla2 T2 ON T1.Col1 = T2.Col1
El diagrama en este caso es complementario al anterior:
Si en nuestra base de datos de ejemplo queremos obtener todos los pedidos aunque
no tengan cliente asociado. Si hubiese algún pedido con el cliente vacío (nulo) se
devolvería también en esta consulta (es decir, órdenes sin clientes), aunque en la
base de datos de ejemplo no se da el caso.
Variante FULL JOIN
Se obtienen todas las filas en ambas tablas, aunque no tengan correspondencia en
la otra tabla. Es decir, todos los registros de A y de B aunque no haya
correspondencia entre ellos, rellenando con nulos los campos que falten:
Es equivalente a obtener los registros comunes (con un INNER) y luego añadirle los
de la tabla A que no tienen correspondencia en la tabla B, con los campos de la tabla
vacíos, y los registros de la tabla B que no tienen correspondencia en la tabla A, con
los campos de la tabla A vacíos.
Su sintaxis es:
SELECT T1.Col1, T1.Col2, T1.Col3, T2.Col7
FROM Tabla1 T1 FULL JOIN Tabla2 T2 ON T1.Col1 = T2.Col1
En este tipo de consultas se regresarían todos los clientes y sus pedidos, los clientes
sin pedido y los pedidos sin cliente.