Inner join: definizione e applicazione
Per eseguire delle query tra più tabelle di database nel modello di database relazionale utilizzate i join SQL. Ad eccezione della cross join, tutti i tipi di join sono una combinazione di un prodotto cartesiano e di una selezione.
Il Database Management System (DBMS) è un'unione incrociata di due tabelle di database, che filtra il risultato secondo una condizione di selezione definita dall'utente utilizzando una dichiarazione SQL. L'inner join si distingue da tutti gli altri tipi di join per il suo fornire un risultato minimale. Il risultato di una inner è costituito solamente dai record di dati dell'unione incrociata che soddisfano la condizione di selezione. Il risultato è una tabella dei risultati (una View) senza valori zero.
- Certificato SSL Wildcard incluso
- Registrazione di dominio sicura
- Indirizzo e-mail professionale da 2 GB
Utilizzo pratico delle inner join
Illustreremo l'inner join con un esempio, partendo da due tabelle. La tabella “collaboratori” comprende i dipendenti di un'azienda comprensivi di ID (c_id) e il corrispondente reparto (r_id).
Tabella: collaboratori
c_id | cognome | nome | r_id |
---|---|---|---|
1 | Bianchi | Maria | 3 |
2 | Rossi | Giada | 1 |
3 | Padovan | Gianluca | 1 |
4 | Terragna | Elisabetta | 2 |
5 | Verdi | Marco | Zero |
La tabella mostra due peculiarità: i collaboratori Rossi e Padovan lavorano nello stesso reparto. Il dipendente Verdi non è stato ancora assegnato a un reparto.
La tabella “reparti” elenca tutti i reparti dell'azienda, compresi ID e ubicazione.
Tabella: reparti
r_id | denominazione | città |
---|---|---|
1 | Distribuzione | Roma |
2 | IT | Milano |
3 | Personale | Firenze |
4 | Ricerca | Milano |
Entrambe le tabelle sono collegate da una relazione a chiave esterna. L'ID del reparto, che funge da chiave primaria nella tabella “reparti”, è stato integrato come chiave esterna nella tabella “collaboratori”.
Questo collegamento ci permette di avere una inner join in entrambe le tabelle. Ciò è necessario, ad esempio, per determinare dove un collaboratore stia lavorando.
Quando si interrogano database relazionali, la corrispondenza tra la chiave primaria e la chiave esterna viene solitamente definita come condizione di selezione. La condizione si considera soddisfatta se la chiave esterna selezionata di una tabella corrisponde alla chiave primaria dell'altra tabella (=). Ciò significa che vengono restituiti solo i record di dati che contengono valori comuni.
Una inner join simile è annotata nell'algebra relazionale come segue.
collaboratori⋈r_id=r_idreparti
Tuttavia, i sistemi di database relazionali non accettano comandi nella sintassi dell'algebra relazionale, ma sotto forma di dichiarazioni SQL.
SELECT * FROM collaboratori INNER JOIN reparti ON collaboratori.r_id = reparti.r_id;
Il comando SELECT ordina al DBMS di recuperare i dati dal database. In alternativa, SQL consente di inserire (INSERT INTO), di modificare (UPDATE) o cancellare (DELETE FROM) i dati. Il comando SELECT è seguito dalla specificazione di quali dati devono essere recuperati. Poiché vogliamo recuperare il record di dati completo, selezioniamo un segnaposto corrispondente: l'asterisco (*).
Il comando SELECT richiede sempre la parola chiave FROM e la specificazione della tabella o del gruppo di tabelle (JOIN) da cui devono essere recuperati i dati. Nel nostro caso, l'origine dei dati è una inner join tra le tabelle “reparti” e “collaboratori”. Utilizziamo anche la parola chiave ON per specificare una condizione per il collegamento. Vogliamo solo collegare i record di dati e produrli come tabella dei risultati in cui r_id della tabella “collaboratori” corrisponde a r_id della tabella “reparti”.
Visto che l'inner join è il join SQL più importante, se necessario potete omettere la parola chiave “inner”.
Una inner join tra le due tabelle di output con la condizione collaboratori.r_id = reparti.r_id restituisce la seguente tabella dei risultati.
Tabella: inner join SQL tra “collaboratori” e “reparti”
c_id | cognome | nome | collaboratori.r_id | reparti.r_id | denominazione | città |
---|---|---|---|---|---|---|
1 | Bianchi | Maria | 3 | 3 | Personale | Firenze |
2 | Rossi | Giada | 1 | 1 | Distribuzione | Roma |
3 | Padovan | Gianluca | 1 | 1 | Distribuzione | Roma |
4 | Terragna | Elisabetta | 2 | 2 | IT | Milano |
Se si confronta la tabella dei risultati con le due tabelle di output, si noterà che manca un record di dati per ogni tabella. Si tratta di quei record di dati che nella colonna r_id non contengono un valore corrispondente a quelli presenti nella relativa tabella.
(5, Verdi, Marco, Zero)
e
(4, Ricerca, Milano)
Il dipendente Verdi non è ancora stato assegnato a un reparto. Non sono ancora stati assegnati collaboratori al reparto di ricerca. Entrambi i record di dati sono perciò esclusi da una inner join, che ha lo scopo di fornire un confronto tra i dipendenti e i rispettivi reparti.
Se, invece, vogliamo rilevare esattamente tali irregolarità e renderle visibili nell'interrogazione, dovremmo scegliere una outer join al posto di una inner join.
Sottocategorie di inner join
Le inner join si possono realizzare sotto forma di theta join, equi join, non equi join e natural join.
Theta join, equi join e non equi join
L'inner join della terminologia SQL corrisponde al theta join dell'algebra relazionale. La theta join si differenzia da equi join e non equi join, in quanto fornisce agli utenti un numero illimitato di operatori di confronto tra cui scegliere. Le equi join, invece, limitano la condizione di selezione per le query sull'uguaglianza dei valori delle colonne. Le non equi join, invece, ammettono tutti gli operatori di confronto ad eccezione del segno uguale.
Tipo di join | Operatori di confronto ammessi |
---|---|
Theta join | = (uguale) < (minore) > (maggiore)≤ (minore o uguale)≥ (maggiore o uguale)<> (diseguale)!= (diseguale) |
Equi join | = (uguale) |
Non equi join | < (minore) > (maggiore)≤ (minore o uguale)≥ (maggiore o uguale)<> (diseguale)!= (diseguale) |
Natural join
Se due tabelle (come negli esempi precedenti) sono collegate da colonne con lo stesso nome, le inner join vengono solitamente convertite in natural join.
Le natural join sono una sottocategoria di equi join. Come anche l'equi join, la natural join prevede l'uguaglianza dei valori delle due colonne come condizione di selezione.
Una natural inner join tra le tabelle “collaboratori” e “reparti” potrebbe, ad esempio, essere implementata nel modo seguente:
SELECT * FROM collaboratori INNER JOIN reparti USING(r_id);
La dichiarazione SQL indica al DBMS di collegare le tabelle elencate. La condizione di selezione viene implementata usando la parola chiave USING, che specifica quali colonne devono essere controllate per l'uguaglianza. Il prerequisito è che in entrambe le tabelle esista una colonna r_id. I record di dati di entrambe le tabelle sono inclusi nel set di risultati solo se il DBMS trova valori identici nelle colonne designate con r_id.
Anche la tabella dei risultati della natural join si differenzia da quella della classica inner join, in quanto le colonne con lo stesso nome nelle tabelle di output non sono elencate due volte, ma vengono unite in una colonna comune.
Tabella: natural join tra “collaboratori” e “reparti”
c_id | cognome | nome | r_id | denominazione | città |
---|---|---|---|---|---|
1 | Bianchi | Maria | 3 | Personale | Firenze |
2 | Rossi | Giada | 1 | Distribuzione | Roma |
3 | Padovan | Gianluca | 1 | Distribuzione | Roma |
4 | Terragna | Elisabetta | 2 | IT | Milano |
Invece di elencare gli ID di reparto di entrambe le tabelle due volte sia in collaboratori.r_id che in reparti.r_id, viene visualizzata una sola colonna r_id.
Per le natural join è disponibile una notazione abbreviata che non richiede una clausola USING. Si utilizza invece l'operatore natural join. La notazione abbreviata indicata sopra corrisponde alla seguente dichiarazione SQL.
SELECT * FROM collaboratori NATURAL JOIN reparti;
L'operatore natural join collega automaticamente le tabelle utilizzando colonne con lo stesso nome. La condizione di selezione non deve essere definita esplicitamente.
Una natural join viene implementata automaticamente come inner join. Se, invece, volete implementare una outer join come natural join, sono necessarie parole chiave aggiuntive (ad esempio una natural left outer join).