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.