tabel dependent

Acum să ne complicăm puțin interogările. Să adăugăm un nou tabel de sarcini la baza noastră de date cu sarcini pentru angajații noștri. Și să vedem ce intrări conține:

SELECT * FROM task

Rezultatul unei astfel de cereri:

id Emploee_id Nume Termen limită
1 1 Remediați o eroare pe front-end 2022-06-01
2 2 Remediați o eroare pe backend 2022-06-15
3 5 Cumpără cafea 2022-07-01
4 5 Cumpără cafea 2022-08-01
5 5 Voi cumpăra cafea 2022-09-01
6 (NUL) Curățați biroul (NUL)
7 4 Bucură-te de viață (NUL)
8 6 Bucură-te de viață (NUL)

Acest tabel are doar 4 coloane:

  • id — numărul unic al sarcinii (și rândurile din tabel);
  • employee_id — ID-ul angajatului din tabelul de angajați căruia îi este atribuită sarcina;
  • nume — numele și descrierea sarcinii;
  • termen - timpul până la care sarcina trebuie finalizată.

Acordați atenție la câteva nuanțe. Sarcina N6 nu are un employee_id, noi nu avem un curățător. Sarcina este acolo, dar executantul nu este. S-a întâmplat.

De asemenea, sarcinile 6-9 nu au un termen limită stabilit. Acest lucru se întâmplă atunci când o sarcină trebuie efectuată în mod regulat și continuu. De exemplu, biroul trebuie curățat în fiecare zi, dar trebuie și să te bucuri de viață în fiecare zi :)

Dacă un tabel folosește ID-uri dintr-un alt tabel, atunci un astfel de tabel se numește dependent .

Interogare pe mai multe tabele

Aici vedem în tabelul de sarcini că există două sarcini „Bucurați-vă de viață”. De unde știm cine sunt acești norocoși?

Pentru a face acest lucru, în SQL, puteți executa o interogare pe două tabele simultan. În general, în SQL, puteți interoga orice număr de tabele în același timp. Formatul general pentru o astfel de solicitare este:

SELECT columns
FROM Table 1, table 2, tableN

Important! Dacă scrieți o interogare la mai multe tabele în același timp, atunci ca rezultat veți obține așa-numitul produs cartezian al rândurilor de tabel. Fiecare rând din primul tabel va fi lipit de fiecare rând din al doilea tabel și așa mai departe.

Adică dacă aveți 5 rânduri în primul tabel și 10 rânduri în al doilea, atunci veți avea 50 de rânduri în total. În Java, această interogare ar arăta cam așa:

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

Să scriem interogarea noastră în două tabele simultan și să vedem ce se întâmplă:

SELECT * FROM employee, task

Și rezultatul acestei interogări:

id Nume ocupaţie salariu vârstă id angajat _id Nume Termen limită
1 Ivanov Ivan Programator 100000 25 1 1 Remediați o eroare pe front-end 2022-06-01
2 Petrov Petr Programator 80000 23 1 1 Remediați o eroare pe front-end 2022-06-01
3 Ivanov Serghei Tester 40000 treizeci 1 1 Remediați o eroare pe front-end 2022-06-01
4 Rabinovici Moisha Director 200000 35 1 1 Remediați o eroare pe front-end 2022-06-01
5 Kirienko Anastasia Manager de birou 40000 25 1 1 Remediați o eroare pe front-end 2022-06-01
6 Vaska pisică 1000 3 1 1 Remediați o eroare pe front-end 2022-06-01
1 Ivanov Ivan Programator 100000 25 2 2 Remediați o eroare pe backend 2022-06-15
2 Petrov Petr Programator 80000 23 2 2 Remediați o eroare pe backend 2022-06-15
3 Ivanov Serghei Tester 40000 treizeci 2 2 Remediați o eroare pe backend 2022-06-15
4 Rabinovici Moisha Director 200000 35 2 2 Remediați o eroare pe backend 2022-06-15
5 Kirienko Anastasia Manager de birou 40000 25 2 2 Remediați o eroare pe backend 2022-06-15

Avem 48 de linii de rezultat în total, dar aici am dat doar 11. În caz contrar, pur și simplu nu va fi suficient spațiu.

Fii atent la trei lucruri:

  • Coloane cu același nume: id . Acesta este id-ul din tabelul de angajați și id-ul din tabelul de sarcini .
  • Se repetă rândurile fiecărui tabel. În coloana din stânga, ID 6 este urmat din nou de ID = 1.
  • Avem rânduri prostii în care, de exemplu, id (din tabelul de angajați) este 6 și în același rând, id-ul angajat este 1.

Eliminarea liniilor fără sens

Există prea multe rânduri în tabelul nostru rezultat, care este produsul cartezian al tuturor rândurilor celor două tabele angajat și sarcină .

În mod logic, dacă rândul employee_id este 3, atunci ar trebui să rămână doar pe rândul din tabelul angajat unde id este 3. Să încercăm să remediam această neînțelegere cu WHERE.

Să scriem o interogare ca aceasta:

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

Și rezultatul acestei interogări:

id Nume ocupaţie salariu vârstă id Emploee_id Nume Termen limită
1 Ivanov Ivan Programator 100000 25 1 1 Remediați o eroare pe front-end 2022-06-01
2 Petrov Petr Programator 80000 23 2 2 Remediați o eroare pe backend 2022-06-15
4 Rabinovici Moisha Director 200000 35 7 4 Bucură-te de viață (NUL)
5 Kirienko Anastasia Manager de birou 40000 25 3 5 Cumpără cafea 2022-07-01
5 Kirienko Anastasia Manager de birou 40000 25 4 5 Cumpără cafea 2022-08-01
5 Kirienko Anastasia Manager de birou 40000 25 5 5 Voi cumpăra cafea 2022-09-01
6 Vaska pisică 1000 3 8 6 Bucură-te de viață (NUL)

Vestea bună este că liniile fără sens au dispărut: id-ul din prima coloană este întotdeauna egal cu employee_id.

Vestea proastă este că sarcinile care nu sunt atribuite nimănui, cum ar fi curățarea biroului, au dispărut. Id-ul lor de angajat a fost NULL, așa că au fost eliminate după ce s-a făcut WHERE.