MySQL UNION – Komplet vejledning
⚡ Smart opsummering
MySQL UNION kombinerer resultaterne af to eller flere SELECT-forespørgsler i ét samlet resultatsæt. Denne forklaring dækker de kolonneregler, der gør en union gyldig, forskellen mellem UNION DISTINCT og UNION ALL, og bearbejdede eksempler, der køres mod myflixdb-databasen.

Hvad er en UNION i MySQL?
UNION er en MySQL en operator, der kombinerer resultaterne fra flere SELECT-forespørgsler til et konsolideret resultatsæt. De rækker, der returneres af den anden forespørgsel, placeres under de rækker, der returneres af den første, hvilket producerer én lodret liste i stedet for to separate.
Det eneste krav for at dette kan virke er, at antallet af kolonner skal være det samme fra alle de SELECT-forespørgsler, der skal kombineres.
Antag, at vi har to tabeller som følger.
Begge tabeller indeholder to kolonner af samme slags, så de er berettigede til en forening. De følgende eksempler kombinerer præcis disse to tabeller.
Hvorfor bruge UNION?
Antag, at der er en fejl i dit databasedesign, og du bruger to forskellige tabeller beregnet til samme formål. Du vil konsolidere disse to tabeller til én, mens du udelader eventuelle duplikater fra cree.ping ind i den nye tabel. Du kan bruge UNION i sådanne tilfælde.
Operatoren er også nyttig i det daglige rapporteringsarbejde:
- Archived og live-data: En aktuel tabel og en arkivtabel, der deler de samme kolonner, kan rapporteres sammen uden fysisk at flette dem sammen.
- Flere kilder, én rapport: Medlemmer og film, eller salg fra to regioner, kan listes i et enkelt output for en hurtig gennemgang.
- Migrationstjek: Rækker fra den gamle tabel og den nye tabel kan stables og sammenlignes, før den gamle tabel slettes.
En union er ikke en erstatning for en JOIN. UNION tilføjer rækker under rækker, hvorimod en JOIN tilføjer kolonner ved siden af kolonner, og denne sondring bestemmer, hvilken operator opgaven kræver.
MySQL UNION-syntaks og -regler
Nu hvor formålet er klart, så se på formen af sætningen og de regler, databasen håndhæver.
SELECT column1, column2 FROM `table1` UNION [DISTINCT | ALL] SELECT column1, column2 FROM `table2`;
Tre regler gælder for enhver fagforening:
- Lige antal kolonner. Hver SELECT erklæring skal returnere det samme antal kolonner, ellers MySQL giver fejl 1222.
- Kompatible datatyper i samme rækkefølge. Kolonne et i den første forespørgsel matches med kolonne et i den anden, så et tal skal møde et tal, og tekst skal møde tekst.
- Navnene stammer fra den første forespørgsel. Overskriften på resultatsættet er taget fra den første SELECT, hvilket er grunden til, at ethvert alias hører hjemme der.
An ORDER BY eller LIMIT Klausulen, der placeres til sidst, gælder for det kombinerede resultat i stedet for én gren af det, og den skal referere til de kolonnenavne, der produceres af den første SELECT.
UNION DISTINCT vs. UNION ALL
Med reglerne på plads er den resterende beslutning, om dublerede rækker skal bevares.
Kombinering af tabeller ved hjælp af DISTINCT
Lad os nu oprette en UNION-forespørgsel for at kombinere begge tabeller ved hjælp af DISTINCT.
SELECT column1, column2 FROM `table1` UNION DISTINCT SELECT column1, column2 FROM `table2`;
Her fjernes duplikerede rækker, og kun unikke rækker returneres.
Bemærk: MySQL bruger DISTINCT-sætningen som standard, når der udføres UNION-forespørgsler, hvis intet er angivet.
Kombinering af tabeller ved hjælp af ALL
Lad os nu oprette en UNION-forespørgsel for at kombinere begge tabeller ved hjælp af ALL.
SELECT `column1`, `column2` FROM `table1` UNION ALL SELECT `column1`, `column2` FROM `table2`;
Her er duplikerede rækker inkluderet, da vi bruger ALL.
De to billeder gør forskellen let at se, og tabellen nedenfor opsummerer den.
| Punkt af sammenligning | UNION DISTINK | UNION ALLE |
|---|---|---|
| Dublerede rækker | Fjernet fra resultatet | Holdes i resultatet |
| Standardadfærd | Ja, anvendes når intet er angivet | Nej, nøgleordet ALL skal skrives |
| Speed | Langsommere, et deduplikeringspas er påkrævet | Hurtigere, rækker returneres, efterhånden som de læses |
| Bedste brugt når | Den flettede liste skal indeholde unikke rækker | Hver række tæller, ellers kan dubletter ikke forekomme |
💡 Tip: Hvis de to grene ikke kan producere dublerede rækker, skal du vælge UNION ALL. Databasen springer derefter sorterings- og sammenligningsarbejdet over, som DISTINCT kræver, hvilket er en mærkbar besparelse på store tabeller.
Praktisk eksempel ved brug af MySQL Workbench
Eksemplerne indtil videre har brugt eksempeltabeller. Den samme forespørgsel kører nu mod den rigtige myflixdb-database, hvor de to tabeller indeholder helt forskellige poster.
I vores myFlixDB, lad os kombinere membership_number og full_names kolonner fra medlemstabellen med movie_id og title kolonner fra filmtabellen. Begge forespørgsler returnerer to kolonner, så foreningen er gyldig.
Vi kan bruge følgende forespørgsel.
SELECT `membership_number`, `full_names` FROM `members` UNION SELECT `movie_id`, `title` FROM `movies`;
Udførelse af ovenstående script i MySQL arbejdsbord mod myflixdb giver os følgende resultater vist nedenfor. Bemærk at overskrifterne kommer fra den første SELECT, selvom de nederste rækker er filmoptagelser.
| 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 |




