Press "Enter" to skip to content

Rappresentazione delle Join SQL

Un articolo che cerca di mostrare in modo intuitivo qual’è la differenza fra INNER, LEFT e RIGHT Join in linguaggio SQL.

Più di qualche volta, sui forum e nelle richieste che mi vengono fatte da chi sta iniziando a lavorare con il linguaggio SQL mi viene detto:

“Non capisco la differenza tra Inner Join, e Left o Right outer Join” Pertanto provo a spiegarlo con un disegnino e un paio di note:

Date due tabelle:

Tabella Left (testata) contiene i campi IDTs e DescrizioneTs

Tabella Right (righe) contiene i campi IDRg, IDTs, DescrizioneRg, ValoreRg

o_tabelle_01 

Una Inner Join:

SELECT ts.IDTs, ts.DescrizioneTs, rg.IDRg, rg.DescrizioneRg, rg.ValoreRg
    FROM
        TabellaLeft ts
    INNER JOIN
        TabellaRight rg
    ON
        ts.IDTs = rg.IDTs

E’ rappresentata graficamente dal disegno qui sotto e restituisce Tutte le righe della tabella TS (left) che hanno almeno una corrispondenza nella tabella RG (right) pertanto, se vi fossero delle testate senza alcuna riga, non verrebbero visualizzate.

o_tabelle_02 

Una Left Outer Join:

SELECT ts.IDTs, ts.DescrizioneTs, rg.IDRg, rg.DescrizioneRg, rg.ValoreRg
    FROM
        TabellaLeft ts
    LEFT OUTER JOIN
        TabellaRight rg
    ON
        ts.IDTs = rg.IDTs

E’ rappresentata graficamente nel disegno qui sotto e restituisce tutte le righe della tabella TS (Left) e solo le righe della tabella RG che hanno corrispondenza nella tabella TS, pertanto se vi sono Righe la cui TS non esiste (posto che non vi sia una relazione di foreign key a impedire questo tipo di possibilità) queste righe non saranno visibili in questa Join. Se la testata non avesse alcuna riga, comunque comparirà e i dati relativi alla riga saranno a NULL

o_tabelle_03 

Una Right Outer Join:

SELECT ts.IDTs, ts.DescrizioneTs, rg.IDRg, rg.DescrizioneRg, rg.ValoreRg
    FROM
        TabellaLeft ts
    RIGHT OUTER JOIN
        TabellaRight rg
    ON
        ts.IDTs = rg.IDTs

E’ rappresentata graficamente nel disegno qui sotto e restituisce tutte le righe della tabella RG (Right) e solo le righe della tabella TS che hanno corrispondenza nella tabella RG, pertanto se vi sono Righe la cui TS non esiste (posto che non vi sia una relazione di foreign key a impedire questo tipo di possibilità) queste righe saranno visibili ma i campi rappresentanti i dati di Testata saranno NULL.

o_tabelle_04 

Sperando di aver contribuito a fare un po’ di chiarezza ai principianti, vi auguro buon lavoro.