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.