MySQL UNION – Komplett handledning
⚡ Smart sammanfattning
MySQL UNION kombinerar resultaten från två eller flera SELECT-frågor till en konsoliderad resultatmängd. Denna förklaring täcker kolumnreglerna som gör en union giltig, skillnaden mellan UNION DISTINCT och UNION ALL, och utförda exempel som körs mot myflixdb-databasen.

Vad är en UNION i MySQL?
UNION är en MySQL operator som kombinerar resultaten från flera SELECT-frågor till en konsoliderad resultatmängd. Raderna som returneras av den andra frågan placeras under raderna som returneras av den första, vilket producerar en vertikal lista istället för två separata.
Det enda kravet för att detta ska fungera är att antalet kolumner ska vara detsamma från alla SELECT-frågor som behöver kombineras.
Antag att vi har två tabeller enligt följande.
Båda tabellerna innehåller två kolumner av samma typ, så de är berättigade till en förening. Exemplen som följer kombinerar exakt dessa två tabeller.
Varför använda UNION?
Anta att det finns ett fel i din databasdesign och du använder två olika tabeller avsedda för samma ändamål. Du vill slå samman dessa två tabeller till en samtidigt som du utesluter eventuella dubbletter från cree.ping in i den nya tabellen. Du kan använda UNION i sådana fall.
Operatorn är också användbar i det dagliga rapporteringsarbetet:
- Archived- och livedata: En aktuell tabell och en arkivtabell som delar samma kolumner kan rapporteras tillsammans, utan att fysiskt slå samman dem.
- Flera källor, en rapport: Medlemmar och filmer, eller försäljning från två regioner, kan listas i en enda utdata för en snabb granskning.
- Migreringskontroller: Rader från den gamla tabellen och den nya tabellen kan staplas och jämföras innan den gamla tabellen tas bort.
En union ersätter inte en JOIN. UNION lägger till rader under rader, medan en JOIN lägger till kolumner bredvid kolumner, och den distinktionen avgör vilken operator uppgiften kräver.
MySQL UNION-syntax och regler
Nu när syftet är tydligt, titta på formen på uttrycket och de regler som databasen tillämpar.
SELECT column1, column2 FROM `table1` UNION [DISTINCT | ALL] SELECT column1, column2 FROM `table2`;
Tre regler styr varje fackförening:
- Lika antal kolumner. Varje SELECT-sats måste returnera samma antal kolumner, annars MySQL ger fel 1222.
- Kompatibla datatyper i samma ordning. Kolumn ett i den första frågan matchas med kolumn ett i den andra, så ett tal ska möta ett tal och text ska möta text.
- Namnen kommer från den första frågan. Rubriken för resultatmängden är hämtad från den första SELECT-koden, vilket är anledningen till att alla alias hör hemma där.
An ORDER BY eller ett LIMIT Klausulen som placeras i slutet gäller för det kombinerade resultatet snarare än för en gren av det, och den måste referera till kolumnnamnen som produceras av den första SELECT-funktionen.
UNION DISTINCT vs UNION ALL
Med reglerna på plats är det återstående beslutet om dubbletter av rader ska finnas kvar.
Kombinera tabeller med DISTINCT
Låt oss nu skapa en UNION-fråga för att kombinera båda tabellerna med hjälp av DISTINCT.
SELECT column1, column2 FROM `table1` UNION DISTINCT SELECT column1, column2 FROM `table2`;
Här tas duplicerade rader bort och endast unika rader returneras.
Obs: MySQL använder DISTINCT-satsen som standard vid exekvering av UNION-frågor om inget anges.
Kombinera tabeller med hjälp av ALL
Låt oss nu skapa en UNION-fråga för att kombinera båda tabellerna med hjälp av ALL.
SELECT `column1`, `column2` FROM `table1` UNION ALL SELECT `column1`, `column2` FROM `table2`;
Här inkluderas dubbletter av rader, eftersom vi använder ALL.
De två bilderna gör skillnaden lätt att se, och tabellen nedan sammanfattar den.
| Punkt av jämförelse | UNION DISTINKT | UNION ALLA |
|---|---|---|
| Dubbletter av rader | Borttagen från resultatet | Behålls i resultatet |
| Standardbeteende | Ja, tillämpas när inget är specificerat | Nej, nyckelordet ALL måste skrivas |
| Fart | Långsammare, ett dedupliceringspass krävs | Snabbare, rader returneras allt eftersom de läses |
| Bäst att använda när | Den sammanslagna listan måste innehålla unika rader | Varje rad spelar roll, annars kan dubbletter inte förekomma |
💡 Tips: Om de två grenarna inte kan producera dubbletter av rader, välj UNION ALL. Databasen hoppar då över sorterings- och jämförelsearbetet som DISTINCT kräver, vilket är en märkbar besparing på stora tabeller.
Praktiskt exempel med hjälp av MySQL Arbetsbänk
Exemplen hittills har använt exempeltabeller. Samma fråga körs nu mot den riktiga myflixdb-databasen, där de två tabellerna innehåller helt olika poster.
I vår myFlixDB, låt oss kombinera membership_number och full_names kolumner från medlemstabellen med movie_id och title kolumner från filmtabellen. Båda frågorna returnerar två kolumner, så unionen är giltig.
Vi kan använda följande fråga.
SELECT `membership_number`, `full_names` FROM `members` UNION SELECT `movie_id`, `title` FROM `movies`;
Exekvera skriptet ovan i MySQL arbetsbänk mot myflixdb ger oss följande resultat som visas nedan. Observera att rubrikerna kommer från den första SELECT-filen, även om de nedre raderna är filminspelningar.
| 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 |




