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:

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:

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.