Está en la página 1de 30

18 de Octubre del 2021

¿Qué es JOIN?
La sentencia del “SQL JOIN” es uno de los componentes principales de la
sentencia Select, que se utiliza para extraer datos del “SQL Server”.
¿Qué son las Multi tablas?
Las consultas multitabla nos permiten consultar información en más de una tabla.
La única diferencia respecto a las consultas sencillas es que vamos a tener que
especificar en la cláusula FROM cuáles son las tablas que vamos a usar y cómo
las vamos a relacionar entre sí.
En retrospectiva, JOIN y las Multitablas son lo mismo.
¿Para qué sirve un JOIN?
 Un JOIN nos permitirá compartir información entre diferentes tablas.
 Obtener información de más de una tabla, lo cual es producto de una buena
normalización.
 Porque le DADO el campo de una tabla en FUNICION al contenido de ese
campo podemos buscar más información que nos complementes el campo.
Ejemplo:
“Reporte que me dé el puesto de cada empleado” (se genera una tabla temporal
para mostrar los datos).
TIPOS DE JOIN:
El JOIN se divide en dos tipos: el INNER JOIN y OUTER JOINT.
 INNER JOIN: Tiene como propósito regresar TODOS los registros que hagan
MATCH (Que coincidan). A su vez también se clasifica en otro tipo de JOINS:
¿Cuándo saber si es un EQUIJON?
Un JOIN es un EQUIJOIN cuando el condicional está buscando un IGUAL (=).
¿Cuándo saber si es un NONEJOIN?
Un JOIN es un NONEJOIN cuando el condicional está buscando un RANGO (>, <,
<>, BETWEEN, IN, LIKE).
o NATURAL JOIN.

o USING JOIN.

o ON JOIN.

 OUTER JOIN: Tiene como propósito regresar TODOS los registros que no
hagan MATCH (Que no coincidan, DEPENDE de que es lo que se pide). A su
vez también se clasifica en otro tipo de JOINS:

o OUTER LEFT JOIN: Regresa los datos que no cumple en la tabla


Employees.

o OUTER FULL JOIN: Regresa tanto los que no cumplen en la tabla


Employees como los que no cumplen en la tabla Jobs.

o OUTER RIGTH JOIN: Regresa los datos que no cumplen en la tabla


Jobs.

OTROS TIPOS DE JOIN:


 SELF JOIN: Puede ser acomodado dentro del INNER JOIN, por que viene
siendo UNA IGUALDAD.

 CROSS JOIN: Muestran todas las combinaciones de todos los registros de


las tablas combinadas. Para este tipo de JOIN no se incluye una condición
de enlace.
NATURAL JOIN: Para que funcione un NATURAL JOIN es necesario que haya
una relación entre una llave primaria y una llave foránea dentro de la tabla, que
sean del mismo tipo de dato y de la misma longitud.
 Debe existir al menos un campo en común entre las tablas a recuperar los
datos.
 Generalmente los datos en común son PK y FK de las tablas.
 La condición para recuperar datos es que el campo (Por recomendación
solo un campo en común) de la primera tabla es exactamente igual al
campo de la segunda tabla (NOMBRE y TIPO DE DATO).
 NO es necesario especificar el campo sobre el que se hará el MATCH
(Coincidencia).
Ejemplo:
“Por cada localidad, dime a que departamento pertenece”.
Select location_id as “Localidad”, department_name as “Nombre del
Departamento”
From departments NATURAL JOIN locations;

Explicación: Para cada localidad que tenga yo, me va a buscar a que


departamento pertenece esa localidad. Por lo tanto encontró y mostró solo los
resultados que hicieron MATCH (Coincidieron con la localidad y el departamento)
y el resto que NO COINCIDIERON fueron DESCARTADOS.
Uso Adecuado de Alias.
 Evita ambigüedad al recuperar campos con el mismo nombre de diferentes
tablas.
 Alias en las tablas:
Nombre tabla ALIAS
 Cada campo a recuperar que se repita, se le debe anteponer el ALIAS de la
tabla a la que pertenece:
EJ Tabla EMPLOYEES ALIAS E CAMPO LAST_NAME
ELAST_NAME
JOIN USING: Para que funcione un JOIN USING es necesario que los campos se
llamen de la misma manera (TRABAJARA SOBRE UN CAMPO ESPECIFICO).
 Los campos con los que se hará el JOIN, deben tener el mismo nombre y ser
compatibles.

 Columnas comunes entre tablas:


“Se pide un reporte donde esté el apellido de los empleados, el id de
departamento y el nombre del departamento al que pertenecen”. (Por que la única
forma de realizar este reporte es haciendo un JOIN entre la tabla employees y
departments, usando el CAMPO ESPECIFICO department_id).
Select last_name, department_id, department_name
From employees JOIN departments USING(department_id);
Asegura con que columna(s) hacer match (ser compatibles).

 Errores por ser mismo dato de dos tablas diferentes:


“En este caso, se agregó un nuevo campo (manager_id) el cual coincide en ambas
tablas, lo cual desencadenará una ambigüedad, porque no se sabe si viene de la
tabla employees o de la tabla departments, causando un error”.
Select last_name, department_id, Department_name, manager_id
From employees JOIN departments USING(department_id);
 Para eliminar Ambigüedad usamos la siguiente etiqueta:
“Se pide un reporte donde esté el apellido de los empleados, el id de
departamento y el nombre del departamento al que pertenecen, incluyendo el id
de los manager de los empleados.” (Por que la única forma de realizar este
reporte es haciendo un JOIN entre la tabla employees y departments, usando el
CAMPO ESPECIFICO department_id).
Select last_name, department_id, Department_name, E.manager_id
From employees E JOIN departments D
USING(department_id);


Otro ejemplo seria:
“Se pide un reporte donde esté el id de departamento, el nombre del
departamento, los id de los managers de los empleados y los id de los manager de
los departamentos”. (Por que la única forma de realizar este reporte es haciendo
un JOIN entre la tabla employees y departments, usando el CAMPO ESPECIFICO
department_id).
Select department_id dep, department_name nom,
employees.manager_id emp, departments.manager_id depart
From employees JOIN departments USING(department_id);
 Si se requiere un JOIN con más de un campo, realizamos lo siguiente:
“Se requiere un reporte que contenga el apellido de los empleados, id de
departamento, nombre del departamento e id del manager ” (Por que la única
forma de realizar este reporte es haciendo un JOIN entre la tabla employees y
departments, usando los CAMPOS ESPECIFICOS department_id y manager_id).
Select last_name, department_id, department_name, manager_id
From employees e JOIN departments d
USING (department_id, manager_id);

Ejemplo: “Generar un reporte agrupador por el nombre del departamento, el


salario mínimo por departamento y el departamento debe de estar entre 20 y 170”.
Select department_name, min(salary)
From employees JOIN departments USING(department_id)
WHERE department_id BETWEEN 20 and 170
Group by department_name;

Ejemplo: “Obtener un reporte con los apellidos de los empleados, el nombre de


sus departamentos, el salario y donde los salarios estén entre los $2,900 y los
$7,000”.
Select last_name, department_name, salary
From employees
JOIN departments USING(department_id)
WHERE salary BETWEEN 2900 AND 7000;


JOIN ON: Para que funcione un JOIN ON es necesario que tenga desde un
campo hasta N campos, es casi similar al JOIN USING, sin embargo el JOIN ON
nos permite hacer JOIN entre diferentes tablas donde los campos se llamen de
forma diferente, pero donde sean iguale en tipo de dato y longitud, CALIFICANDO
DE DONDE VIENE CADA COSA.
 Es el JOIN que da mayor control y flexibilidad entre tablas.
 Las columnas deben ser compatibles .
 Se debe calificar las columnas a elegir y las tablas para evitar ambigüedad,
para esto SE USAN ALIAS.
 Columnas comunes entre tablas debe estar calificadas, ejemplo:
“Se requiere un reporte que contenga el apellido de los empleados, el id de los
departamentos (proveniente la tabla departments), nombre del departamento y el
id del manager (proveniente la tabla employees)”. (La única forma de realizar este
reporte es haciendo un JOIN ON entre la tabla employees y departments, usando
los sus ALIAS “e, d”, comparando department_id’s de “e, d” y comparando
manager_id’s de “e y d”).
Select last_name, d.department_id, department_name, e.manager_id
From employees e JOIN departments d
ON e.department_id = d.department_id AND e.manager_id = d.manager_id;

Ejemplo: “Se requiere conocer el apellido de los empleados, los id de los trabajos
y que significan esos id”. (usando los sus ALIAS “e, j”, comparando los
employee_id’s de “e, j” y comparando los job_id’s de “e y j”). Quedan los 107
empleados.
Select last_name, e.job_id, job_title
From employees e JOIN jobs j
ON e.job_id = j.job_id;

USANDO NATURAL JOIN QUEDA ASI:


“Se requiere conocer el apellido de los empleados, los id de los trabajos y que
significan esos id”. Quedan los 107 empleados.
Select last_name, job_id, job_title
From employees NATURAL JOIN jobs;
USANDO JOIN USING QUEDA ASI:
“Se requiere conocer el apellido de los empleados, los id de los trabajos y que
significan esos id”. Quedan los 107 empleados.
Select last_name, job_id, job_title
From employees JOIN jobs
USING(job_id);

Otro ejemplo:
“Obtener un reporte de todos los empleados y la ciudad a la que pertenecen”.
(Hacemos uso de 3 tablas: employees, departments y locations).
Select last_name, city
From employees e
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.location_id = l.location_id;

Otro ejemplo: “conocer cuál es la cuidad y país en el que se encuentran los


empleados”. (Usamos 4 tablas: employees, departments, locations y countries)
Select first_name, last_name, city, country_name
From employees e
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.location_id = l.location_id
JOIN countries c ON l.country_id = c.country_id;

Otro ejemplo pero con condicionales: “Conocer el apellido de empleados, el id de


trabajo, el nombre del trabajo y donde los departamentos sean diferentes del 50,
80 y 100 (con multitabla)”:
SELECT last_name, j.job_id, job_title
FROM employees e JOIN jobs j
ON e.job_id = j.job_id
AND department_id NOT IN (50, 80, 100);

Otro ejemplo: “Conocer el apellido de los empleados, el id de los departamentos,


el id de la locación, el id del país, el id de la región y el nombre de la región”.
(Usamos 5 tablas: employees, departments, locations, countries y regions).
NOTA: Si se indica una Ambigüedad, los campos necesitarán llevar el ALIAS que
coincidan en otras o todas las tablas.
Select last_name, d.department_id, l.location_id, c.country_id, r.region_id,
region_name
From employees e
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.location_id = l.location_id
JOIN countries c ON l.country_id = c.country_id
JOIN regions r ON c.region_id = r.region_id;

Ejemplo: “Generar un reporte agrupado por el nombre del departamento, el salario


mínimo por departamento y donde el departamento debe de estar entre 20 y 170,
y el promedio del salario no debe ser mayor a 12000”.
Select department_name, min(salary)
From employees e
JOIN departments d ON e.department_id = d.department_id
WHERE e.department_id BETWEEN 20 AND 170
GROUP BY department_name
HAVING avg(salary)<12000;

SELFT JOIN: Para que funcione un SEFLT JOIN se necesita ver la misma tabla
pero con diferentes nombre, para que pueda haber una correcta recuperación de
datos (Es usar un JOIN ON con la misma tabla pero DIFERENTES ALIAS).
 PK-FP están en la misma tabla.
 No es el mismo nombre de las columnas.
 Se crean 2 copias de la misma tabla.
 Requiere uso de ALIAS para tener 2 tablas y poderlas diferenciar.
Ejemplo: “Se requiere sacar el id de empleados, apellido de empleados y sacar el
id del manager, para SACAR TAMBIEN el Id de los manager y el apellido del
manager”.

Select worker.last_name, manager.last_name


From employees worker
JOIN employees manager ON(worker.manager_id = manager.employee_id);

Otro ejemplo pero con títulos:


“Se requiere sacar el id de empleados, apellido de empleados y sacar el id del
manager, para SACAR TAMBIEN el Id de los manager y el apellido del manager”
SELECT worker.employee_id empleado, worker.last_name nombredeempleado,
worker.manager_id jefe, manager.employee_id jefedeempleado,
manager.last_name nombredejefe
FROM employees worker
JOIN employees manager ON(worker.manager_id = manager.employee_id);

Multitabla: La aparición y uso de los JOINs comenzaron a aparecer en SQL en


1992, sin embargo antes de su aparición, se usaban las MULTI TABLAS.
Ejemplo para modificar:
“conocer el apellido del empleado, id de departamento, localidad, país, región
y nombre de la región”.
Select last_name, d.department_id, l.location_id, c.country_id, r.region_id,
region_name
From employees e
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.location_id = l.location_id
JOIN countries c ON l.country_id = c.country_id
JOIN regions r ON c.region_id = r.region_id;
“Usando Multitablas conocer el apellido del empleado, id de departamento,
localidad, país, región y nombre de la región”.
Select last_name, d.department_id, l.location_id, c.country_id, r.region_id,
region_name
From employees e, departments d, locations l, countries c, regions r
Where e.department_id = d.department_id
AND d.location_id = l.location_id
AND l.country_id = c.country_id
AND c.region_id = r.region_id;

Otro ejemplo: “Conocer el apellido de empleados, el id de trabajo y el


nombre del trabajo (con multitabla)”:
SELECT last_name, j.job_id, job_title
FROM employees e, jobs j
WHERE e.job_id = j.job_id;
Otro ejemplo: “conocer cuál es la ciudad en el que se encuentra (con multitabla)”:
SELECT first_name, last_name, l.city
FROM employees e, departments d, locations l
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id;

Otro ejemplo: “Conocer cuál es la cuidad y país en el que se encuentra los


empleados (con multitabla)”:
SELECT first_name, last_name, l.city, c.country_name
FROM employees e, departments d, locations l, countries c
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id
AND l.country_id = c.country_id;


Otro ejemplo: “Conocer el apellido de empleados, el id de trabajo, el
nombre del trabajo y donde los departamentos sean diferentes del 50, 80 y 100
(con multitabla)”:
SELECT last_name, j.job_id, job_title
FROM employees e, jobs j
WHERE e.job_id = j.job_id
AND department_id not in (50, 80, 100);

Producto cartesiano / CROSS JOIN:


 Es la combinación de todos los registros de una tabla con cada elemento de la
otra tabla.
 El producto cartesiano es multitabla.
 Se usa el termino CROSS JOIN.
Ejemplo:
“Combinar los registros de empleados con el registro de departamentos”.
SELECT last_name, department_name
FROM employees CROSS JOIN departments;

Otro ejemplo: “Combinar los apellidos de los empleados con los nombres de los
trabajos”.
SELECT last_name, job_title
FROM employees CROSS JOIN jobs;

SELECT last_name, department_name
FROM employees CROSS JOIN departments;
Otra forma de hacer: “Combinar los apellidos de los empleados con los nombres
de los trabajos”.
Select last_name, job_title
From employees e, jobs j;

Otra forma de hacer: “Combinar los apellidos de los empleados con los nombres
de los departamentos”.
SELECT last_name,  department_name
FROM  employees, departments;

NONEQUI JOINS: Se trata de un JOIN en el cual no será necesaria la igualdad


para hacer un JOIN, donde NI en multi tablas, NI en JOINS el juntar una tabla con
otra va a ser gracias a un MATCH (coincidir). Se buscarán MATCH que no sea
exactos.
 MATCH NO debe ser con un =.
 Se buscan valores que no hacen match (que sean diferentes entre sí).
 La mayoría de JOINS son PK y FK, puede no existir PK y FK entre las dos
tablas .
 Usa RANGOS(<, >, <=, >=, <>), BETWEEN e IN.
Ejemplo:
“Buscar para cada empleado, el rango de salario que perciben y mediante el su
salario, clasificarlos”. (ESTE SI ES UN NONEQUI JOIN)
SELECT e.last_name, e.salary, j.grade
FROM employees e
JOIN job_grades j ON e.salary
BETWEEN j.lowest_sal AND j.highest_sal;

...

Ejemplo: “Generar un reporte con los empleados cuyo jefe no es el mismo que el
jefe de departamento al que están adscritos”. (ESTE SI ES UN NONEQUI JOIN)
Select last_name, d.department_id, department_name, e.manager_id,
d.manager_id
From employees e
JOIN departments d ON e.department_id = d.department_id
AND e.manager_id <> d.manager_id;

Ejemplo: “Generar un reporte con los empleados, departamento en el que está, su


jefe inmediato y el jefe de departamento”. (ESTE NO ES UN NONEQUI JOIN)
Select last_name, department_id, e.manager_id inmediato, d.manager_id
jefedeldepto
From employees e
JOIN departments d USING(department_id);

OUTER JOINS: Los OUTER JOIN sirven para BUSCAR relaciones entre tablas,
sin embargo estas relaciones son hacen match en las columnas.
 Existe relación entre tablas, pero no hacen match (no coinciden) las columnas.
 Uno OUTER se puede usar cuando existe unas condición de igualdad
(MATCH) entre columnas, SIN EMBARGO existen valores que no cumplen esa
condición (y que por lo tanto el OUTER rescata esos registros).
 Pueden existir empleados sin departamento y/o departamentos sin empleados
(por lo que no impide que entren CAMPOS NULOS).
Ejemplo:
Sabemos que existen 27 departamentos disponibles:
select department_id from departments;

SIN EMBARGO no todos los departamentos tienes empleados, realmente solo


existen 12 departamentos que son operativos.
select distinct(department_id) from employees ORDER BY department_id;

Por lo tanto, hay 15 departamentos sin empleados; ¿Cómo logramos que la tabla
de empleado y departamentos hagan un completo match si tenemos este
problema?, simple usamos un OUTER JOIN que veremos en un ejemplo.
“Se requiere un reporte de empleados y sus respectivos departamentos”; con este
reporte nos podemos dar cuenta que de los 107 empleados, existe uno sin
departamento (empleado 178):
select employee_id, department_id from employees;

Como nos podemos dar cuenta el empleado con el Id 178, no cuenta con un
departamento en donde sea operativo, por lo que no se podría hacer MATCH con
ningún método JOIN visto con anterioridad.
LEFT OUTER JOINS: Los LEFT OUTER JOIN sirven para obtener SOLO los
registros de una tabla 1 (Tabla izquierda) aunque no hagan MATCH (entre las dos
tablas).
Ejemplo: “Se requiere un reposte de todos los empleados aun que no tengan
departamento” (ósea id 178 Grant).
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d ON(e.department_id = d.department_id);

RIGHT OUTER JOINS: Los RIGHT OUTER JOIN sirven para obtener SOLO los
registros de una tabla 2 (Tabla derecha) aunque no hagan MATCH (entre las dos
tablas).
Ejemplo: “Se requiere un reposte de todos los departamentos aun que no tenga
empleados operando” (ósea id del 120 al 270).
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d ON(e.department_id = d.department_id);

FULL OUTER JOINS: Los FULL OUTER JOIN sirven para obtener TODOS los
registros entre una tabla 1 y tabla 2 aunque no hagan MATCH entre las dos tablas.
Ejemplo: “Se requiere un reposte de todos los empleados y todos departamentos
aun que los empleados no tengan un departamento o que el departamento no
tenga empleados operándolo”.
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
FULL OUTER JOIN departments d ON(e.department_id = d.department_id);

También podría gustarte