Uniones Internas (Inner Join) y Uniones Externas (Left Join, Right Join, Outer Join, Full Join)
Interseccion Horizontal – INNER JOIN
Mientras que la Intersección (Teoría de Conjuntos) nos devuelve filas que son idénticas en dos conjuntos, el INNER JOIN utiliza esa misma lógica de “coincidencia” para pegar columnas de una tabla con columnas de otra.

El INNER JOIN busca registros en la Tabla A que tengan una correspondencia exacta en la Tabla B, basándose en una columna común (generalmente una Llave Primaria y una Llave Foránea). Si un registro no tiene pareja en la otra tabla, se descarta del resultado.
Sintaxis básica:
SELECT
alias_tabla.columna_1, alias_tabla.columna_2, ..., alias_tabla.columna_n
FROM
tabla_1 AS alias_tabla_1
INNER JOIN
tabla_2 AS alias_tabla_2 ON alias_tabla_1.columna_comun = alias_tabla_2.columna_comun
El uso de alias en los nombres de las tablas es importante para que el código sea legible y para decirle al motor exactamente de qué tabla obtener las columnas, pues en ocasiones, de tablas diferentes obtenemos columnas con el mismo nombre y es necesario saber a qué columna de qué tabla nos referimos.
En este punto es importante considerar que el INNER JOIN es generalmente la unión más rápida y eficiente. Sin embargo, hay un peligro: la pérdida de datos. Si tu resultado debe mostrar tuplas de la tabla_1, incluso las que no tienen correspondencia en la tabla_2, el INNER JOIN daría un resultado incompleto. Ahí es donde entran las Uniones Externas (LEFT y RIGHT JOIN).
El escenario más común en la vida real es no tener datos incompletos o registros que no tienen una pareja en la otra tabla. Para resolver esto, usamos las Uniones Externas (Outer Joins).
LEFT JOIN (La unión por la izquierda)
El LEFT JOIN devuelve todos los registros de la tabla de la izquierda (Tabla 1), y los registros coincidentes de la tabla de la derecha (Tabla 2). Si no hay coincidencia, los campos de la Tabla 2 aparecerán como NULL.
Sintaxis:
SELECT
alias_tabla.columna_1, alias_tabla.columna_2, ..., alias_tabla.columna_n
FROM
tabla_1 AS alias_tabla_1
LEFT JOIN
tabla_2 AS alias_tabla_2 ON alias_tabla_1.columna_comun = alias_tabla_2.columna_comun
RIGHT JOIN (La unión por la derecha)
Esta operación devuelve todos los registros de la tabla de la derecha (Tabla 2) y las coincidencias de la izquierda. Si no hay coincidencia, los campos de la Tabla 1 aparecerán como NULL.
SELECT
alias_tabla.columna_1, alias_tabla.columna_2, ..., alias_tabla.columna_n
FROM
tabla_1 AS alias_tabla_1
RIGHT JOIN
tabla_2 AS alias_tabla_2 ON alias_tabla_1.columna_comun = alias_tabla_2.columna_comun
FULL OUTER JOIN (La unión total)
Esta operación devuelve todos los registros de ambas tablas. Si hay coincidencia, los junta; si no, rellena con NULL el lado que falte. Es la unión de un LEFT y un RIGHT.
SELECT
alias_tabla.columna_1, alias_tabla.columna_2, ..., alias_tabla.columna_n
FROM
tabla_1 AS alias_tabla_1
FULL [OUTER] JOIN
tabla_2 AS alias_tabla_2 ON alias_tabla_1.columna_comun = alias_tabla_2.columna_comun
En resumen:
- INNER JOIN: “Solo los que tienen pareja”.
- LEFT JOIN: “Todos los de la izquierda + sus parejas (si tienen)”.
- RIGHT JOIN: “Todos los de la derecha + sus parejas (si tienen)”.
- FULL JOIN: “Todos los de ambos lados”.
El 90% de las veces se emplea LEFT JOIN. En la práctica, solemos poner la tabla principal (la que tiene más datos o la que queremos conservar íntegra) a la izquierda y traer información complementaria de la derecha. El RIGHT JOIN a veces se evita simplemente invirtiendo el orden de las tablas en el FROM y usando un LEFT JOIN.
Self-Join
Un Self-Join no es un comando nuevo (no escribes SELF JOIN). Es simplemente un INNER JOIN o un LEFT JOIN donde una tabla se une consigo misma.
¿Para qué sirve?
- Para comparar filas dentro de la misma tabla.
- Para consultar estructuras jerárquicas (ej. una tabla de empleados donde una columna es
id_jefe, que apunta alid_empleadode la misma tabla). - Para encontrar relaciones entre registros que comparten una característica.
En estos casos los alias son obligatorios, ya que como se utiliza la misma tabla dos veces, el motor de la base de datos no sabrá de qué “lado” estás llamando a la columna a menos que le des nombres distintos a cada instancia.