tabela dependente

Agora vamos complicar um pouco nossas consultas. Vamos adicionar uma nova tabela de tarefas ao nosso banco de dados com tarefas para nossos funcionários. E vamos ver quais entradas ele contém:

SELECT * FROM task

O resultado de tal solicitação:

eu ia id_funcionário nome prazo final
1 1 Corrigir um bug no front-end 01/06/2022
2 2 Corrigir um bug no back-end 15/06/2022
3 5 comprar café 01/07/2022
4 5 comprar café 01/08/2022
5 5 vai comprar café 01/09/2022
6 (NULO) Limpe o escritório (NULO)
7 4 Aproveite a vida (NULO)
8 6 Aproveite a vida (NULO)

Esta tabela tem apenas 4 colunas:

  • id — número de tarefa exclusivo (e linhas na tabela);
  • employee_id — ID do funcionário da tabela de funcionários a quem a tarefa foi atribuída;
  • name — nome e descrição da tarefa;
  • deadline - o tempo em que a tarefa deve ser concluída.

Preste atenção a algumas nuances. A tarefa N6 não tem um employee_id, não temos um limpador. A tarefa existe, mas o performer não. Acontece.

Além disso, as tarefas 6-9 não têm um prazo definido. Isso acontece quando uma tarefa deve ser realizada de forma regular e contínua. Por exemplo, o escritório precisa ser limpo todos os dias, mas você também precisa aproveitar a vida todos os dias :)

Se uma tabela usa IDs de outra tabela, essa tabela é chamada de dependente .

Consulta em várias tabelas

Aqui vemos na tabela de tarefas que existem duas tarefas “Aproveitar a vida”. Como sabemos quem são esses sortudos?

Para fazer isso, no SQL, você pode executar uma consulta em duas tabelas ao mesmo tempo. Em geral, no SQL, você pode consultar qualquer número de tabelas ao mesmo tempo. O formato geral para tal solicitação é:

SELECT columns
FROM Table 1, table 2, tableN

Importante! Se você escrever uma consulta para várias tabelas ao mesmo tempo, como resultado, obterá o chamado produto cartesiano das linhas da tabela. Cada linha da primeira tabela será colada a cada linha da segunda tabela e assim por diante.

Ou seja, se você tiver 5 linhas na primeira tabela e 10 linhas na segunda, terá 50 linhas no total. Em Java, essa consulta ficaria mais ou menos assim:

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

Vamos escrever nossa consulta em duas tabelas ao mesmo tempo e ver o que acontece:

SELECT * FROM employee, task

E o resultado desta consulta:

eu ia nome ocupação salário idade eu ia empregado _eu ia nome prazo final
1 Ivanov Ivan Programador 100000 25 1 1 Corrigir um bug no front-end 01/06/2022
2 Petrov Petr Programador 80000 23 1 1 Corrigir um bug no front-end 01/06/2022
3 Ivanov Sergei Testador 40000 trinta 1 1 Corrigir um bug no front-end 01/06/2022
4 Rabinovich Moisha Diretor 200000 35 1 1 Corrigir um bug no front-end 01/06/2022
5 Kirienko Anastácia Gerente 40000 25 1 1 Corrigir um bug no front-end 01/06/2022
6 Vaska gato 1000 3 1 1 Corrigir um bug no front-end 01/06/2022
1 Ivanov Ivan Programador 100000 25 2 2 Corrigir um bug no back-end 15/06/2022
2 Petrov Petr Programador 80000 23 2 2 Corrigir um bug no back-end 15/06/2022
3 Ivanov Sergei Testador 40000 trinta 2 2 Corrigir um bug no back-end 15/06/2022
4 Rabinovich Moisha Diretor 200000 35 2 2 Corrigir um bug no back-end 15/06/2022
5 Kirienko Anastácia Gerente 40000 25 2 2 Corrigir um bug no back-end 15/06/2022

Temos 48 linhas de resultado no total, mas aqui dei apenas 11. Caso contrário, simplesmente não haverá espaço suficiente.

Preste atenção em três coisas:

  • Colunas com os mesmos nomes: id . Este é o id da tabela de funcionários e o id da tabela de tarefas .
  • As linhas de cada tabela são repetidas. Na coluna da esquerda, ID 6 é seguido por ID = 1 novamente.
  • Temos linhas sem sentido onde, por exemplo, id (da tabela de funcionários) é 6 e na mesma linha employee_id é 1.

Removendo linhas sem sentido

Há muitas linhas em nossa tabela resultante, que é o produto cartesiano de todas as linhas das duas tabelas employee e task .

Logicamente, se a linha employee_id for 3, então ela deve ficar apenas na linha da tabela Employees onde id é 3. Vamos tentar corrigir esse mal-entendido com WHERE.

Vamos escrever uma consulta como esta:

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

E o resultado desta consulta:

eu ia nome ocupação salário idade eu ia id_funcionário nome prazo final
1 Ivanov Ivan Programador 100000 25 1 1 Corrigir um bug no front-end 01/06/2022
2 Petrov Petr Programador 80000 23 2 2 Corrigir um bug no back-end 15/06/2022
4 Rabinovich Moisha Diretor 200000 35 7 4 Aproveite a vida (NULO)
5 Kirienko Anastácia Gerente 40000 25 3 5 comprar café 01/07/2022
5 Kirienko Anastácia Gerente 40000 25 4 5 comprar café 01/08/2022
5 Kirienko Anastácia Gerente 40000 25 5 5 vai comprar café 01/09/2022
6 Vaska gato 1000 3 8 6 Aproveite a vida (NULO)

A boa notícia é que as linhas sem sentido desapareceram: o id da primeira coluna é sempre igual a employee_id.

A má notícia é que as tarefas que não são atribuídas a ninguém, como a limpeza do escritório, acabaram. O seu employee_id era NULL, então eles foram descartados depois que WHERE foi feito.