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.
GO TO FULL VERSION