El lenguaje SQL sigue siendo la “lingua franca” para acceder a todo tipo de datos. Hasta las bases de datos NoSQL acaban siempre ofreciendo algún tipo de interfaz SQL (o como mínimo “SQL-like”) a sus datos semiestructurados para intentar llegar a una audiencia más amplia.

Es por eso que sigue siendo vital para cualquier informático (en su sentido más ámplio) aprender SQL. Ya os presentamos una web para aprender SQL online  (creada por Oracle mismo). Hoy os traemos un clásico que vale la pena guardar en vuestro historial: la guía de referencia rápida para todos los tipos de joins en SQL. La instrucción de Join, como su nombre indica, se usa para enlazar los datos de dos tablas relacionadas a través de algún campo en común (típicamente una “foreign key” o clave foránea) y así dar como resultado filas que mezclan datos provenientes de las dos (o más) tablas sobre las que hemos hecho el Join.

El Join es sin duda una de las operaciones más importantes en SQL pero también una de las más difíciles de entender. Para ilustrar los diferentes tipos de Join, la imagen que encabeza este post ofrece un resumen (utilizando teoría de conjuntos) de como se comporta cada Join. Pasemos a explicar con un poco más de detalle cada uno de ellos:

  • Inner Join. El Join de “toda la vida”. El join per defecto que se aplica cuando no indicamos otra cosa al hacer la consulta. Devuelve sólo aquellas filas donde haya un “match”, es decir, las filas donde el valor del campo de la tabla A que se utiliza para hacer el Join coincida con el valor del campo correspondiente en la tabla B.  Ejemplo: devolver todos los productos para los que haya como mínimo un pedido en los últimos días (el inner join enlazará el campo producto en la tabla Pedido con la clave primária de ese producto en la tabla Producto).
  • Left outer Join. Cuando quieres todas las filas para las que haya match pero también aquellas de la Tabla A que no hagan match. Siguiendo el ejemplo anterior, si quieres listar todos los productos con datos de sus pedidos pero mostrando también aquellos productos para lo que no tengas todavía un pedido, la solución sería hacer una Left Outer join entre Producto y Pedido.
  • Right outer Join.  Exactamente lo mismo pero a la inversa, cuando quieres listar las filas de la tabla B aunque no estén relacionadas con ninguna fila de la tabla A. Es un operador un poco redundante ya que se podría cambiar simplemente el orden de las  tablas en el Join y utilizar un left outer para conseguir el mismo efecto. No obstante, y como parte de Joins múltiples, es útil tener los dos para un mejor comprensión de la consulta
  • Full outer join. Es como la suma de las dos anteriores. Queremos tanto las filas de la A como las de B, tanto si hay match como si no (evidentemente cuando haya match la consulta devolverá todos los campos de A y B que hayamos indicado, cuando no, la consulta devolverá sólo los campos de A o B).

El lector avispado se habrá dado cuenta de qué en la lista anterior faltan tres casos. Para mí, más que tipos diferentes de Join “primitivos” son ya combinaciones de operadores que se pueden expresar con joins o con otras concatenaciones de operadores SQL. Por ejemplo, el Left Join con B.key is null, yo lo hubiera escrito usando el operador NOT IN, diciendo que quiero devolver todas las filas de A que NO se referencian en la tabla B. Me parece una manera más natural de expresarlo que como se indica en el gráfico (aunque como siempre, sobre gustos no hay nada escrito).

Y si con la teoría de conjuntos todavía no conseguís recordar, a lo mejor esta imagen (vista aquí) se quedará más grabada en vuestra memoria:

 

Tipos de Jon con pelos