← SQL EspañolChapter 05 of 13

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 →