MySQL Unione: Interno, Esterno, Sinistra, Destra, Croce
โก Riepilogo intelligente
MySQL Le JOIN combinano righe provenienti da due o piรน tabelle correlate in un unico set di risultati. Questa risorsa illustra le JOIN CROSS, INNER, LEFT, RIGHT e OUTER con query eseguibili, dati di esempio e tabelle di output chiare per un utilizzo pratico nei database.

Cosa sono i JOIN?
I join aiutano a recuperare i dati da due o piรน tabelle di database.
Le tabelle sono reciprocamente correlate utilizzando chiavi primarie ed esterne.
Nota: JOIN รจ l'argomento piรน frainteso tra chi studia SQL. Per semplicitร e facilitร di comprensione, useremo un nuovo database come esempio. Come mostrato di seguito
Ogni esempio seguente utilizza queste due tabelle. id_film colonna in Persone indica il id colonna in film โ la relazione su cui si basa ogni corrispondenza JOIN.
Persone
| id | nome | cognome | id_film |
|---|---|---|---|
| 1 | Adam | fabbro | 1 |
| 2 | Ravi | Kumar | 2 |
| 3 | Susan | Davidson | 5 |
| 4 | Jenny | Adrianna | 8 |
| 5 | Lee | Pong | 10 |
film
| id | titolo | categoria |
|---|---|---|
| 1 | IL CREDO DELL'ASSASSINO: BRICI | animazioni |
| 2 | Vero acciaio (2012) | animazioni |
| 3 | Alvin and the Chipmunks | animazioni |
| 4 | Le avventure di Tin Tin | animazioni |
| 5 | Sicuro (2012) | Action |
| 6 | Casa sicura (2012) | Action |
| 7 | GIA | 18+ |
| 8 | Scadenza 2009 | 18+ |
| 9 | L'immagine sporca | 18+ |
| 10 | Marley ed io | Romanticismo |
Perchรฉ dovremmo usare le JOIN?
Prima di esaminare ciascun tipo di JOIN, รจ utile capire perchรฉ un JOIN รจ preferibile all'esecuzione di piรน query.
Ora potresti pensare, perchรฉ utilizziamo i JOIN quando possiamo svolgere la stessa attivitร eseguendo query. Soprattutto se hai una certa esperienza nella programmazione di database, sai che possiamo eseguire le query una per una e utilizzare l'output di ciascuna in query successive. Naturalmente, questo รจ possibile. Ma utilizzando i JOIN, puoi portare a termine il lavoro utilizzando solo una query con qualsiasi parametro di ricerca. D'altra parte MySQL puรฒ ottenere prestazioni migliori con JOIN in quanto puรฒ utilizzare l'indicizzazione. Il semplice utilizzo di una singola query JOIN invece dell'esecuzione di piรน query riduce il sovraccarico del server. L'utilizzo di piรน query comporta invece piรน trasferimenti di dati tra MySQL e applicazioni (software). Inoltre richiede anche piรน manipolazioni dei dati nella parte finale dell'applicazione.
ร chiaro che possiamo ottenere risultati migliori MySQL e prestazioni dell'applicazione mediante l'uso di JOIN.
Tipi di JOIN
MySQL Supporta diversi tipi di JOIN, ognuno dei quali risponde a una domanda diversa sulle stesse due tabelle. La tabella seguente li confronta; ogni tipo viene poi illustrato con una query e il relativo output.
| Tipo di unione | Righe restituite | Risultati con valori NULL? | Utilizzo tipico |
|---|---|---|---|
| CROSS UNISCI | Ogni riga della tabella A abbinata a ogni riga della tabella B | Non | Generazione di tutte le combinazioni possibili |
| INNER JOIN | Solo le righe che soddisfano la condizione in entrambe le tabelle | Non | Membri che hanno effettivamente noleggiato un film |
| LEFT JOIN | Tutte le righe della tabella di sinistra, piรน le corrispondenze da quella di destra | Sรฌ, sul lato destro | Tutti i film, anche quelli mai noleggiati |
| GIUSTO UNISCITI | Tutte le righe della tabella di destra, piรน le corrispondenze della tabella di sinistra | Sรฌ, sul lato sinistro | Tutti i film, anche senza abbonamento |
CROSS UNISCI
Il Cross JOIN รจ la forma piรน semplice di JOIN che abbina ogni riga di una tabella di database a tutte le righe di un'altra.
In altre parole ci fornisce le combinazioni di ciascuna riga della prima tabella con tutti i record della seconda tabella.
Supponiamo di voler ottenere tutti i record dei membri rispetto a tutti i record dei film, possiamo utilizzare lo script mostrato di seguito per ottenere i risultati desiderati.
SELECT * FROM `movies` CROSS JOIN `members`
Eseguendo lo script precedente in MySQL banco di lavoro ci fornisce i seguenti risultati.
| id | title | id | first_name | last_name | movie_id | |
|---|---|---|---|---|---|---|
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 1 | Adam | Smith | 1 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 2 | Ravi | Kumar | 2 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 3 | Susan | Davidson | 5 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 4 | Jenny | Adrianna | 8 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 6 | Lee | Pong | 10 |
| 2 | Real Steel(2012) | Animations | 1 | Adam | Smith | 1 |
| 2 | Real Steel(2012) | Animations | 2 | Ravi | Kumar | 2 |
| 2 | Real Steel(2012) | Animations | 3 | Susan | Davidson | 5 |
| 2 | Real Steel(2012) | Animations | 4 | Jenny | Adrianna | 8 |
| 2 | Real Steel(2012) | Animations | 6 | Lee | Pong | 10 |
| 3 | Alvin and the Chipmunks | Animations | 1 | Adam | Smith | 1 |
| 3 | Alvin and the Chipmunks | Animations | 2 | Ravi | Kumar | 2 |
| 3 | Alvin and the Chipmunks | Animations | 3 | Susan | Davidson | 5 |
| 3 | Alvin and the Chipmunks | Animations | 4 | Jenny | Adrianna | 8 |
| 3 | Alvin and the Chipmunks | Animations | 6 | Lee | Pong | 10 |
| 4 | The Adventures of Tin Tin | Animations | 1 | Adam | Smith | 1 |
| 4 | The Adventures of Tin Tin | Animations | 2 | Ravi | Kumar | 2 |
| 4 | The Adventures of Tin Tin | Animations | 3 | Susan | Davidson | 5 |
| 4 | The Adventures of Tin Tin | Animations | 4 | Jenny | Adrianna | 8 |
| 4 | The Adventures of Tin Tin | Animations | 6 | Lee | Pong | 10 |
| 5 | Safe (2012) | Action | 1 | Adam | Smith | 1 |
| 5 | Safe (2012) | Action | 2 | Ravi | Kumar | 2 |
| 5 | Safe (2012) | Action | 3 | Susan | Davidson | 5 |
| 5 | Safe (2012) | Action | 4 | Jenny | Adrianna | 8 |
| 5 | Safe (2012) | Action | 6 | Lee | Pong | 10 |
| 6 | Safe House(2012) | Action | 1 | Adam | Smith | 1 |
| 6 | Safe House(2012) | Action | 2 | Ravi | Kumar | 2 |
| 6 | Safe House(2012) | Action | 3 | Susan | Davidson | 5 |
| 6 | Safe House(2012) | Action | 4 | Jenny | Adrianna | 8 |
| 6 | Safe House(2012) | Action | 6 | Lee | Pong | 10 |
| 7 | GIA | 18+ | 1 | Adam | Smith | 1 |
| 7 | GIA | 18+ | 2 | Ravi | Kumar | 2 |
| 7 | GIA | 18+ | 3 | Susan | Davidson | 5 |
| 7 | GIA | 18+ | 4 | Jenny | Adrianna | 8 |
| 7 | GIA | 18+ | 6 | Lee | Pong | 10 |
| 8 | Deadline(2009) | 18+ | 1 | Adam | Smith | 1 |
| 8 | Deadline(2009) | 18+ | 2 | Ravi | Kumar | 2 |
| 8 | Deadline(2009) | 18+ | 3 | Susan | Davidson | 5 |
| 8 | Deadline(2009) | 18+ | 4 | Jenny | Adrianna | 8 |
| 8 | Deadline(2009) | 18+ | 6 | Lee | Pong | 10 |
| 9 | The Dirty Picture | 18+ | 1 | Adam | Smith | 1 |
| 9 | The Dirty Picture | 18+ | 2 | Ravi | Kumar | 2 |
| 9 | The Dirty Picture | 18+ | 3 | Susan | Davidson | 5 |
| 9 | The Dirty Picture | 18+ | 4 | Jenny | Adrianna | 8 |
| 9 | The Dirty Picture | 18+ | 6 | Lee | Pong | 10 |
| 10 | Marley and me | Romance | 1 | Adam | Smith | 1 |
| 10 | Marley and me | Romance | 2 | Ravi | Kumar | 2 |
| 10 | Marley and me | Romance | 3 | Susan | Davidson | 5 |
| 10 | Marley and me | Romance | 4 | Jenny | Adrianna | 8 |
| 10 | Marley and me | Romance | 6 | Lee | Pong | 10 |
INNER JOIN
Un CROSS JOIN restituisce tutte le possibili coppie, che raramente corrispondono a ciรฒ che si desidera. Un INNER JOIN restringe il risultato alle coppie effettivamente correlate.
Il JOIN interno viene utilizzato per restituire righe da entrambe le tabelle che soddisfano la condizione specificata.
Supponiamo di voler ottenere un elenco degli iscritti che hanno noleggiato film, insieme ai titoli dei film noleggiati. ร sufficiente utilizzare un'operazione INNER JOIN, che restituisce le righe di entrambe le tabelle che soddisfano le condizioni specificate.
SELECT members.`first_name` , members.`last_name` , movies.`title` FROM members ,movies WHERE movies.`id` = members.`movie_id`
L'esecuzione dello script precedente dร
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
Nota che lo script dei risultati sopra puรฒ anche essere scritto come segue per ottenere gli stessi risultati.
SELECT A.`first_name` , A.`last_name` , B.`title` FROM `members` AS A INNER JOIN `movies` AS B ON B.`id` = A.`movie_id`
JOIN esterni
Un'operazione INNER JOIN elimina silenziosamente le righe che non hanno un partner. Quando queste righe non corrispondenti sono importanti, un'operazione OUTER JOIN รจ la scelta giusta.
MySQL Le JOIN esterne restituiscono tutti i record corrispondenti da entrambe le tabelle.
Puรฒ rilevare i record che non hanno corrispondenza nella tabella unita. Ritorna NULL valori per i record della tabella unita se non viene trovata alcuna corrispondenza.
Sembra complicato? Vediamo un esempio โ
LEFT JOIN
Supponiamo ora di voler ottenere i titoli di tutti i film insieme ai nomi dei membri che li hanno noleggiati. ร chiaro che alcuni film non sono stati noleggiati da nessuno. Possiamo semplicemente usare LEFT JOIN allo scopo.
Il LEFT JOIN restituisce tutte le righe della tabella a sinistra anche se non รจ stata trovata alcuna riga corrispondente nella tabella a destra. Se non รจ stata trovata alcuna corrispondenza nella tabella a destra, viene restituito NULL.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B ON B.`movie_id` = A.`id`
Eseguendo lo script precedente in MySQL workbench restituisce. Puoi vedere che nel risultato restituito, elencato di seguito, per i film non noleggiati, i campi del nome del membro hanno valori NULL. Ciรฒ significa che non รจ stato trovato alcun membro corrispondente nella tabella dei membri per quel particolare film.
| title | first_name | last_name |
|---|---|---|
| ASSASSIN'S CREED: EMBERS | Adam | Smith |
| Real Steel(2012) | Ravi | Kumar |
| Safe (2012) | Susan | Davidson |
| Deadline(2009) | Jenny | Adrianna |
| Marley and me | Lee | Pong |
| Alvin and the Chipmunks | NULL | NULL |
| The Adventures of Tin Tin | NULL | NULL |
| Safe House(2012) | NULL | NULL |
| GIA | NULL | NULL |
| The Dirty Picture | NULL | NULL |
GIUSTO UNISCITI
RIGHT JOIN รจ ovviamente l'opposto di LEFT JOIN. Il RIGHT JOIN restituisce tutte le colonne della tabella a destra anche se non sono state trovate righe corrispondenti nella tabella a sinistra. Se non รจ stata trovata alcuna corrispondenza nella tabella a sinistra, viene restituito NULL.
Nel nostro esempio, supponiamo che tu abbia bisogno di ottenere i nomi dei membri e i film da loro noleggiati. Ora abbiamo un nuovo membro che non ha ancora noleggiato nessun film
SELECT A.`first_name` , A.`last_name`, B.`title` FROM `members` AS A RIGHT JOIN `movies` AS B ON B.`id` = A.`movie_id`
Eseguendo lo script precedente in MySQL workbench fornisce i seguenti risultati.
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
| NULL | NULL | Alvin and the Chipmunks |
| NULL | NULL | The Adventures of Tin Tin |
| NULL | NULL | Safe House(2012) |
| NULL | NULL | GIA |
| NULL | NULL | The Dirty Picture |
Clausole โONโ e โUSINGโ.
Finora ogni query ha individuato righe corrispondenti con una clausola ON. MySQL offre un'alternativa piรน breve quando le colonne corrispondenti condividono lo stesso nome.
Negli esempi di query JOIN precedenti, abbiamo utilizzato la clausola ON per abbinare i record nella tabella.
Anche la clausola USING puรฒ essere utilizzata per lo stesso scopo. La differenza con UTILIZZO รจ deve avere nomi identici per le colonne corrispondenti in entrambe le tabelle.
Nella tabella โfilmโ finora abbiamo utilizzato la sua chiave primaria con il nome โidโ. Abbiamo fatto riferimento allo stesso nella tabella "membri" con il nome "movie_id".
Rinominiamo il campo "id" delle tabelle "film" con il nome "movie_id". Lo facciamo per avere nomi di campi corrispondenti identici.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Successivamente utilizziamo USING con l'esempio LEFT JOIN sopra.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B USING ( `movie_id` )
Oltre all'utilizzo ON and UTILIZZO con JOIN puoi usarne molti altri MySQL clausole come RAGGRUPPA PER, DOVE e funziona anche come SUM, AVG, ecc.




