Si vuole spiegare gli operatori SQL che permettono di ottenere i dati provenienti da più tabelle differenti. Per spiegare queste nozioni ci riferiremo ad un database contenente tre tabelle: Clienti, Ordini e Sotto-Ordini pensando che ogni cliente può avere più ordini e che ogni ordine sia anche composto da più righe.
Per ottenere la lettura dei dati provenienti da diverse tabelle occorre utilizzare il nome all’interno della clausola SQL FROM, così da avere un join ( unione ) implicito che restituisce in un’unica tabella le righe formate da tabelle diverse.
SELECT * FROM Clienti, Ordini
Il risultato della query viene chiamato prodotto cartesiano. Questo è infatti costituito da tutte le possibili combinazioni fra le righe delle tabelle coinvolte nell’interrogazione. La query allora è un’operazione che consente di raccogliere i dati di tabelle diverse in una tabella di output, l’operatore di join ha la proprietà associativa e quindi l’ordine con cui verranno elencate le tabelle non è influente. Per avere dal join dati più coerenti occorre inserire la clausola WHERE in modo da avere gli ordini dei clienti e non le altre combinazioni.
SELECT * FROM Clienti, Ordini WHERE Clienti.IDCliente = Ordini.IDCliente
Il risultato di questa query è detto Equi-Join, ossia unione equa, in quanto restituisce un insieme di righe o tuple composte da tutte le colonne delle due tabelle che soddisfano la condizione di join. In questo tipo di risultato abbiamo delle colonne duplicate che è possibile eliminare utilizzando il Natural-Join nel quale si specificano le colonne da visualizzare.
SELECT Clienti.RagSoc, Ordini.Numero, Ordini.Data FROM Clienti, Ordini WHERE Clienti.IDCliente = Ordini.IDCliente
Questo tipo di join è anche detto inner join in contrapposizione all’outer join che è simile al primo, ma ritorna tutte le occorrenze di una tabella che domina le altre, anche se i valori non sarebbero compresi nel risultato così come avveniva nell’inner join. Ad esempio per avere tutti i clienti ( tabella dominante ), anche quelli senza ordini, seguendo la logica dovremmo scrivere:
SELECT Clienti.RagSoc, Ordini.Numero, Ordini.Data FROM OUTER Clienti, Ordini WHERE Clienti.IDCliente = Ordini.IDCliente
questa query presenta degli errori di sintassi e la forma corretta è la seguente:
SELECT Clienti.RagSoc, Ordini.Numero, Ordini.Data FROM Clienti LEFT JOIN Ordini ON Clienti.IDCliente=Ordini.IDCliente
nella tabella di output avremo anche i clienti senza ordini perché si tratta di LEFT JOIN ed in questo caso la tabella a sinistra del join è la dominante, viceversa se a destra, RIGHT JOIN, sarà la tabella a destra ad essere dominante e quindi avremo anche gli ordini senza un cliente.
SELECT Clienti.RagSoc, Ordini.Numero, Ordini.Data FROM Clienti RIGHT JOIN Ordini ON Clienti.IDCliente=Ordini.IDCliente
Come potete notare nella sintassi del join in SQL occorre inserire ON al posto di WHERE. Altri tipi di join sono i cosiddetti Self-Join che non sono altro che un join tra colonne della stessa tabella, in questo caso per evitare ambiguità, occorre adoperare gli alias.
Come ultimo esempio vediamo come creare una query per avere una tabella di output con i dati dei clienti, degli ordini e delle righe degli ordini:
SELECT Clienti.RagSoc, Ordini.Numero, Ordini.Data, Sotto-Ordini.Articolo, Sotto-Ordini.Qt FROM (Clienti INNER JOIN Ordini ON Clienti.IDCliente = Ordini.IDCliente) INNER JOIN Sotto-Ordini ON Ordini.IDOrdine = Sotto-Ordini.IDOrdine
Spero che con questo articolo abbiate capito il complesso ragionamento che risiede dietro a dei join talvolta incomprensibili, ma che hanno il loro perché ed il modo migliore a mio avviso per capirli è avere sempre in mente la dimostrazione del join che vi ho proposto in questo articolo.