Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Apuntes Capitulo 5
Apuntes Capitulo 5
¿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:
…
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);
…
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;
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;
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”.
…
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);
…
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;
…
...
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;
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;
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);