Joins
## Objetivos de Aprendizaje
- Entender las relaciones entre tablas
- Dominar INNER JOIN
- Usar LEFT y RIGHT JOIN
- Trabajar con múltiples joins
## ¿Por Qué Usar Joins?
Combinar datos de múltiples tablas:
```sql
-- Sin join: incompleto
SELECT first_name, department
FROM employees;
-- El resultado no muestra detalles del departamento, solo nombres
-- Con join: completo
SELECT
e.first_name,
d.department_name,
d.location
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
```
## Alias de Tablas
```sql
SELECT
e.first_name,
d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
```
## INNER JOIN
### Sintaxis Básica
```sql
SELECT
e.first_name,
e.last_name,
d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
```
### Solo Filas que Coinciden
Solo filas con coincidencias en AMBAS tablas:
```text
employees departments
+-----------+ +----+----------------+
| dept_id | | id | name |
+-----------+ +----+----------------+
| 1 | ---> | 1 | Engineering |
| 2 | ---> | 2 | Sales |
| 3 | | 3 | Marketing |
+-----------+ +----+----------------+
Resultado (INNER JOIN en dept_id = id):
+-------------+----------------+
| employee | department |
+-------------+----------------+
| Alice | Engineering |
| Bob | Sales |
+-------------+----------------+
(Empleado con dept_id=3 excluido - sin coincidencia)
```
### Usando WHERE con JOIN
```sql
SELECT
e.first_name,
d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id
WHERE d.location = 'New York';
```
## LEFT JOIN (LEFT OUTER JOIN)
### Todo de Izquierda + Coincidencia de Derecha
```sql
SELECT
e.first_name,
d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
```
### Resultado de LEFT JOIN
```text
employees departments
+-----------+ +----+----------------+
| dept_id | | id | name |
+-----------+ +----+----------------+
| 1 | ---> | 1 | Engineering |
| 2 | ---> | 2 | Sales |
| NULL | | | (sin coincidencia) |
+-----------+ +----+----------------+
Resultado: Todos los empleados, department es NULL para los sin coincidencia
```
### Ejemplo Práctico
```sql
-- Empleados con o sin departamento
SELECT
e.first_name,
e.last_name,
d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
```
## RIGHT JOIN (RIGHT OUTER JOIN)
### Todo de Derecha + Coincidencia de Izquierda
```sql
SELECT
e.first_name,
d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id;
```
### Resultado de RIGHT JOIN
```text
-- Todos los departamentos, empleados mostrados si coinciden
-- Departamento sin empleados aún aparece
```
## FULL OUTER JOIN
### Todas las Filas de Ambas
```sql
SELECT
e.first_name,
d.department_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.id;
```
### Resultado de FULL OUTER JOIN
Todas las filas de ambas tablas, NULLs donde no hay coincidencia.
## CROSS JOIN
### Producto Cartesiano
Cada fila de la primera tabla se une con cada fila de la segunda:
```sql
SELECT
e.first_name,
d.department_name
FROM employees e
CROSS JOIN departments d;
```
### Cuándo Evitarlo
Usualmente produce conjuntos de resultados enormes (m * n filas).
### Caso de Uso: Generar Combinaciones
```sql
-- Todas las combinaciones de color/talla
SELECT
c.color_name,
s.size_name
FROM colors c
CROSS JOIN sizes s;
```
## Múltiples Joins
### Tres Tablas
```sql
SELECT
e.first_name,
d.department_name,
l.city
FROM employees e
INNER JOIN departments d ON e.department_id = d.id
INNER JOIN locations l ON d.location_id = l.id;
```
### El Orden de Join Importa
```sql
-- Diferente orden de join, mismo resultado
SELECT ...
FROM employees e
JOIN departments d ON ...
JOIN locations l ON ...
```
## Self Join
### Unir una Tabla a Ella Misma
```sql
-- Encontrar empleados y sus gerentes
SELECT
e.first_name AS employee,
m.first_name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id;
```
### Resultado del Self Join Ejemplo
```text
employee | manager
----------+----------
Alice | NULL (nivel superior)
Bob | Alice
Carol | Alice
Dave | Bob
```
## Sintaxis de Join Implícito (Legado)
```sql
-- Estilo antiguo - evitar esto
SELECT
e.first_name,
d.department_name
FROM employees e, departments d
WHERE e.department_id = d.id;
-- Estilo moderno - usar JOIN explícito
SELECT ...
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
```
## JOIN con NULL
```sql
-- Coincidir en NULL (usualmente no es lo que quieres)
SELECT *
FROM employees e
JOIN departments d ON e.department_id = d.id
-- NULL = NULL no coincide!
-- Si tienes department_ids NULL que quieres coincidir:
-- Usa LEFT JOIN en su lugar
```
## Resumen
- **INNER JOIN**: Solo filas que coinciden de ambas tablas
- **LEFT JOIN**: Todas las filas de la tabla izquierda, coincidencia de la derecha
- **RIGHT JOIN**: Todas las filas de la tabla derecha, coincidencia de la izquierda
- **FULL OUTER JOIN**: Todas las filas de ambas tablas
- **CROSS JOIN**: Cada combinación (evitar a menos que sea intencional)
- Usa `ON` para condiciones de join, no `WHERE`
- Usa alias de tablas para legibilidad
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →