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.

  • 🔗 Kerneformål: UNION stabler de rækker, der returneres af flere SELECT-forespørgsler, i et enkelt resultatsæt, den ene forespørgsel under den anden.
  • 📐 Kolonneregel: Hver SELECT skal returnere det samme antal kolonner, i samme rækkefølge, med kompatible datatyper.
  • 🧹 UNION DISTINCT: Duplikerede rækker fjernes, og kun unikke rækker returneres, og dette er adfærden. MySQL gælder som standard.
  • 📚 UNION ALLE: Hver række returneres, inklusive dubletter, hvilket er hurtigere, fordi der ikke kræves nogen deduplikeringsproces.
  • 🏷️ Kolonnenavne: Resultatsættet får sine kolonnenavne fra den første SELECT-sætning, så aliasser hører hjemme i den forespørgsel.
  • 🛠️ Typisk brug: Konsolidering af to tabeller, der indeholder den samme type post, uden at tillade dubletter af rækker i det flettede output.

MySQL UNION OperaTor

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.

MySQL UNIONMySQL UNION

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:

  1. Lige antal kolonner. Hver SELECT erklæring skal returnere det samme antal kolonner, ellers MySQL giver fejl 1222.
  2. 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.
  3. 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.

Union-Distinct

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.

Union-Alle

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

Ofte Stillede Spørgsmål

UNION stabler rækkerne fra én forespørgsel under en anden, så resultatet bliver højere. JOIN matcher relaterede rækker og placerer deres kolonner side om side, så resultatet bliver bredere. Brug UNION til lignende rækker og JOIN til relaterede tabeller.

Placer en enkelt BESTIL BY klausul efter den sidste SELECT. Den sorterer det kombinerede resultat og skal bruge de kolonnenavne, der er produceret af den første SELECT. En LIMIT-klausul, der placeres der, opfører sig på samme måde.

Fejl 1222 vises, når SELECT-grenene returnerer ulige kolonneantal. Tæl kolonnerne i hver gren, og tilføj en literal eller en NULL-pladsholder til den kortere gren, så begge sider er justeret i samme rækkefølge.

Ja. Tekst til SQL-assistenter, inklusive dem der er indbygget i MySQL Workbench, generer UNION-udsagn fra en almindelig anmodning. Kontroller selv kolonnerækkefølgen, da en model kan justere kolonner, der blot ligner hinanden.

En assistent kan foreslå UNION ALL, når dubletter er umulige, hvilket er en almindelig hastighedsgevinst. Beslutningen afhænger stadig af dataene, så bekræft, at grenene virkelig ikke kan overlappe hinanden, før du fjerner deduplikeringstrinnet.

Opsummer dette indlæg med: