Union (SQL)

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 16. marts 2022; checks kræver 2 redigeringer .

I SQL bruges UNION- operatoren til at forbinde to sæt rækker, der returneres af SQL-forespørgsler. Begge forespørgsler skal returnere det samme antal kolonner, og kolonner med samme ordinal skal have kompatible datatyper . Resultatet modtager strukturen (navne og kolonnetyper) af den første (venstre) forespørgsel, det vil sige, at operationen ikke er symmetrisk.

Når du kombinerer flere forespørgsler i en række, beregnes resultatet sekventielt fra venstre mod højre.

Denne operatør blev beskrevet i den første SQL-standard - SQL/89 [1] .

Syntaks

Operatøren er specificeret mellem anmodninger. I forenklet form ser det sådan ud:

< forespørgsel 1 > UNION [ ALLE ] < forespørgsel 2 > UNION [ ALLE ] < forespørgsel 3 > .....;

Som standard skjules alle duplikerede poster automatisk, medmindre udtrykket bruges UNION ALL.

Det skal bemærkes, at det UNIONi sig selv ikke garanterer rækkefølgen af ​​rækkerne. Linjerne fra den anden forespørgsel kan vises i begyndelsen, i slutningen eller endda blandes med linjerne fra den første forespørgsel. I de tilfælde, hvor der kræves en bestemt rækkefølge, skal der bruges et udtryk ORDER BY.

Vilkår for brug

Der er to hovedregler for brugen af ​​operatøren UNION:

  • antallet og rækkefølgen af ​​de kolonner, der skal udtrækkes, skal stemme overens i alle kombinerede forespørgsler;
  • datatyperne i de respektive kolonner skal være kompatible.

Datatyperne for de kolonner, hvorfra dataene hentes i de kombinerede forespørgsler, behøver ikke være nøjagtig de samme, men skal være kompatible gennem implicit konvertering. Hvis datatyperne er forskellige, bestemmes den resulterende datatype baseret på datatypeforrangsreglerne (for et bestemt DBMS). Hvis typerne matcher, men adskiller sig i præcision, skala eller længde, bestemmes resultatet ud fra de regler, der bruges til at kombinere udtryk (for et bestemt DBMS) [2] . Ikke-ANSI-typer, såsom DATA og BINÆR, bør normalt matche andre kolonner af samme ikke-standardtype [3] .

I Microsoft SQL Server skal XML-datatypekolonner være ækvivalente. Alle kolonner skal enten have en type defineret i XML-skemaet eller være utype. Indtastede kolonner skal referere til den samme samling af XML-skemaer [2] .

En anden kompatibilitetsbegrænsning er at forbyde null-værdier (NULL) i enhver join-kolonne, og disse værdier skal også være udelukket for alle tilsvarende kolonner i andre join-forespørgsler, da null-værdier (NULL) er forbudt med NOT NULL begrænsning. Du kan heller ikke bruge UNION i underforespørgsler, og du kan ikke bruge aggregerede funktioner i SELECT-sætningen af ​​en forespørgsel i en union (de fleste DBMS'er ignorerer dog disse begrænsninger) [3] .

Ansøgning

UNIONkan være meget nyttig i data warehousing applikationer, hvor tabeller sjældent er perfekt normaliseret . Et simpelt eksempel: der er tabeller i databasen sales2005og sales2006, som har en identisk struktur, men er adskilt af hensyn til ydeevnen. En word-forespørgsel UNIONgiver dig mulighed for at kombinere resultater fra begge tabeller.

Det er også værd at bemærke, at det UNION ALLvirker hurtigere end bare UNION, fordi som standard, når du bruger operatøren, UNIONudføres yderligere eliminering af dubletter, men når du bruger det UNION ALL, er det ikke [4] .

Eksempler

Brug af UNION ved valg fra to tabeller

To tabeller er givet:

salg 2005
person beløb
Ivan 1000
Alexei 2000
Sergey 5000
salg 2006
person beløb
Ivan 2000
Alexei 2000
Peter 35.000

Når du udfører følgende forespørgsel:

( SELECT * FROM sales2005 ) UNION ( SELECT * FROM sales2006 );

et resultatsæt opnås, men rækkefølgen af ​​rækkerne kan ændres vilkårligt, fordi nøgleudtrykket ORDER BYikke blev brugt:

person beløb
Ivan 1000
Alexei 2000
Ivan 2000
Sergey 5000
Peter 35.000

Som et resultat vil to rækker med Ivan blive vist, da disse rækker er forskellige i værdierne i kolonnerne. Men på samme tid er der kun én række med Alexey i resultatet, da værdierne i kolonnerne stemmer fuldstændig overens.

Brug af UNION ALL ved valg fra to tabeller

Anvendelse UNION ALLgiver et andet resultat, fordi dubletter ikke er skjult. Udførelse af en anmodning:

( SELECT * FROM sales2005 ) UNION ALL ( SELECT * FROM sales2006 );

vil give følgende resultat, vist uden bestilling på grund af fraværet af udtrykket ORDER BY:

person beløb
Ivan 1000
Ivan 2000
Alexei 2000
Alexei 2000
Sergey 5000
Peter 35.000

Brug af UNION ved valg fra en enkelt tabel

På samme måde er det muligt at forbinde to forskellige forespørgsler fra samme tabel (selvom i stedet, som regel, er de nødvendige parametre kombineret i én forespørgsel ved hjælp af AND- og OR-nøgleordene i WHERE-sætningen):

( VÆLG person , beløb FRA salg2005 HVOR beløb = 1000 ) UNION ( VÆLG person , beløb FRA salg 2005 HVOR person som 'Sergey' );

Resultatet bliver:

person beløb
Ivan 1000
Sergey 5000

Brug af en UNION som en ydre joinforbindelse

Du UNIONkan også oprette fulde ydre sammenføjninger med den (bruges nogle gange, når der ikke er indbygget direkte understøttelse af udvendige sammenføjninger):

( VÆLG * FRA medarbejder LEFT JOIN afdeling medarbejder . AfdelingsID = afdeling . AfdelingsID ) UNION ( VÆLG * FRA medarbejder HØJRE JOIN afdeling medarbejder . AfdelingsID = afdeling . AfdelingsID );

Men samtidig skal man huske, at det stadig ikke er det samme som operatøren JOIN.

Se også

Noter

  1. SQL/89 Database Language Arkiveret 2. december 2018 på Wayback Machine  (russisk)
  2. 1 2 UNION (Transact-SQL) Arkiveret 23. september 2010 på Wayback Machine  (russisk)
  3. 1 2 Brug af UNION-klausulen Arkiveret 9. februar 2010 på Wayback Machine  (russisk)
  4. Forespørgselsoptimering arkiveret 14. april 2009 på Wayback Machine  (russisk)

Punkt 4 - ikke-fungerende link (pr. 11/08/2012)

Links

generel beskrivelse Implementering i MS SQL Server Implementering i MySQL Implementering i PostgreSQL Implementering i Oracle Implementering i Informix