Razones para OUTER JOIN

Por cierto, ¿recuerdas cuando fusionamos nuestras hojas de cálculo y las tareas de limpieza de nuestra oficina desaparecieron porque todavía no había un limpiador?

Si ejecuta una consulta como esta:

SELECT * FROM task

Entonces obtenemos este resultado:

identificación empleado_id nombre fecha límite
1 1 Arreglar un error en la interfaz 2022-06-01
2 2 Arreglar un error en el backend 2022-06-15
3 5 comprar cafe 2022-07-01
4 5 comprar cafe 2022-08-01
5 5 comprare cafe 2022-09-01
6 (NULO) limpiar la oficina (NULO)
7 4 Disfruta la vida (NULO)
8 6 Disfruta la vida (NULO)

La tarea “Clear Office” desaparece si intentamos unir la tabla de tareas con la tabla de empleados por employee_id.

Para resolver este problema, se han agregado varios modificadores al operador JOIN que permiten almacenar tales filas huérfanas sin un par en otra tabla.

Déjame recordarte la forma clásica del operador JOIN:

table 1 JOIN table 2 ON condition

Podemos decirle a SQL Server que se asegure de que todos los datos de la tabla de la izquierda (tabla1) estén presentes en la tabla unida. Incluso si no hay pareja para ellos en la tabla de la derecha. Para hacer esto, solo necesitas escribir:

table 1 LEFT JOIN table 2 ON condition

Si desea que la tabla unida tenga todas las filas de la tabla correcta , debe escribir:

table 1 RIGHT JOIN table 2 ON
 condition

Escribamos una consulta que combine todas las tareas y empleados para que las tareas sin un ejecutor no se pierdan. Para hacer esto, escriba una consulta:

SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id

Y el resultado de esta consulta:

identificación nombre ocupación salario edad Fecha de Ingreso identificación empleado_id nombre
1 ivanov ivan Programador 100000 25 2012-06-30 1 1 Arreglar un error en la interfaz
2 petrov petr Programador 80000 23 2013-08-12 2 2 Arreglar un error en el backend
4 Rabinovich Moisha Director 200000 35 2015-05-12 7 4 Disfruta la vida
5 Anastasia Kirienko Gerente de oficina 40000 25 2015-10-10 3 5 comprar cafe
5 Anastasia Kirienko Gerente de oficina 40000 25 2015-10-10 4 5 comprar cafe
5 Anastasia Kirienko Gerente de oficina 40000 25 2015-10-10 5 5 comprar cafe
6 Vaska gato 1000 3 2018-11-11 8 6 Disfruta la vida
(NULO) (NULO) (NULO) (NULO) (NULO) (NULO) 6 (NULO) limpiar la oficina

Se ha agregado otra fila a nuestra tabla y, curiosamente, hay muchos valores NULL en ella. Todos los datos que se tomaron de la tabla de empleados se muestran como NULL, ya que no había ningún ejecutor de la tabla de empleados para la tarea "Limpiar oficina".

ÚNETE tipos

Hay 4 tipos de JOIN en total. Se presentan en la siguiente tabla:

Breve entrada entrada larga Explicación
1 UNIRSE UNIR INTERNAMENTE Solo registros que están en las tablas A y B
2 UNIRSE A LA IZQUIERDA IZQUIERDA COMBINACIÓN EXTERNA Todas las filas sin un par de la tabla A deben ser
3 UNIÓN DERECHA UNIÓN EXTERNA DERECHA Todas las filas sin un par de la tabla B deben ser
4 UNIÓN EXTERNA UNIÓN EXTERNA COMPLETA Todas las filas de pares de bases de las tablas A y B deben ser

Para simplificar, si representamos las tablas como conjuntos, JOIN se puede mostrar como una imagen:

Establecer intersección significa que para una tabla hay un registro correspondiente de otra tabla a la que se refiere.

pregunta de la entrevista

A veces, los programadores novatos son bombardeados con una pregunta muy simple en una entrevista. Dadas nuestras tablas, se puede formular de la siguiente manera:

"Escriba una consulta que muestre una lista de todos los empleados para los que no hay tareas ". Primero, intentemos reformular un poco esta pregunta: "Escriba una consulta que muestre una lista de todos los empleados de la tabla de empleados para los que no hay tareas en la tabla de tareas ". Necesitamos obtener este conjunto:

Hay muchas maneras de resolver este problema, pero comenzaré con la más simple: primero, puede unir nuestras tablas con LEFT JOIN y luego usar WHERE para excluir todas las filas para las cuales los datos faltantes se rellenaron con NULL.

SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

Y el resultado de esta consulta:

identificación nombre ocupación salario edad Fecha de Ingreso identificación empleado_id nombre
3 Sergey Ivanov Ensayador 40000 treinta 2014-01-01 (NULO) (NULO) (NULO)

La única desventaja de esta solución es que aquí las filas de la tabla contienen NULL, y por condición necesitamos mostrar una lista de empleados.

Para hacer esto, debe enumerar las columnas requeridas de la tabla de empleados en SELECCIONAR, o si necesita mostrarlas todas, puede escribir la siguiente construcción:

SELECT e.* FROM employee e, task t 

La solicitud completa se verá así:

SELECT e.*  
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

el resultado de esta consulta:

identificación nombre ocupación salario edad Fecha de Ingreso
3 Sergey Ivanov Ensayador 40000 treinta 2014-01-01

El resto de los métodos se los dejo a usted como tarea. No quiero privarte del placer de encontrarlos tú mismo.