MySQL UNIONE – Tutorial completo
⚡ Riepilogo intelligente
MySQL UNION combina i risultati di due o più query SELECT in un unico set di risultati consolidato. Questa spiegazione illustra le regole relative alle colonne che rendono valida un'unione, la differenza tra UNION DISTINCT e UNION ALL e presenta esempi pratici eseguiti sul database myflixdb.

Che cos'è un'unione in MySQL?
UNION è un MySQL Operatore che combina i risultati di più query SELECT in un set di risultati consolidato. Le righe restituite dalla seconda query vengono posizionate sotto le righe restituite dalla prima, producendo un unico elenco verticale anziché due elenchi separati.
L'unico requisito affinché ciò funzioni è che il numero di colonne sia lo stesso per tutte le query SELECT che devono essere combinate.
Supponiamo di avere due tabelle come segue.
Entrambe le tabelle contengono due colonne dello stesso tipo, quindi sono idonee per un'unione. Gli esempi che seguono combinano esattamente queste due tabelle.
Perché utilizzare UNION?
Supponiamo che ci sia un errore nella progettazione del tuo database e che tu stia usando due tabelle diverse destinate allo stesso scopo. Vuoi consolidare queste due tabelle in una sola, omettendo tutti i record duplicati dalla creazione.ping nella nuova tabella. In questi casi è possibile utilizzare UNION.
L'operatore è utile anche per le attività di reporting quotidiane:
- ArchiDati in tempo reale e aggiornati: È possibile generare report congiuntamente su una tabella corrente e su una tabella di archivio che condividono le stesse colonne, senza doverle unire fisicamente.
- Diverse fonti, un unico rapporto: È possibile elencare i membri e i film, oppure le vendite provenienti da due regioni, in un unico output per una rapida verifica.
- Controlli sull'immigrazione: Le righe della vecchia tabella e della nuova tabella possono essere impilate e confrontate prima che la vecchia tabella venga eliminata.
L'operazione UNION non sostituisce l'operazione JOIN. UNION aggiunge righe sotto le righe, mentre JOIN aggiunge colonne accanto alle colonne, e questa differenza determina quale operatore è necessario utilizzare.
MySQL Sintassi e regole di UNION
Ora che lo scopo è chiaro, osservate la struttura dell'istruzione e le regole che il database applica.
SELECT column1, column2 FROM `table1` UNION [DISTINCT | ALL] SELECT column1, column2 FROM `table2`;
Ogni sindacato è governato da tre regole:
- Conteggio delle colonne uguale. Ogni Istruzione SELECT deve restituire lo stesso numero di colonne, altrimenti MySQL genera l'errore 1222.
- Tipi di dati compatibili nello stesso ordine. La prima colonna della prima query viene abbinata alla prima colonna della seconda, quindi un numero dovrebbe incontrare un numero e un testo dovrebbe incontrare un testo.
- I nomi provengono dalla prima query. L'intestazione del set di risultati viene ricavata dalla prima query SELECT, motivo per cui qualsiasi alias deve trovarsi lì.
An ORDER BY LIMIT La clausola posta alla fine si applica al risultato combinato anziché a un suo ramo, e deve fare riferimento ai nomi delle colonne prodotti dalla prima SELECT.
UNION DISTINCT vs UNION ALL
Con le regole stabilite, resta da decidere se le righe duplicate debbano essere mantenute.
Combinazione di tabelle tramite DISTINCT
Creiamo ora una query UNION per combinare entrambe le tabelle utilizzando DISTINCT.
SELECT column1, column2 FROM `table1` UNION DISTINCT SELECT column1, column2 FROM `table2`;
Qui le righe duplicate vengono rimosse e vengono restituite solo righe univoche.
Nota: MySQL utilizza la clausola DISTINCT come impostazione predefinita durante l'esecuzione delle query UNION se non viene specificato nulla.
Combinazione di tabelle utilizzando ALL
Creiamo ora una query UNION per combinare entrambe le tabelle utilizzando ALL.
SELECT `column1`, `column2` FROM `table1` UNION ALL SELECT `column1`, `column2` FROM `table2`;
Qui sono incluse le righe duplicate, poiché utilizziamo ALL.
Le due immagini rendono la differenza facilmente visibile, e la tabella sottostante la riassume.
| Punto di confronto | UNIONE DISTINTA | UNIONE TUTTI |
|---|---|---|
| Righe duplicate | Rimosso dal risultato | Mantenuto nel risultato |
| Comportamento predefinito | Sì, applicato quando non viene specificato nulla | No, la parola chiave ALL deve essere scritta |
| Velocità | Più lento, è necessario un passaggio di deduplicazione | Più veloce, le righe vengono restituite man mano che vengono lette |
| primi utilizzati quando | L'elenco unito deve contenere righe univoche | Ogni riga è importante, altrimenti non possono verificarsi duplicati. |
Suggerimento: Se i due rami non possono produrre righe duplicate, scegli UNION ALL. Il database salta quindi le operazioni di ordinamento e confronto richieste da DISTINCT, il che rappresenta un notevole risparmio su tabelle di grandi dimensioni.
Esempio pratico di utilizzo MySQL banco di lavoro
Gli esempi finora presentati hanno utilizzato tabelle di esempio. La stessa query viene ora eseguita sul database reale di myflixdb, dove le due tabelle contengono record piuttosto diversi.
Nel nostro myFlixDB, combiniamo il membership_number and full_names colonne dalla tabella dei membri con il movie_id and title colonne dalla tabella movies. Entrambe le query restituiscono due colonne, quindi l'unione è valida.
Possiamo utilizzare la seguente query.
SELECT `membership_number`, `full_names` FROM `members` UNION SELECT `movie_id`, `title` FROM `movies`;
Eseguendo lo script precedente in MySQL banco di lavoro Il confronto con myflixdb ci fornisce i seguenti risultati, mostrati di seguito. Si noti che le intestazioni provengono dalla prima SELECT, anche se le righe inferiori rappresentano i record dei film.
| membership_number | full_names |
|---|---|
| 1 | Janet Jones |
| 2 | Janet Smith Jones |
| 3 | Robert Phil |
| 4 | Gloria Williams |
| 5 | Leonard Hofstadter |
| 6 | Sheldon Cooper |
| 7 | Rajesh Koothrappali |
| 8 | Leslie Winkle |
| 9 | Howard Wolowitz |
| 16 | 67% Guilty |
| 6 | Angels and Demons |
| 4 | Code Name Black |
| 5 | Daddy's Little Girls |
| 7 | Davinci Code |
| 2 | Forgetting Sarah Marshal |
| 9 | Honey mooners |
| 19 | movie 3 |
| 1 | Pirates of the Caribean 4 |
| 18 | sample movie |
| 17 | The Great Dictator |
| 3 | X-Men |




