/

/

SQL JOIN: Todos los Tipos con Ejemplos Prácticos

Content

SQL JOIN: Todos los Tipos con Ejemplos Prácticos

SQL JOIN: Todos los Tipos con Ejemplos Prácticos

¿Qué es un JOIN en SQL?

Un JOIN combina filas de dos o más tablas basándose en una columna relacionada. Es una de las operaciones más importantes y poderosas de SQL.

Los 4 Tipos Principales de JOIN

Datos de Ejemplo

Tabla: empleados

| id | nombre | departamento_id |

|----|--------|-----------------|

| 1 | Ana | 1 |

| 2 | Carlos | 2 |

| 3 | María | 1 |

| 4 | Pedro | NULL |

Tabla: departamentos

| id | nombre |

|----|--------|

| 1 | Ventas |

| 2 | Marketing |

| 3 | IT |

---

1. INNER JOIN

Retorna solo las filas que tienen coincidencia en ambas tablas.

SELECT e.nombre, d.nombre as departamento
 FROM empleados e
 INNER JOIN departamentos d ON e.departamento_id = d.id;

Resultado:

| nombre | departamento |

|--------|--------------|

| Ana | Ventas |

| Carlos | Marketing |

| María | Ventas |

> Pedro no aparece porque tiene departamento_id = NULL

---

2. LEFT JOIN (LEFT OUTER JOIN)

Retorna todas las filas de la tabla izquierda y las coincidencias de la derecha.

SELECT e.nombre, d.nombre as departamento
 FROM empleados e
 LEFT JOIN departamentos d ON e.departamento_id = d.id;

Resultado:

| nombre | departamento |

|--------|--------------|

| Ana | Ventas |

| Carlos | Marketing |

| María | Ventas |

| Pedro | NULL |

> Pedro aparece con departamento NULL

---

3. RIGHT JOIN (RIGHT OUTER JOIN)

Retorna todas las filas de la tabla derecha y las coincidencias de la izquierda.

SELECT e.nombre, d.nombre as departamento
 FROM empleados e
 RIGHT JOIN departamentos d ON e.departamento_id = d.id;

Resultado:

| nombre | departamento |

|--------|--------------|

| Ana | Ventas |

| María | Ventas |

| Carlos | Marketing |

| NULL | IT |

> IT aparece aunque no tiene empleados asignados

---

4. FULL OUTER JOIN

Retorna todas las filas cuando hay coincidencia en cualquiera de las tablas.

-- MySQL no soporta FULL OUTER JOIN directamente
 -- Se simula con UNION:
 SELECT e.nombre, d.nombre as departamento
 FROM empleados e
 LEFT JOIN departamentos d ON e.departamento_id = d.id
 UNION
 SELECT e.nombre, d.nombre as departamento
 FROM empleados e
 RIGHT JOIN departamentos d ON e.departamento_id = d.id;

Resultado:

| nombre | departamento |

|--------|--------------|

| Ana | Ventas |

| Carlos | Marketing |

| María | Ventas |

| Pedro | NULL |

| NULL | IT |

---

JOINs Adicionales

CROSS JOIN

Producto cartesiano: combina cada fila de una tabla con todas las filas de la otra.

SELECT e.nombre, d.nombre as departamento
 FROM empleados e
 CROSS JOIN departamentos d;

Uso: Generar todas las combinaciones posibles

SELF JOIN

Una tabla se une consigo misma.

-- Ejemplo: encontrar empleados con el mismo departamento
 SELECT e1.nombre, e2.nombre as colega
 FROM empleados e1
 INNER JOIN empleados e2
  ON e1.departamento_id = e2.departamento_id
  AND e1.id != e2.id;

---

Múltiples JOINs

SELECT
  e.nombre as empleado,
  d.nombre as departamento,
  p.nombre as proyecto
 FROM empleados e
 INNER JOIN departamentos d ON e.departamento_id = d.id
 INNER JOIN proyectos p ON e.id = p.empleado_id;

Condiciones en JOIN vs WHERE

En el JOIN

SELECT e.nombre, p.nombre as proyecto
 FROM empleados e
 LEFT JOIN proyectos p
  ON e.id = p.empleado_id
  AND p.estado = 'activo';

> Mantiene todos los empleados, filtra solo proyectos activos

En el WHERE

SELECT e.nombre, p.nombre as proyecto
 FROM empleados e
 LEFT JOIN proyectos p ON e.id = p.empleado_id
 WHERE p.estado = 'activo';

> Filtra el resultado final, elimina empleados sin proyectos activos

Optimización de JOINs

1. Usa Índices

CREATE INDEX idx_emp_dept ON empleados(departamento_id);

2. Especifica Columnas

-- Malo
 SELECT * FROM empleados e JOIN departamentos d


3. Ordena las Tablas

Coloca la tabla más pequeña primero (en algunos motores mejora performance).

Errores Comunes

Error 1: Olvidar la Condición ON

-- Esto genera un CROSS JOIN accidental
 SELECT * FROM empleados, departamentos;

Error 2: Columnas Ambiguas

-- Error: ambiguous column 'nombre'
 SELECT nombre FROM empleados e JOIN departamentos d ON e.departamento_id = d.id;


Error 3: NULL en JOINs

-- NULL nunca es igual a NULL
 -- Usar COALESCE o IS NULL cuando sea necesario

Cuándo Usar Cada JOIN

| Tipo | Usa Cuando... |

|------|---------------|

| INNER | Solo necesitas datos que existen en ambas tablas |

| LEFT | Necesitas todos los registros de la tabla principal |

| RIGHT | Necesitas todos los registros de la tabla secundaria |

| FULL | Necesitas todos los registros de ambas tablas |


Conclusión

Dominar los JOINs es esencial para cualquier trabajo con SQL. Con práctica, elegir el tipo correcto se vuelve intuitivo.

---

Tip: Usa AI2sql para generar JOINs complejos automáticamente y aprende de las consultas generadas.

Share this

More Articles