MySQL UNISCE Tutorial: INTERNO, ESTERNO, SINISTRA, DESTRA, CROCE
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 gli strumenti SQL. Per ragioni di semplicitร e facilitร di comprensione, utilizzeremo un nuovo database per fare pratica con l'esempio. Come mostrato di seguito
| 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 |
| 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 |
Tipi di join
Croce ISCRIVITI
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
Il JOIN interno viene utilizzato per restituire righe da entrambe le tabelle che soddisfano la condizione specificata.
Supponiamo che tu voglia ottenere l'elenco dei membri che hanno noleggiato film insieme ai titoli dei film noleggiati da loro. Puoi semplicemente utilizzare un INNER JOIN per questo, che restituisce righe da entrambe le tabelle che soddisfano determinate condizioni.
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
MySQL I JOIN esterni 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 confuso? Diamo un'occhiata a 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 fornisce. Puoi vedere che nel risultato restituito, elencato di seguito, per i film non noleggiati, i campi del nome membro hanno valori NULL. Ciรฒ significa che nessun membro corrispondente ha trovato la 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โ.
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 GRUPPO PER, DOVE e funziona anche come SUM, AVG, ecc.
Perchรฉ dovremmo usare i join?
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.
Sintesi
- I JOINS ci consentono di combinare i dati di piรน tabelle in un unico set di risultati.
- I JOINS hanno prestazioni migliori rispetto alle sottoquery
- Gli INNER JOINS restituiscono solo le righe che soddisfano i criteri specificati.
- OUTER JOINS puรฒ anche restituire righe in cui non sono state trovate corrispondenze. Le righe senza corrispondenza vengono restituite con la parola chiave NULL.
- I principali tipi di JOIN includono Inner, Left Outer, Right Outer, Cross JOINS ecc.
- La clausola utilizzata frequentemente nelle operazioni JOIN รจ "ON". La clausola "USING" richiede che le colonne corrispondenti abbiano lo stesso nome.
- JOINS puรฒ essere utilizzato anche in altre clausole come GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS ecc.




