Diferencia entre inner join, left join y right join. SQL

Hoy otra cuestión a petición de un lector que decía que su nivel de inglés no era el suficiente para orientarse con la muy válida explicación que hay en StackOverflow que hasta incluye este útil diagrama:

Uniones entre tablas SQL
Diferentes tipos de uniones entre tablas

Si bien finalmente encontró una válida explicación en otras páginas (hay unas cuantas) me da pie para esta entrada. ¿Qué diferencia hay entre un inner join y un left o un right join?

Las más comunes suelen ser las uniones internas entre tablas (inner join), como ejemplo os diré que en los últimos seis meses, desde que empecé en mi actual trabajo, he tenido que hacer sólo 3 uniones externas mientras que internas he hecho docenas. Un inner join, si miráis el diagrama, se podría representar como la intersección entre dos conjuntos, es decir, una consulta con inner join mostraría los registros de las tablas que coincidan en los campos de la unión que se ha definido en dicha consulta. Dicho así es denso, pero con un ejemplo se entiende claro.

Supongamos que tenemos una tabla con los empleados de una empresa (con un identificador llamado Id, un campo de nombre, uno de apellidos y uno con el Id del departamento en que trabaja llamado IdDepartamento) y en otra tenemos los departamentos (Id y Nombre). Algunos trabajadores tienen un departamento asignado y otros no, y obviamente la relación entre ambas tablas se da entre el campo Id de Departamento con el campo IdDepartamento de la tabla Empleados. Utilizando un inner join podríamos obtener el listado de todos los trabajadores que tienen un departamento asignado:

select e.nombre, e.apellidos from empleados e inner join departamentos d on e.IdDepartamento=d.Id;

En cuanto al enlace externo tenemos dos opciones: left join y right join. Con esta unión recuperamos todos los enlaces de una tabla y los datos de la otra que coinciden con la condición definida en la consulta. Cuando usamos una unión left join recogemos todos los datos de la tabla que está a la izquierda de la unión en la consulta y si usamos en cambio right join las de la derecha. Imaginemos las tablas de antes, pero ahora queremos todos los datos de la tabla empleados, tengan o no departamento, y además el dato de en qué departamento están si lo tuvieran. Usaremos un left join para obtener los datos.

select e.nombre, e.apellidos from empleados e left join departamentos d on e.IdDepartamento=d.Id

En este caso obtendríamos los nombres y apellidos de todos los empleados, los departamentos de los que lo tenga y en los que no recibiríamos un campo con un valor NULL.

Finalmetne tendríamos opciones como el full outer join o producto cartesiano, que nos sacaría todos los valores de ambas tablas.

A partir de esto y mezclando varias tablas y condiciones extra en una cláusula WHERE podemos lograr resultados más complejos.