DQL

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 al id_empleado de 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.