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.

  • 🔗 Scopo principale: UNION unisce le righe restituite da diverse query SELECT in un unico set di risultati, una query sotto l'altra.
  • 📐 Regola delle colonne: Ogni istruzione SELECT deve restituire lo stesso numero di colonne, nello stesso ordine, con tipi di dati compatibili.
  • 🧹 UNION DISTINCT: Le righe duplicate vengono rimosse e vengono restituite solo le righe univoche, e questo è il comportamento MySQL si applica per impostazione predefinita.
  • 📚 UNITEVI TUTTI: Vengono restituite tutte le righe, inclusi i duplicati, il che è più veloce perché non è necessario alcun passaggio di deduplicazione.
  • 🏷️ Nomi delle colonne: Il set di risultati prende i nomi delle colonne dalla prima istruzione SELECT, quindi gli alias appartengono a quella query.
  • Uso tipico: Consolidamento di due tabelle contenenti lo stesso tipo di record, senza consentire righe duplicate nel risultato finale.

MySQL UNION Operator

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.

MySQL UNIONMySQL UNION

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:

  1. Conteggio delle colonne uguale. Ogni Istruzione SELECT deve restituire lo stesso numero di colonne, altrimenti MySQL genera l'errore 1222.
  2. 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.
  3. 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.

Unione-distinta

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.

Unione-Tutti

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

DOMANDE FREQUENTI

UNION impila le righe di una query sotto un'altra, in modo che il risultato diventi più alto. ISCRIVITI Unisce le righe correlate e posiziona le loro colonne una accanto all'altra, in modo che il risultato si espanda. Utilizza UNION per le righe simili e JOIN per le tabelle correlate.

Posiziona un singolo ORDINATO DA clausola dopo l'ultima SELECT. Ordina il risultato combinato e deve utilizzare i nomi delle colonne prodotti dalla prima SELECT. Una clausola LIMIT inserita in quella posizione si comporta allo stesso modo.

L'errore 1222 si verifica quando i rami SELECT restituiscono un numero di colonne diverso. Conta le colonne in ciascun ramo e aggiungi un valore letterale o un segnaposto NULL al ramo più corto in modo che entrambi i lati siano allineati nello stesso ordine.

Sì. Assistenti da testo a SQL, inclusi quelli integrati in MySQL banco di lavoroGenera istruzioni UNION da una semplice richiesta. Verifica tu stesso l'ordine delle colonne, perché un modello può allineare colonne che sembrano semplicemente simili.

Un assistente può suggerire UNION ALL quando i duplicati sono impossibili, il che spesso si traduce in un aumento di velocità. La decisione dipende comunque dai dati, quindi è necessario verificare che i rami non possano effettivamente sovrapporsi prima di rimuovere il passaggio di deduplicazione.

Riassumi questo post con: