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.

  • 🔗 Kärnsyfte: UNION staplar raderna som returneras av flera SELECT-frågor till en enda resultatmängd, en fråga under den andra.
  • 📐 Kolumnregel: Varje SELECT måste returnera samma antal kolumner, i samma ordning, med kompatibla datatyper.
  • 🧹 UNIONENS DISTINKT: Dubbletter av rader tas bort och endast unika rader returneras, och detta är beteendet. MySQL gäller som standard.
  • 📚 Fackförening ALLA: Varje rad returneras, inklusive dubbletter, vilket är snabbare eftersom inget dedupliceringspass krävs.
  • 🏷️ Kolumnnamn: Resultatmängden tar sina kolumnnamn från den första SELECT-satsen, så alias hör hemma i den frågan.
  • 🛠️ Typisk användning: Konsolidera två tabeller som innehåller samma typ av post, utan att tillåta dubbletter av rader i den sammanslagna utdata.

MySQL UNION Operator

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.

MySQL UNIONMySQL UNION

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:

  1. Lika antal kolumner. Varje SELECT-sats måste returnera samma antal kolumner, annars MySQL ger fel 1222.
  2. 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.
  3. 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.

Union-Distinkt

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.

Union-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

Vanliga frågor

UNION staplar raderna från en fråga under en annan, så att resultatet blir högre. JOIN matchar relaterade rader och placerar deras kolumner sida vid sida, så att resultatet blir bredare. Använd UNION för liknande rader och JOIN för relaterade tabeller.

Placera en singel SORTERA EFTER klausulen efter den sista SELECT-klausulen. Den sorterar det kombinerade resultatet och måste använda kolumnnamnen som produceras av den första SELECT-klausulen. En LIMIT-klausul som placeras där beter sig på samma sätt.

Fel 1222 visas när SELECT-grenarna returnerar ojämna kolumnantal. Räkna kolumnerna i varje gren och lägg till en literal eller en NULL-platshållare till den kortare grenen så att båda sidorna radas upp i samma ordning.

Ja. Text till SQL-assistenter, inklusive de som är inbyggda i MySQL Arbetsbänk, generera UNION-satser från en vanlig begäran. Kontrollera kolumnordningen själv, eftersom en modell kan justera kolumner som bara ser likadana ut.

En assistent kan föreslå UNION ALL när dubbletter är omöjliga, vilket är en vanlig snabbare lösning. Beslutet beror fortfarande på data, så bekräfta att grenarna verkligen inte kan överlappa varandra innan du tar bort dedupliceringssteget.

Sammanfatta detta inlägg med: