CodeGym/Cursos Java/Módulo 4. Working with databases/Selección de datos de varias tablas

Selección de datos de varias tablas

Disponible

tabla dependiente

Ahora compliquemos un poco nuestras consultas. Agreguemos una nueva tabla de tareas a nuestra base de datos con tareas para nuestros empleados. Y veamos qué entradas contiene:

SELECT * FROM task

El resultado de tal solicitud:

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)

Esta tabla tiene solo 4 columnas:

  • id — número de tarea único (y filas en la tabla);
  • employee_id — ID del empleado de la tabla de empleados a quien se le asignó la tarea;
  • nombre — nombre y descripción de la tarea;
  • fecha límite : el tiempo en el que se debe completar la tarea.

Presta atención a algunos matices. La tarea N6 no tiene un employee_id, no tenemos un limpiador. La tarea está ahí, pero el ejecutante no lo está. Sucede.

Además, las tareas 6-9 no tienen una fecha límite establecida. Esto sucede cuando una tarea debe realizarse de manera regular y continua. Por ejemplo, la oficina debe limpiarse todos los días, pero también debe disfrutar de la vida todos los días :)

Si una tabla usa ID de otra tabla, dicha tabla se denomina dependiente .

Consulta en varias tablas

Aquí vemos en la tabla de tareas que hay dos tareas “Disfrutar de la vida”. ¿Cómo sabemos quiénes son estos afortunados?

Para hacer esto, en SQL, puede ejecutar una consulta en dos tablas a la vez. En general, en SQL, puede consultar cualquier cantidad de tablas al mismo tiempo. El formato general para tal solicitud es:

SELECT columns
FROM Table 1, table 2, tableN

¡Importante! Si escribe una consulta en varias tablas al mismo tiempo, como resultado obtendrá el llamado producto cartesiano de las filas de la tabla. Cada fila de la primera tabla se pegará a cada fila de la segunda tabla y así sucesivamente.

Es decir, si tiene 5 filas en la primera tabla y 10 filas en la segunda, tendrá 50 filas en total. En Java, esta consulta se vería así:

for (String row1 : table1)
{
	for (String row2 : table2)
   {
  	System.out.println(row1 + row2);
   }
}

Escribamos nuestra consulta en dos tablas a la vez y veamos qué sucede:

SELECT * FROM employee, task

Y el resultado de esta consulta:

identificación nombre ocupación salario edad identificación empleado _identificación nombre fecha límite
1 ivanov ivan Programador 100000 25 1 1 Arreglar un error en la interfaz 2022-06-01
2 petrov petr Programador 80000 23 1 1 Arreglar un error en la interfaz 2022-06-01
3 Sergey Ivanov Ensayador 40000 treinta 1 1 Arreglar un error en la interfaz 2022-06-01
4 Rabinovich Moisha Director 200000 35 1 1 Arreglar un error en la interfaz 2022-06-01
5 Anastasia Kirienko Gerente de oficina 40000 25 1 1 Arreglar un error en la interfaz 2022-06-01
6 Vaska gato 1000 3 1 1 Arreglar un error en la interfaz 2022-06-01
1 ivanov ivan Programador 100000 25 2 2 Arreglar un error en el backend 2022-06-15
2 petrov petr Programador 80000 23 2 2 Arreglar un error en el backend 2022-06-15
3 Sergey Ivanov Ensayador 40000 treinta 2 2 Arreglar un error en el backend 2022-06-15
4 Rabinovich Moisha Director 200000 35 2 2 Arreglar un error en el backend 2022-06-15
5 Anastasia Kirienko Gerente de oficina 40000 25 2 2 Arreglar un error en el backend 2022-06-15

Tenemos 48 líneas de resultados en total, pero aquí he dado solo 11. De lo contrario, simplemente no habrá suficiente espacio.

Presta atención a tres cosas:

  • Columnas con los mismos nombres: id . Esta es la identificación de la tabla de empleados y la identificación de la tabla de tareas .
  • Las filas de cada tabla se repiten. En la columna de la izquierda, ID 6 es seguido por ID = 1 nuevamente.
  • Tenemos filas sin sentido donde, por ejemplo, id (de la tabla de empleados) es 6 y en la misma fila employee_id es 1.

Eliminando líneas sin sentido

Hay demasiadas filas en nuestra tabla resultante, que es el producto cartesiano de todas las filas de las dos tablas employee y task .

Lógicamente, si la fila employee_id es 3, entonces solo debe adherirse a la fila de la tabla de empleados donde id es 3. Intentemos solucionar este malentendido con DONDE.

Escribamos una consulta como esta:

SELECT * FROM employee, task 
WHERE emploee.id = task.emploee_id 

Y el resultado de esta consulta:

identificación nombre ocupación salario edad identificación empleado_id nombre fecha límite
1 ivanov ivan Programador 100000 25 1 1 Arreglar un error en la interfaz 2022-06-01
2 petrov petr Programador 80000 23 2 2 Arreglar un error en el backend 2022-06-15
4 Rabinovich Moisha Director 200000 35 7 4 Disfruta la vida (NULO)
5 Anastasia Kirienko Gerente de oficina 40000 25 3 5 comprar cafe 2022-07-01
5 Anastasia Kirienko Gerente de oficina 40000 25 4 5 comprar cafe 2022-08-01
5 Anastasia Kirienko Gerente de oficina 40000 25 5 5 comprare cafe 2022-09-01
6 Vaska gato 1000 3 8 6 Disfruta la vida (NULO)

La buena noticia es que las líneas sin sentido han desaparecido: el id de la primera columna siempre es igual a employee_id.

La mala noticia es que las tareas que no están asignadas a nadie, como limpiar la oficina, se han ido. Su employee_id era NULL, por lo que se descartaron después de que se hizo WHERE.

1
Tarea
Módulo 4. Working with databases,  nivel 3lección 0
Bloqueada
task0301
task0301
1
Tarea
Módulo 4. Working with databases,  nivel 3lección 0
Bloqueada
task0302
task0302
1
Tarea
Módulo 4. Working with databases,  nivel 3lección 0
Bloqueada
task0303
task0303
1
Tarea
Módulo 4. Working with databases,  nivel 3lección 0
Bloqueada
task0304
task0304
1
Tarea
Módulo 4. Working with databases,  nivel 3lección 0
Bloqueada
task0305
task0305
1
Tarea
Módulo 4. Working with databases,  nivel 3lección 0
Bloqueada
task0306
task0306
1
Tarea
Módulo 4. Working with databases,  nivel 3lección 0
Bloqueada
task0307
task0307
1
Tarea
Módulo 4. Working with databases,  nivel 3lección 0
Bloqueada
task0308
task0308
1
Tarea
Módulo 4. Working with databases,  nivel 3lección 0
Bloqueada
task0309
task0309
Comentarios
  • Populares
  • Nuevas
  • Antiguas
Debes iniciar sesión para dejar un comentario
Esta página aún no tiene comentarios