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.

  • ๐Ÿ”— Principio fondamentale: Un'operazione JOIN confronta le righe di diverse tabelle utilizzando le relazioni di chiave primaria e chiave esterna.
  • โšก Perchรฉ รจ importante: Una singola query JOIN utilizza l'indicizzazione e riduce il numero di richieste al server rispetto a diverse query separate.
  • โœ–๏ธ Comportamento Cross JOIN: Ogni riga della prima tabella corrisponde a ogni riga della seconda, producendo un prodotto cartesiano.
  • ๐ŸŽฏ Comportamento JOIN interno: Vengono restituite solo le righe che soddisfano la condizione di corrispondenza in entrambe le tabelle.
  • โ†”๏ธ Comportamento JOIN esterno: Anche LEFT e RIGHT JOIN restituiscono righe non corrispondenti e riempiono le colonne mancanti con NULL.
  • ๐Ÿงฉ ACCESO contro UTILIZZANDO: L'opzione USER richiede nomi di colonna identici, mentre ON supporta qualsiasi espressione corrispondente.

MySQL SI UNISCE

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.

Tipi di join

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.

INNER JOIN

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.

JOIN esterni

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
Note: Null is returned for non-matching rows on right

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

GIUSTO UNISCITI

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
Note: Null is returned for non-matching rows on left

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.

DOMANDE FREQUENTI

Un'operazione JOIN combina le colonne di due tabelle affiancandole, facendo corrispondere le righe in base a una chiave. Un'operazione UNION, invece, sovrappone verticalmente i risultati di due query e richiede che il numero e i tipi di colonna corrispondano.

Sรฌ. Collega ulteriori clausole JOIN, ognuna con la propria condizione ON. MySQL unisce le prime due tabelle, poi unisce il risultato intermedio alla tabella successiva e cosรฌ via.

Un'operazione di SELF JOIN unisce una tabella a se stessa utilizzando due alias. Confronta le righe all'interno di una tabella, ad esempio abbinando la riga di un dipendente alla riga del responsabile di quel dipendente.

Sรฌ. Gli assistenti IA integrati negli editor come MySQL banco di lavoro รˆ possibile creare query JOIN tramite un prompt in linguaggio naturale. รˆ sempre necessario rivedere le condizioni ON generate, poichรฉ una chiave errata produce risultati errati senza alcun messaggio di errore.

In parte. I sistemi di intelligenza artificiale suggeriscono indici e un ordine di join migliore, che spesso riducono i tempi di esecuzione. Tuttavia, รจ l'ottimizzatore a scegliere il piano finale, quindi la corretta indicizzazione delle chiavi di join rimane il fattore piรน importante.

Riassumi questo post con: