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 | sottovento | 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 e 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.
Sommario
- 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.