Unioni (SQL)

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 16. maaliskuuta 2022 tarkistetusta versiosta . tarkastukset vaativat 2 muokkausta .

SQL : ssä UNION- operaattoria käytetään yhdistämään kaksi riviä, jotka SQL-kyselyt palauttavat. Molempien kyselyiden on palautettava sama määrä sarakkeita, ja sarakkeilla, joilla on sama järjestysluku, on oltava yhteensopivia tietotyyppejä . Tulos saa ensimmäisen (vasemman) kyselyn rakenteen (sarakkeiden nimet ja tyypit), eli toiminto ei ole symmetrinen.

Kun useita kyselyitä yhdistetään peräkkäin, tulos lasketaan peräkkäin vasemmalta oikealle.

Tämä operaattori on kuvattu ensimmäisessä SQL-standardissa - SQL/89 [1] .

Syntaksi

Operaattori määritellään pyyntöjen välillä. Yksinkertaistetussa muodossa se näyttää tältä:

< kysely 1 > UNIONI [ KAIKKI ] < kysely 2 > YHDISTYNYT [ KAIKKI ] < kysely 3 > .....;

Oletusarvoisesti kaikki päällekkäiset merkinnät piilotetaan automaattisesti, ellei lauseketta käytetä UNION ALL.

On huomattava, että UNIONse ei itsessään takaa rivien järjestystä. Toisen kyselyn rivit voivat näkyä alussa, lopussa tai jopa sekoittua ensimmäisen kyselyn rivien kanssa. Tapauksissa, joissa vaaditaan tietty järjestys, on käytettävä lauseketta ORDER BY.

Käyttöehdot

Operaattorin käyttöä säätelee kaksi pääsääntöä UNION:

  • poimittavien sarakkeiden lukumäärän ja järjestyksen on vastattava kaikissa yhdistetyissä kyselyissä;
  • vastaavien sarakkeiden tietotyyppien on oltava yhteensopivia.

Niiden sarakkeiden tietotyyppien, joista tiedot haetaan yhdistetyissä kyselyissä, ei tarvitse olla täsmälleen samat, vaan niiden on oltava yhteensopivia implisiittisen muunnoksen avulla. Jos tietotyypit eroavat toisistaan, tuloksena oleva tietotyyppi määritetään tietotyypin ensisijaisuussääntöjen perusteella (tietylle DBMS:lle). Jos tyypit täsmäävät, mutta eroavat tarkkuuden, mittakaavan tai pituuden suhteen, tulos määritetään lausekkeiden yhdistämiseen käytettyjen sääntöjen perusteella (tietylle DBMS:lle) [2] . Ei-ANSI-tyyppien, kuten DATA ja BINARY, tulisi normaalisti vastata muita saman ei-standardityypin sarakkeita [3] .

Microsoft SQL Serverissä XML - tietotyyppisarakkeiden on oltava vastaavia. Kaikilla sarakkeilla on oltava joko XML-skeemassa määritetty tyyppi tai niiden on oltava kirjoittamattomia. Kirjoitettujen sarakkeiden on viitattava samaan XML-skeemojen kokoelmaan [2] .

Toinen yhteensopivuusrajoitus on kieltää nolla-arvot (NULL) missä tahansa liitossarakkeessa, ja nämä arvot on myös estettävä kaikissa vastaavissa sarakkeissa muissa liitoskyselyissä, koska nolla-arvot (NULL) ovat kiellettyjä NOT NULL:n kanssa. rajoite. Et myöskään voi käyttää UNION-toimintoa alikyselyissä, etkä voi käyttää yhdistelmäfunktioita kyselyn SELECT-lauseessa liitossa (useimmat tietokantajärjestelmät eivät kuitenkaan huomioi näitä rajoituksia) [3] .

Sovellus

UNIONvoi olla erittäin hyödyllinen tietovarastointisovelluksissa, joissa taulukot ovat harvoin täysin normalisoituja . Yksinkertainen esimerkki: tietokannassa on taulukoita sales2005ja sales2006, joilla on identtinen rakenne, mutta jotka on erotettu toisistaan ​​suorituskyvyn vuoksi. Sanakyselyn UNIONavulla voit yhdistää tuloksia molemmista taulukoista.

On myös syytä huomata, että se UNION ALLtoimii nopeammin kuin pelkkä UNION, koska oletusarvoisesti operaattoria käytettäessä UNIONsuoritetaan ylimääräinen kaksoiskappaleiden eliminointi, mutta sitä käytettäessä se UNION ALLei [4] .

Esimerkkejä

UNIONin käyttäminen valittaessa kahdesta taulukosta

Tarjolla on kaksi taulukkoa:

myynti 2005
henkilö määrä
Ivan 1000
Aleksei 2000
Sergei 5000
myynti 2006
henkilö määrä
Ivan 2000
Aleksei 2000
Peter 35 000

Kun suoritat seuraavan kyselyn:

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

tulosjoukko saadaan, mutta rivien järjestys voi muuttua mielivaltaisesti, koska avainlauseketta ORDER BYei käytetty:

henkilö määrä
Ivan 1000
Aleksei 2000
Ivan 2000
Sergei 5000
Peter 35 000

Tämän seurauksena näytetään kaksi riviä Ivanilla, koska nämä rivit eroavat sarakkeiden arvoista. Mutta samaan aikaan tuloksessa on vain yksi rivi Aleksein kanssa, koska sarakkeiden arvot vastaavat täysin.

UNION ALL käyttäminen valittaessa kahdesta taulukosta

Käyttöönotto UNION ALLantaa erilaisen tuloksen, koska kaksoiskappaleita ei piiloteta. Pyynnön suorittaminen:

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

antaa seuraavan tuloksen, joka näytetään ilman järjestystä lausekkeen puuttumisen vuoksi ORDER BY:

henkilö määrä
Ivan 1000
Ivan 2000
Aleksei 2000
Aleksei 2000
Sergei 5000
Peter 35 000

UNIONin käyttäminen valittaessa yhdestä taulukosta

Vastaavasti on mahdollista yhdistää kaksi eri kyselyä samasta taulukosta (vaikka sen sijaan yleensä tarvittavat parametrit yhdistetään yhteen kyselyyn käyttämällä WHERE-lauseen avainsanoja AND ja OR):

( SELECT henkilö , määrä myynnistä2005 WHERE määrä = 1000 ) UNIONI ( SELECT henkilö , määrä myynnistä2005 WHERE henkilö kuten ' Sergey ' );

Tuloksena tulee olemaan:

henkilö määrä
Ivan 1000
Sergei 5000

UNIONin käyttäminen ulkoliitoksena

Voit UNIONmyös luoda sen avulla täydellisiä ulkoliitoksia (joskus käytetään, kun ulkoliitoksille ei ole sisäänrakennettua suoraa tukea):

( SELECT * FROM työntekijästä LEFT JOIN osasto työntekijä . OsastoID = osasto . Osaston ID ) UNIONIN ( SELECT * FROM työntekijästä OIKEA LIITTY osasto työntekijälle . Osaston ID = osasto . Osaston ID )

Mutta samalla on muistettava, että tämä ei silti ole sama asia kuin operaattori JOIN.

Katso myös

Muistiinpanot

  1. SQL/89-tietokantakieli arkistoitu 2. joulukuuta 2018 Wayback Machinessa  (venäjä)
  2. 1 2 UNION (Transact-SQL) Arkistoitu 23. syyskuuta 2010 Wayback Machinessa  (venäjäksi)
  3. 1 2 UNION-lausekkeen käyttö Arkistoitu 9. helmikuuta 2010 Wayback Machinessa  (venäjäksi)
  4. Kyselyn optimointi arkistoitu 14. huhtikuuta 2009 Wayback Machinessa  (venäjäksi)

Kohde 4 - linkki ei toimi (11.8.2012)

Linkit

yleinen kuvaus Toteutus MS SQL Serverissä Toteutus MySQL:ssä Toteutus PostgreSQL:ssä Toteutus Oraclessa Toteutus Informixissa