Linguaggio SQL – La giunzione (Join) tra due tabelle

Linguaggio SQL

Uno degli obiettivi di una buona strutturazione del database è eliminare la ridondanza dei dati, ovvero i dati duplicati. Per raggiungere tale obiettivo, è possibile suddividere i dati in più tabelle in modo che ogni informazione sia rappresentata solo una volta.

In tale ottica, l’operazione di congiunzione (Join) consente di di collegare tra loro informazioni distribuite in più tabelle attraverso l’associazione tra un campo di una tabella e un campo dello stesso tipo di dati di un’altra tabella.
Per illustrare le modalità realizzative di un join si farà riferimento alle due tabelle Alunni e Assenze:

CREATE TABLE Alunni
(
  Codice CHAR(8) CHECK (Codice LIKE 'ITE-__'),
  Cognome CHAR(20) NOT NULL,
  Nome CHAR(20) NOT NULL,
  DataNascita DATE NOT NULL,
  Classe CHAR(4) NOT NULL, 


  PRIMARY KEY(Codice)
)

CREATE TABLE Assenze
(
  ID INTEGER IDENTITY(1,1),
  Studente CHAR(8),
  Tipo CHAR(2) CHECK (Tipo IN ('AA', 'AG')) DEFAULT 'AA',
  DataAssenza DATE CHECK (Data BETWEEN '14/09/2015' AND '08/06/2016') NOT NULL, 

  PRIMARY KEY (ID),
  FOREIGN KEY (Studente) REFERENCES Alunni(Codice)
)

Equi-Join

La forma più utile e immediata di join è la equi-join tra due tabelle; essa realizza l’operazione di giunzione naturale definita nell’algebra relazionale, restituendo una terza tabella le cui righe sono tutte e sole quelle ottenute dalle righe delle due tabelle di partenza in cui i valori delle colonne in comune sono uguali.

L’operazione di equi-join è implementata in SQL come una forma particolare del comando di selezione:

  1. nella clausola FROM vanno indicate le due tabelle correlate su cui va effettuata la join;
  2. nella clausola WHERE va espresso il collegamento tra le due tabelle, mediante un’apposita condizione detta condizione di join.

Nel primo caso si ha, ad esempio:

SELECT Alunni.Cognome, Alunni.Nome, Alunni.Classe, Assenze.DataAssenza
FROM Alunni, Assenze
WHERE Alunni.Codice = Assenze.Studente;

Se i nomi delle colonne nelle due tabelle sono diversi, è anche possibile omettere il riferimento alla tabella di appartenenza (ad esempio Cognome anziché Alunni.Cognome).

Nella clausola FROM sono state indicate le tabelle correlate, nella clausola WHERE è stato definito il collegamento con la condizione di join tra la Primary Key della tabella Alunni e la Foreign Key della tabella Assenze.

Tale sintassi prende anche il none di JOIN implicito poiché, facendo ricorso al WHERE per congiungere le due tabelle, non fa uso di sintassi dedicate.

Nella clausola WHERE possono essere aggiunte altre condizioni combinandole con la condizione di join per restringere l’insieme delle tuple restituite; possono inoltre essere applicate le clausole GROUP BY, HAVING e ORDER BY.

Ad esempio, per visualizzare le assenze in una determinata classe si ha:

SELECT Alunni.Cognome, Alunni.Nome, Alunni.Classe, Assenze.DataAssenza
FROM Alunni, Assenze
WHERE Alunni.Codice = Assenze.Studente
AND Classe = 'IIA';

L’operatore JOIN

Per realizzare una congiunzione esiste la cosiddetta sintassi esplicita:

SELECT lista dei campi
FROM Nome_Tabella1 { INNER | LEFT | RIGHT } JOIN Nome_Tabella2
ON condizione

Visite: 16479