Motivi per OUTER JOIN
A proposito, ti ricordi quando abbiamo unito i nostri fogli di calcolo e le nostre attività di pulizia dell'ufficio sono scomparse perché non c'era ancora il pulitore?
Se esegui una query come questa:
SELECT * FROM task
Quindi otteniamo questo risultato:
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) |
L'attività "Clear Office" scompare se proviamo a unire la tabella delle attività con la tabella dei dipendenti tramite employee_id.
Per risolvere questo problema, sono stati aggiunti vari modificatori all'operatore JOIN che consentono di memorizzare tali righe orfane senza una coppia in un'altra tabella.
Permettetemi di ricordarvi la forma classica dell'operatore JOIN:
table 1 JOIN table 2 ON
condition
Possiamo dire a SQL Server di assicurarsi che tutti i dati della tabella di sinistra (table1) siano presenti nella tabella unita. Anche se non c'è una coppia per loro nel tavolo giusto. Per fare questo, devi solo scrivere:
table 1 LEFT JOIN table 2 ON condition
Se vuoi che la tabella unita abbia tutte le righe della tabella giusta , allora devi scrivere:
table 1 RIGHT JOIN table 2 ON
condition
Scriviamo una query che unirà tutte le attività e i dipendenti in modo che le attività senza un esecutore non vadano perse. Per fare ciò, scrivi una query:
SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
E il risultato di questa query:
id | nome | occupazione | stipendio | età | data di iscrizione | id | impiegato_id | nome |
---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programmatore | 100000 | 25 | 2012-06-30 | 1 | 1 | Risolto un bug sul frontend |
2 | Petrov Petr | Programmatore | 80000 | 23 | 2013-08-12 | 2 | 2 | Risolto un bug sul backend |
4 | Rabinovich Moisha | Direttore | 200000 | 35 | 2015-05-12 | 7 | 4 | Goditi la vita |
5 | Kirienko Anastasia | Capo ufficio | 40000 | 25 | 2015-10-10 | 3 | 5 | Compra il caffè |
5 | Kirienko Anastasia | Capo ufficio | 40000 | 25 | 2015-10-10 | 4 | 5 | Compra il caffè |
5 | Kirienko Anastasia | Capo ufficio | 40000 | 25 | 2015-10-10 | 5 | 5 | Compra il caffè |
6 | Vasca | gatto | 1000 | 3 | 2018-11-11 | 8 | 6 | Goditi la vita |
(NULLO) | (NULLO) | (NULLO) | (NULLO) | (NULLO) | (NULLO) | 6 | (NULLO) | Pulisci l'ufficio |
Un'altra riga è stata aggiunta alla nostra tabella e, cosa interessante, contiene molti valori NULL. Tutti i dati presi dalla tabella dei dipendenti vengono visualizzati come NULL, poiché non vi era alcun esecutore dalla tabella dei dipendenti per l'attività "Pulisci ufficio".
UNISCITI tipi
Ci sono 4 tipi di JOIN in totale. Sono presentati nella tabella seguente:
Breve entrata | ingresso lungo | Spiegazione | |
---|---|---|---|
1 | GIUNTURA | UNIONE INTERNA | Solo i record che si trovano nelle tabelle A e B |
2 | UNISCITI A SINISTRA | JOIN ESTERNO SINISTRO | Tutte le righe senza una coppia dalla tabella A devono essere |
3 | GIUSTO UNISCITI | JOIN ESTERNO DESTRO | Tutte le righe senza una coppia dalla tabella B devono essere |
4 | UNIRE ESTERNO | JOIN ESTERNO COMPLETO | Tutte le righe delle coppie di basi delle tabelle A e B devono essere |
Per semplicità, se rappresentiamo le tabelle come insiemi, JOIN può essere visualizzato come un'immagine:
![](https://cdn.codegym.cc/images/article/66aba568-a02a-45e0-9939-6beebbb190ed/512.jpeg)
Imposta intersezione significa che per una tabella c'è un record corrispondente da un'altra tabella a cui fa riferimento.
Domanda dall'intervista
A volte i programmatori alle prime armi vengono bombardati da una domanda molto semplice durante un colloquio. Date le nostre tabelle, può essere formulato come segue:
"Scrivi una query che visualizzi un elenco di tutti i dipendenti per i quali non ci sono attività ." Per prima cosa, proviamo a riformulare un po' questa domanda: "Scrivi una query che visualizzi un elenco di tutti i dipendenti dalla tabella dei dipendenti per i quali non ci sono attività nella tabella delle attività ". Dobbiamo ottenere questo set:![](https://cdn.codegym.cc/images/article/d3cc4f4a-b340-4b3a-9ae0-3e38eca36bb2/512.jpeg)
Esistono molti modi per risolvere questo problema, ma inizierò con il più semplice: in primo luogo, puoi unire le nostre tabelle con un LEFT JOIN, quindi utilizzare WHERE per escludere tutte le righe per le quali i dati mancanti sono stati riempiti con NULL.
SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
E il risultato di questa query:
id | nome | occupazione | stipendio | età | data di iscrizione | id | impiegato_id | nome |
---|---|---|---|---|---|---|---|---|
3 | Sergej Ivanov | Tester | 40000 | trenta | 2014-01-01 | (NULLO) | (NULLO) | (NULLO) |
L'unico svantaggio di questa soluzione è che qui le righe della tabella contengono NULL e per condizione dobbiamo visualizzare un elenco di dipendenti.
Per fare ciò, è necessario elencare le colonne richieste della tabella dei dipendenti in SELECT oppure, se è necessario visualizzarle tutte, è possibile scrivere la seguente costruzione:
SELECT e.* FROM employee e, task t
La richiesta completa sarà simile a questa:
SELECT e.*
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id
WHERE t.id IS NULL
il risultato di questa query:
id | nome | occupazione | stipendio | età | data di iscrizione |
---|---|---|---|---|---|
3 | Sergej Ivanov | Tester | 40000 | trenta | 2014-01-01 |
Il resto dei metodi sono lasciati a te per i compiti. Non voglio privarti del piacere di trovarli tu stesso.