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.