tavola dipendente
Ora complichiamo un po' le nostre domande. Aggiungiamo una nuova tabella delle attività al nostro database con le attività per i nostri dipendenti. E vediamo quali voci contiene:
SELECT * FROM task
Il risultato di tale richiesta:
id | impiegato_id | nome | scadenza |
---|---|---|---|
1 | 1 | Risolto un bug sul frontend | 2022-06-01 |
2 | 2 | Risolto un bug sul backend | 2022-06-15 |
3 | 5 | Compra il caffè | 2022-07-01 |
4 | 5 | Compra il caffè | 2022-08-01 |
5 | 5 | Comprerò il caffè | 2022-09-01 |
6 | (NULLO) | Pulisci l'ufficio | (NULLO) |
7 | 4 | Goditi la vita | (NULLO) |
8 | 6 | Goditi la vita | (NULLO) |
Questa tabella ha solo 4 colonne:
- id — numero univoco dell'attività (e righe nella tabella);
- employee_id — ID del dipendente dalla tabella dei dipendenti a cui è assegnata l'attività;
- name — nome e descrizione dell'attività;
- scadenza - il tempo entro il quale l'attività deve essere completata.
Presta attenzione ad alcune sfumature. L'attività N6 non ha un employee_id, non abbiamo un addetto alle pulizie. Il compito c'è, ma l'esecutore no. Succede.
Inoltre, le attività 6-9 non hanno una scadenza prestabilita. Ciò accade quando un'attività deve essere eseguita regolarmente e continuamente. Ad esempio, l'ufficio deve essere pulito ogni giorno, ma devi anche goderti la vita ogni giorno :)
Se una tabella utilizza gli ID di un'altra tabella, tale tabella viene chiamata dipendente .
Query su più tabelle
Qui vediamo nella tabella delle attività che ci sono due attività "Godersi la vita". Come facciamo a sapere chi sono questi fortunati?
Per fare ciò, in SQL, puoi eseguire una query su due tabelle contemporaneamente. In generale, in SQL è possibile interrogare qualsiasi numero di tabelle contemporaneamente. Il formato generale per tale richiesta è:
SELECT columns
FROM Table 1, table 2, tableN
Importante! Se scrivi una query su più tabelle contemporaneamente, di conseguenza otterrai il cosiddetto prodotto cartesiano delle righe della tabella. Ogni riga della prima tabella verrà incollata a ciascuna riga della seconda tabella e così via.
Cioè, se hai 5 righe nella prima tabella e 10 righe nella seconda, avrai 50 righe in totale. In Java, questa query sarebbe simile a questa:
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
Scriviamo la nostra query su due tabelle contemporaneamente e vediamo cosa succede:
SELECT * FROM employee, task
E il risultato di questa query:
id | nome | occupazione | stipendio | età | id | dipendente | _id | nome | scadenza |
---|---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programmatore | 100000 | 25 | 1 | 1 | Risolto un bug sul frontend | 2022-06-01 | |
2 | Petrov Petr | Programmatore | 80000 | 23 | 1 | 1 | Risolto un bug sul frontend | 2022-06-01 | |
3 | Sergej Ivanov | Tester | 40000 | trenta | 1 | 1 | Risolto un bug sul frontend | 2022-06-01 | |
4 | Rabinovich Moisha | Direttore | 200000 | 35 | 1 | 1 | Risolto un bug sul frontend | 2022-06-01 | |
5 | Kirienko Anastasia | Capo ufficio | 40000 | 25 | 1 | 1 | Risolto un bug sul frontend | 2022-06-01 | |
6 | Vasca | gatto | 1000 | 3 | 1 | 1 | Risolto un bug sul frontend | 2022-06-01 | |
1 | Ivanov Ivan | Programmatore | 100000 | 25 | 2 | 2 | Risolto un bug sul backend | 2022-06-15 | |
2 | Petrov Petr | Programmatore | 80000 | 23 | 2 | 2 | Risolto un bug sul backend | 2022-06-15 | |
3 | Sergej Ivanov | Tester | 40000 | trenta | 2 | 2 | Risolto un bug sul backend | 2022-06-15 | |
4 | Rabinovich Moisha | Direttore | 200000 | 35 | 2 | 2 | Risolto un bug sul backend | 2022-06-15 | |
5 | Kirienko Anastasia | Capo ufficio | 40000 | 25 | 2 | 2 | Risolto un bug sul backend | 2022-06-15 |
Abbiamo 48 righe di risultati in totale, ma qui ne ho fornite solo 11. Altrimenti, semplicemente non ci sarà abbastanza spazio.
Fai attenzione a tre cose:
- Colonne con gli stessi nomi: id . Questo è l'id dalla tabella dei dipendenti e l'id dalla tabella delle attività .
- Le righe di ogni tabella vengono ripetute. Nella colonna di sinistra, ID 6 è seguito nuovamente da ID = 1.
- Abbiamo righe senza senso dove, ad esempio, id (dalla tabella dei dipendenti) è 6 e nella stessa riga id_impiegato è 1.
Rimozione di righe senza senso
Ci sono troppe righe nella nostra tabella risultante, che è il prodotto cartesiano di tutte le righe delle due tabelle employee e task .
Logicamente, se la riga employee_id è 3, dovrebbe limitarsi alla riga della tabella employee dove id è 3. Proviamo a correggere questo malinteso con WHERE.
Scriviamo una query come questa:
SELECT * FROM employee, task
WHERE emploee.id = task.emploee_id
E il risultato di questa query:
id | nome | occupazione | stipendio | età | id | impiegato_id | nome | scadenza |
---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programmatore | 100000 | 25 | 1 | 1 | Risolto un bug sul frontend | 2022-06-01 |
2 | Petrov Petr | Programmatore | 80000 | 23 | 2 | 2 | Risolto un bug sul backend | 2022-06-15 |
4 | Rabinovich Moisha | Direttore | 200000 | 35 | 7 | 4 | Goditi la vita | (NULLO) |
5 | Kirienko Anastasia | Capo ufficio | 40000 | 25 | 3 | 5 | Compra il caffè | 2022-07-01 |
5 | Kirienko Anastasia | Capo ufficio | 40000 | 25 | 4 | 5 | Compra il caffè | 2022-08-01 |
5 | Kirienko Anastasia | Capo ufficio | 40000 | 25 | 5 | 5 | Comprerò il caffè | 2022-09-01 |
6 | Vasca | gatto | 1000 | 3 | 8 | 6 | Goditi la vita | (NULLO) |
La buona notizia è che le righe prive di significato sono scomparse: l'id della prima colonna è sempre uguale a employee_id.
La cattiva notizia è che i compiti che non sono assegnati a nessuno, come pulire l'ufficio, sono spariti. Il loro employee_id era NULL, quindi sono stati scartati dopo che WHERE è stato fatto.