SQL Joins (intersecciones entre tablas en SQL)

Mucho de lo que voy a hablar hoy es lo típico que se te olvida de cuando lo has estudiado, te quedas con lo más frecuente, lo más utilizado, pero SQL trae consigo multitud de herramientas, todas y cada una imprescindibles, para extraer datos con la intersección de 2 o más tablas.

No confundir este post que trata sobre los JOIN (intersecciones) con la sintaxis UNION.

Veamos de las más conocidas a las menos

Inner join

SELECT * FROM A INNER JOIN B ON A.KEY = B.KEY

Esta sencilla consulta nos devolvería los datos que están presente solamente en ambas tablas y su notación sería la siguiente AnB donde n significa intersección.

left outer join

Los que trabajamos con SQL Server y que provenimos de trabajar con MySQL esta sintaxis nos parece extraña y tal vez excluyente porque left join hace lo mismo, y es verdad, es realmente lo mismo, pero MySQL al abreviarlo nos elimina la posibilidad de saber el por qué del OUTER al no incluirlo en sus sintaxis, mientras SQL Server es más pragmático y a pesar de admitir left join cómo válido cada vez que puede el Managment Studio te lo cambia a left outer join.

Una consulta típica sería

SELECT * FROM A LEFT OUTER JOIN B ON A.KEY = B.KEY

Esta consulta nos devolvería todos los datos de la tabla A y para los que estuvieran en la tabla B los datos de esta rellenando con NULL los valores de la tabla B que no estuvieran presentes en A. La sintaxis sería Au(AnB) donde u significa UNION.

RIGHT outer join

Se aplica igual que el punto anterior pero tomando como tabla principal la tabla B (en la misma consulta de muestra).

La sintaxis sería (AnB)uB.

left excluding join

He aquí unos de los grandes desconocidos de SQL y una de las herramientas más atractivas de este lenguaje para las bases de datos. Salvo que realmente este sintaxis no existe, si queremos obtener los datos de la tabla A que no estén en la tabla B deberíamos hacer lo siguiente utilizando WHERE en la siguiente consulta:

SELECT * FROM A LEFT OUTER JOIN B ON A.KEY = B.KEY WHERE B.KEY IS NULL

La notación para esto sería A-B lo cual sería un left join que excluye los resultados del inner join o también llamado componentes relativos.

RIGHT excluding join

Lo mismo que la anterior pero con tabla principal B en la misma consulta, cambiando solo el WHERE de esta manera:

SELECT * FROM A LEFT OUTER JOIN B ON A.KEY = B.KEY WHERE A.KEY IS NULL

La notación sería en este caso B-A

OUTER JOIn  | full outer join | full join

SELECT * FROM A FULL OUTER JOIN B ON A.KEY = B.KEY 

La consulta anterior nos devolvería todos los resultados tanto de una tabla como de la otra así como su intersección.

La sintaxis sería AuBu(AnB)

outer excluding join

Si quisiéramos todos los datos de A y de B menos los que coincidan tendríamos que hacer lo siguiente:

SELECT * FROM A FULL OUTER JOIN B ON A.KEY = B.KEY WHERE A.KEY IS NULL OR B.KEY IS NULL

La sintaxis es (A-B)u(B-A)

De esta forma hemos hecho un repaso de las distintas posibilidades de intersección entre tablas en SQL.

Comentarios

Jose ha dicho que…
Excelente aportación!