Sentencia JOIN en SQL para niños
La sentencia JOIN (que significa "unir" o "combinar" en inglés) en SQL es una herramienta muy útil. Permite juntar información de una o más tablas en una base de datos. Imagina que tienes diferentes listas de datos y quieres verlos juntos. ¡Para eso sirve JOIN!
En el Lenguaje de Consultas Estructurado (SQL), existen varios tipos de JOIN para combinar tus datos. Los más comunes son:
- INNER JOIN (Combinación Interna)
- LEFT OUTER JOIN (Combinación Externa Izquierda)
- RIGHT OUTER JOIN (Combinación Externa Derecha)
- FULL OUTER JOIN (Combinación Externa Completa)
- CROSS JOIN (Combinación Cruzada)
Una tabla incluso puede unirse consigo misma. Esto se llama "auto-combinación" o SELF-JOIN.
Contenido
- ¿Cómo funcionan los JOIN? Ejemplos con tablas
- Combinación Interna (INNER JOIN)
- Combinación Externa (OUTER JOIN)
- Combinación Cruzada (CROSS JOIN)
- Galería de imágenes
- Véase también
¿Cómo funcionan los JOIN? Ejemplos con tablas
Para entender mejor cómo funcionan los diferentes tipos de JOIN, usaremos dos tablas de ejemplo. Imagina que son parte de una base de datos de una empresa:
Empleado | |
---|---|
Apellido | IDDepartamento |
Andrade | 31 |
Jordán | 33 |
Steinberg | 33 |
Róbinson | 34 |
Zolano | 34 |
Gaspar | 36 |
Departamento | |
---|---|
NombreDepartamento | IDDepartamento |
Ventas | 31 |
Ingeniería | 33 |
Producción | 34 |
Mercadeo | 35 |
La tabla Empleado tiene los apellidos de las personas y el número del departamento al que pertenecen. La tabla Departamento tiene los nombres de los departamentos y sus números de identificación.
Fíjate que hay un empleado (Gaspar) con un número de departamento (36) que no aparece en la tabla Departamento. También hay un departamento (Mercadeo, ID 35) que no tiene ningún empleado asignado en la tabla Empleado. Esto nos ayudará a ver las diferencias entre los tipos de JOIN.
Combinación Interna (INNER JOIN)
El INNER JOIN es como buscar coincidencias exactas. Solo muestra los registros que tienen un valor que coincide en ambas tablas. Si un registro de una tabla no tiene un compañero en la otra, ¡no aparece en el resultado! Es el tipo de JOIN más usado.
Por ejemplo, si queremos ver qué empleados están en qué departamento, y solo nos interesan los que tienen un departamento válido, usaríamos un INNER JOIN.
Puedes escribir un INNER JOIN de dos maneras:
- Forma explícita: Usando las palabras `INNER JOIN` y `ON`.
- Forma implícita: Poniendo las tablas separadas por comas y usando `WHERE` para la condición.
Es importante saber que los valores "nulos" (que significan "sin valor" o "vacío") no se consideran una coincidencia.
Aquí tienes un ejemplo de cómo se vería la consulta y su resultado:
Ejemplo de INNER JOIN explícita:
SELECT *
FROM empleado
INNER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
Ejemplo de INNER JOIN implícita:
SELECT *
FROM empleado, departamento
WHERE empleado.IDDepartamento = departamento.IDDepartamento
Resultados:
Empleado | Departamento | |||
---|---|---|---|---|
Apellido | IDDepartamento | NombreDepartamento | IDDepartamento | |
Zolano | 34 | Producción | 34 | |
Jordán | 33 | Ingeniería | 33 | |
Róbinson | 34 | Producción | 34 | |
Steinberg | 33 | Ingeniería | 33 | |
Andrade | 31 | Ventas | 31 |
Como puedes ver, el empleado Gaspar (IDDepartamento 36) no aparece. Tampoco el departamento de Mercadeo (IDDepartamento 35). Esto es porque no tienen una coincidencia en la otra tabla.
Combinación Externa (OUTER JOIN)
A diferencia del INNER JOIN, con un OUTER JOIN no es necesario que un registro tenga una coincidencia en la otra tabla para aparecer en el resultado. El registro se mantiene, y si no hay coincidencia, se mostrará un valor nulo (vacío) en los campos de la tabla que no tiene pareja.
Hay tres tipos de OUTER JOIN: LEFT JOIN, RIGHT JOIN y FULL JOIN.
Combinación Externa Izquierda (LEFT JOIN)
El LEFT JOIN siempre muestra todos los registros de la tabla que está a la izquierda (la primera que nombras en tu consulta). Si un registro de la tabla izquierda no tiene una coincidencia en la tabla de la derecha, los campos de la tabla derecha aparecerán como nulos (vacíos).
En nuestro ejemplo, el empleado Gaspar no tiene un departamento válido. Con un LEFT JOIN, Gaspar sí aparecerá en el resultado, pero su información de departamento estará vacía.
Ejemplo de LEFT JOIN:
SELECT *
FROM empleado
LEFT OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
Resultados:
Empleado | Departamento | |||
---|---|---|---|---|
Apellido | IDDepartamento | NombreDepartamento | IDDepartamento | |
Jordán | 33 | Ingeniería | 33 | |
Andrade | 31 | Ventas | 31 | |
Róbinson | 34 | Producción | 34 | |
Zolano | 34 | Producción | 34 | |
Gaspar | 36 | NULL | NULL | |
Steinberg | 33 | Ingeniería | 33 |
LEFT JOIN para encontrar registros sin coincidencia
Si solo quieres ver los registros de la tabla izquierda que NO tienen una coincidencia en la tabla derecha, puedes añadir una condición `WHERE` para buscar los valores nulos.
Ejemplo:
SELECT *
FROM empleado
LEFT OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
WHERE departamento.IDDepartamento IS NULL
Resultados:
Empleado | Departamento | |||
---|---|---|---|---|
Apellido | IDDepartamento | NombreDepartamento | IDDepartamento | |
Gaspar | 36 | NULL | NULL |
Combinación Externa Derecha (RIGHT JOIN)
El RIGHT JOIN es lo opuesto al LEFT JOIN. Siempre muestra todos los registros de la tabla que está a la derecha (la segunda que nombras). Si un registro de la tabla derecha no tiene una coincidencia en la tabla de la izquierda, los campos de la tabla izquierda aparecerán como nulos.
En nuestro ejemplo, el departamento de Mercadeo no tiene empleados. Con un RIGHT JOIN, Mercadeo sí aparecerá en el resultado, pero su información de empleados estará vacía.
Ejemplo de RIGHT JOIN:
SELECT *
FROM empleado
RIGHT OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
Resultados:
Empleado | Departamento | |||
---|---|---|---|---|
Apellido | IDDepartamento | NombreDepartamento | IDDepartamento | |
Zolano | 34 | Producción | 34 | |
Jordán | 33 | Ingeniería | 33 | |
Róbinson | 34 | Producción | 34 | |
Steinberg | 33 | Ingeniería | 33 | |
Andrade | 31 | Ventas | 31 | |
NULL | NULL | Mercadeo | 35 |
RIGHT JOIN para encontrar registros sin coincidencia
Si solo quieres ver los registros de la tabla derecha que NO tienen una coincidencia en la tabla izquierda, puedes añadir una condición `WHERE` para buscar los valores nulos.
Ejemplo:
SELECT *
FROM empleado
RIGHT OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
WHERE empleado.IDDepartamento IS NULL
Resultados:
Empleado | Departamento | |||
---|---|---|---|---|
Apellido | IDDepartamento | NombreDepartamento | IDDepartamento | |
NULL | NULL | Mercadeo | 35 |
Equivalencia entre LEFT JOIN y RIGHT JOIN
LEFT JOIN y RIGHT JOIN son muy parecidos. Todo lo que puedes hacer con uno, lo puedes hacer con el otro. Solo necesitas cambiar el orden de las tablas en tu consulta.
Por ejemplo, el último RIGHT JOIN que hicimos (para encontrar departamentos sin empleados) se puede hacer con un LEFT JOIN si cambiamos el orden de las tablas:
SELECT *
FROM departamento
LEFT OUTER JOIN empleado
ON departamento.IDDepartamento = empleado.IDDepartamento
WHERE empleado.IDDepartamento IS NULL
Resultados:
Departamento | Empleado | |||
---|---|---|---|---|
NombreDepartamento | IDDepartamento | Apellido | IDDepartamento | |
Mercadeo | 35 | NULL | NULL |
Combinación Externa Completa (FULL OUTER JOIN)
El FULL OUTER JOIN es el más completo. Muestra todos los registros de ambas tablas. Si un registro no tiene coincidencia en la otra tabla, sus campos aparecerán como nulos.
En nuestro ejemplo, el FULL OUTER JOIN mostrará a Gaspar (sin departamento) y al departamento de Mercadeo (sin empleados), además de todas las coincidencias.
Ejemplo de FULL OUTER JOIN:
SELECT *
FROM empleado
FULL OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
Resultados:
Empleado | Departamento | |||
---|---|---|---|---|
Apellido | IDDepartamento | NombreDepartamento | IDDepartamento | |
Zolano | 34 | Producción | 34 | |
Jordán | 33 | Ingeniería | 33 | |
Róbinson | 34 | Producción | 34 | |
Gaspar | 36 | NULL | NULL | |
Steinberg | 33 | Ingeniería | 33 | |
Andrade | 31 | Ventas | 31 | |
NULL | NULL | Mercadeo | 35 |
Algunos sistemas de bases de datos no tienen el FULL OUTER JOIN directamente. Pero se puede lograr el mismo resultado combinando un LEFT JOIN y un RIGHT JOIN con la sentencia `UNION`.
Ejemplo usando `UNION`:
SELECT *
FROM empleado
LEFT JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
UNION
SELECT *
FROM empleado
RIGHT JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
FULL JOIN para encontrar registros sin coincidencia en ninguna tabla
Si quieres ver solo los registros que no tienen coincidencia en ninguna de las tablas, puedes añadir una condición `WHERE` para buscar los valores nulos en ambas.
Ejemplo:
SELECT *
FROM empleado
FULL OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
WHERE (empleado.IDDepartamento IS NULL) OR (departamento.IDDepartamento is NULL)
Resultados:
Empleado | Departamento | |||
---|---|---|---|---|
Apellido | IDDepartamento | NombreDepartamento | IDDepartamento | |
Gaspar | 36 | NULL | NULL | |
NULL | NULL | Mercadeo | 35 |
Combinación Cruzada (CROSS JOIN)

El CROSS JOIN es como hacer todas las combinaciones posibles. Toma cada registro de la primera tabla y lo combina con CADA registro de la segunda tabla. Es como si multiplicaras las filas de una tabla por las filas de la otra.
Se usa menos que los otros JOINs, a menos que quieras crear una lista de todas las combinaciones posibles.
Ejemplo de CROSS JOIN explícita:
SELECT *
FROM empleado CROSS JOIN departamento
Ejemplo de CROSS JOIN implícita:
SELECT *
FROM empleado, departamento;
Resultados (solo un fragmento, ya que la tabla completa es muy grande):
Empleado | Departamento | ||
---|---|---|---|
Apellido | IDDepartamento | NombreDepartamento | IDDepartamento |
Andrade | 31 | Ventas | 31 |
Jordán | 33 | Ventas | 31 |
Steinberg | 33 | Ventas | 31 |
Zolano | 34 | Ventas | 31 |
Róbinson | 34 | Ventas | 31 |
Gaspar | 36 | Ventas | 31 |
Andrade | 31 | Ingeniería | 33 |
Jordán | 33 | Ingeniería | 33 |
Galería de imágenes
Véase también
En inglés: Join (SQL) Facts for Kids