Cosa sono i JOINS?
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 esperti di SQL. Per motivi di semplicità e facilità di comprensione, utilizzeremo un nuovo database per fare pratica con il campione. Come mostrato di seguito
id | nome di battesimo | cognome | movie_id |
---|---|---|---|
1 | Adamo | fabbro | 1 |
2 | Ravi | Kumar | 2 |
3 | Susan | Davidson | 5 |
4 | Jenny | Adrianna | 8 |
6 | Lee | Pong | 10 |
id | titolo | categoria |
---|---|---|
1 | ASSASSIN'S CREED: EMBERS | Animazioni |
2 | Real Steel (2012) | Animazioni |
3 | Alvin and the Chipmunks | Animazioni |
4 | Le avventure di Tin Tin | Animazioni |
5 | Sicuro (2012) | Azione |
6 | Safe House (2012) | Azione |
7 | GIA | 18+ |
8 | Scadenza 2009 | 18+ |
9 | L'immagine sporca | 18+ |
10 | Marley e io | Romanza |
Tipi di join
Cross JOIN
Cross JOIN è una 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 combinazioni di ogni riga della prima tabella con tutti i record nella seconda tabella.
Supponiamo di voler ottenere tutti i record dei membri rispetto a tutti i record di film, possiamo usare lo script mostrato di seguito per ottenere i risultati desiderati.
SELECT * FROM `movies` CROSS JOIN `members`
L'esecuzione dello script precedente in MySQL workbench ci dà 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 di voler ottenere l'elenco dei membri che hanno noleggiato film insieme ai titoli dei film da loro noleggiati. Puoi semplicemente usare un INNER JOIN per quello, che restituisce le righe di entrambe le tabelle che soddisfano determinate condizioni.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`
L'esecuzione dello script precedente give
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ò essere scritto come segue per ottenere gli stessi risultati.
SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
JOIN esterno
I MySQL Outer JOIN restituiscono tutti i record corrispondenti da entrambe le tabelle.
Può rilevare record che non hanno corrispondenza nella tabella unita. Restituisce valori NULL per i record della tabella unita se non viene trovata alcuna corrispondenza.
Sembra confuso? Diamo un'occhiata a un esempio:
UNISCI A SINISTRA
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 per lo scopo.
LEFT JOIN restituisce tutte le righe della tabella a sinistra anche se non sono state trovate righe corrispondenti nella tabella a destra. Se non sono state trovate corrispondenze nella tabella a destra, viene restituito NULL.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
L'esecuzione dello script sopra in MySQL workbench dà. Puoi vedere che nel risultato restituito che è elencato sotto quello per i film che non sono noleggiati, i campi del nome del 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 |
PARTECIPA A DESTRA
RIGHT JOIN è ovviamente l'opposto di LEFT JOIN. RIGHT JOIN restituisce tutte le colonne della tabella a destra anche se non sono state trovate righe corrispondenti nella tabella a sinistra. Dove non sono state trovate corrispondenze nella tabella a sinistra, viene restituito NULL.
Nel nostro esempio, supponiamo che sia necessario 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 ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`
L'esecuzione dello 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 sopra, abbiamo utilizzato la clausola ON per abbinare i record tra le tabelle.
La clausola USING può essere utilizzata anche per lo stesso scopo. La differenza con USING è che deve avere nomi identici per le colonne corrispondenti in entrambe le tabelle.
Nella tabella "movies" 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" per avere il nome "id_film". Lo facciamo per avere nomi di campo identici.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Quindi usiamo USING con l'esempio di LEFT JOIN sopra.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
Oltre a usare ON e USING con JOINs puoi usare molte altre clausole MySQL come GROUP BY, WHERE e persino funzioni come SUM , AVG , ecc.
Perché dovremmo usare i join?
Ora potresti pensare, perché usiamo JOIN quando possiamo fare la stessa attività eseguendo query. Soprattutto se hai una certa esperienza nella programmazione di database, sai che possiamo eseguire le query una per una, usa l'output di ciascuna nelle query successive. Ovviamente è possibile. Ma usando i JOIN, puoi portare a termine il lavoro usando solo una query con qualsiasi parametro di ricerca. D'altra parte MySQL può ottenere prestazioni migliori con i JOIN poiché può utilizzare l'indicizzazione. Il semplice utilizzo di una singola query JOIN invece di eseguire più query riduce il sovraccarico del server. L'uso di più query invece porta a più trasferimenti di dati tra MySQL e applicazioni (software). Inoltre richiede più manipolazioni dei dati anche alla fine dell'applicazione.
È chiaro che possiamo ottenere migliori prestazioni di MySQL e delle applicazioni utilizzando i JOIN.
Sommario
- I JOINS ci consentono di combinare i dati di più di una tabella in un unico set di risultati.
- I JOINS hanno prestazioni migliori rispetto alle query secondarie
- 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 di frequente nelle operazioni JOIN è "ON". La clausola "USING" richiede che le colonne corrispondenti abbiano lo stesso nome.
- I JOINS possono essere utilizzati anche in altre clausole come GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS ecc.