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