Alakyselyt (SQL Server)

  • 18.02.2018
  • 21 minuuttia aikaa lukea
    • W
    • M
    • T
    • M
    • j
    • +3

Koskee seuraavia: SQL Server (kaikki tuetut versiot) Azure SQL -tietokanta Azure SQL -hallittu ilmentymä Azure Synapse Analytics Rinnakkaistietovarasto

Alakysely on kysely, joka on sisäkkäin SELECT, INSERT, UPDATE tai DELETE -lauseke tai toisen alikyselyn sisällä. Alikyselyä voidaan käyttää missä tahansa lauseke on sallittu. Tässä esimerkissä alikyselyä käytetään sarakelausekkeena nimeltä MaxUnitPrice SELECT-käskyssä.

Alakyselyn perusteet

Alakysely on myös kutsutaan sisemmäksi kyselyksi tai sisemmäksi valinnaksi, kun taas alakyselyä sisältävää lausetta kutsutaan myös ulkoiseksi kyselyksi tai ulommaksi valinnaksi.

Monet alakyselyjä sisältävät Transact-SQL-käskyt voidaan vaihtoehtoisesti muotoilla liitoksiksi. Muita kysymyksiä voidaan esittää vain alakyselyillä. Transact-SQL: ssä ei yleensä ole suorituskykyeroa lauseen, joka sisältää alikyselyn, ja semanttisesti vastaavan version välillä, joka ei sisällä sitä. Joissakin tapauksissa, joissa olemassaolo on tarkistettava, liitos tuottaa paremman suorituskyvyn. Muuten sisäkkäinen kysely on käsiteltävä jokaisen ulomman kyselyn tuloksen kohdalla, jotta varmistetaan kaksoiskappaleiden poisto. Tällaisissa tapauksissa liittymismenetelmä antaisi parempia tuloksia. Seuraava esimerkki näyttää sekä alakyselyn SELECT että liitoksen SELECT, jotka palauttavat saman tulosjoukon:

Ulkoiseen SELECT-käskyyn sisäkkäisellä alikyselyllä on seuraavat komponentit:

  • säännöllinen SELECT kysely mukaan lukien säännölliset Select-luettelokomponentit.
  • Säännöllinen FROM -lauseke, joka sisältää yhden tai useamman taulukon tai näkymän nimen.
  • Valinnainen WHERE -lauseke.
  • Valinnainen GROUP BY -lauseke.
  • Valinnainen HAVING -lauseke.

Alakyselyn SELECT-kysely on aina sulkeissa. Se ei voi sisältää lauseketta COMPUTE tai FOR BROWSE, ja se voi sisältää ORDER BY -lausekkeen vain, kun määritetään myös TOP-lauseke.

Alakysely voidaan sijoittaa ulkoisen WHERE – tai HAVING -lausekkeen sisään. SELECT, INSERT, UPDATE tai DELETE -lauseke tai toisen alikyselyn sisällä. Jopa 32 pesimisen tasoa on mahdollista, vaikka raja vaihtelee käytettävissä olevan muistin ja kyselyn muiden lausekkeiden monimutkaisuuden mukaan. Yksittäiset kyselyt eivät välttämättä tue jopa 32 tason pesimistä. Alakysely voi esiintyä missä tahansa lauseketta voidaan käyttää, jos se palauttaa yhden arvon.

Jos taulukko näkyy vain alakyselyssä eikä ulommassa kyselyssä, kyseisen taulukon sarakkeita ei voida sisällyttää output (valitse ulkoisen kyselyn luettelo).

Alikyselyä sisältävät lauseet käyttävät yleensä yhtä seuraavista muodoista:

  • WHERE lauseke IN (alakysely)
  • WHERE lausekkeen vertailu_operaattori (alakysely)
  • WHERE EXISTS (alikysely)

Joissakin Transact-SQL-lauseissa alikysely voidaan arvioida ikään kuin se olisi itsenäinen kysely. Käsitteellisesti alikyselytulokset korvataan ulommalla kyselyllä (vaikka SQL Server ei välttämättä käsittele Transact-SQL-lauseita alikyselyillä).

Alikyselyillä on kolme perustyyppiä. Ne, jotka:

  • toimivat luetteloilla, jotka on otettu käyttöön IN, tai ne, joita vertailuoperaattori on muokannut ANY tai ALL.
  • Ne otetaan käyttöön muokkaamattomalla vertailuoperaattorilla, ja niiden on palautettava yksi arvo.
  • Ovatko olemassaolotestit otettu käyttöön koodilla EXISTS.

Alakyselysäännöt

Alakyselyyn sovelletaan seuraavia rajoituksia:

  • Vertailuoperaattorilla esitetyn alikyselyn valintaluettelo voi sisältää vain yhden lausekkeen tai sarakkeen nimen (paitsi että EXISTS ja IN toimivat SELECT * tai vastaavasti luettelo).
  • Jos ulkoisen kyselyn WHERE -lauseke sisältää sarakkeen nimen, se on oltava liittymän kanssa yhteensopiva alikyselyn valintaluettelon sarakkeen kanssa.
  • ntext-, teksti- ja kuvatietotyyppejä ei voida käyttää valitun alakyselyjen luettelossa.
  • Koska niiden on palautettava yksi arvo, muokkaamattoman vertailuoperaattorin (yksi jota ei seuraa avainsana KAIKKI tai KAIKKI), ei voi sisältää lausekkeita GROUP BY ja HAVING.
  • DISTINCT avainsanaa ei voi käyttää alikyselyillä, jotka sisältävät GROUP BY.
  • COMPUTE ja INTO -lausekkeita ei voida määrittää.
  • ORDER BY voidaan määrittää vain, kun myös TOP on määritetty.
  • Alikyselyllä luotua näkymää ei voi päivittää.
  • Alakyselyn valintaluettelossa, joka on lisätty EXISTS, sopimuksen mukaan on tähti ( *) yhden sarakkeen nimen sijaan. EXISTS -nimellä käyttöönotetun alakyselyn säännöt ovat samat kuin tavallisessa valintaluettelossa, koska EXISTS -alikysely luo olemassaolon testaa ja palauttaa TOSI tai EPÄTOSI tietojen sijasta.

Hyväksyttävät sarakkeiden nimet alakyselyissä

Seuraavassa esimerkissä BusinessEntityID-sarake -lauseke on implisiittisesti määritelty ulkoisen kyselyn FROM -lausekkeen (Sales.Store) taulukon nimellä. Alakyselyn valintaluettelossa oleva viittaus CustomerID-tunnisteeseen on määritetty alikyselylausekkeella FROM, eli Sales.Customer-taulukossa.

Yleinen sääntö on, että lauseen sarakkeiden nimet on implisiittisesti määritelty taulukossa, johon viitataan FROM -lausekkeessa samalla tasolla. Jos saraketta ei ole taulukossa, johon viitataan alakyselyn FROM -lausekkeessa, se on implisiittisesti määritelty taulukossa, johon viitataan FROM ulkoisen kyselyn lauseke.

Näin kysely näyttää näiltä määritetyiltä implisiittisiltä oletuksilta:

Se ei ole koskaan väärin ilmoittaaksesi taulukon nimen nimenomaisesti, ja on aina mahdollista ohittaa implisiittiset oletukset, jotka koskevat nimenomaisia pätevyyksiä sisältäviä taulukon nimiä.

Tärkeää

Jos sarakkeeseen viitataan alikyselyssä, joka ei ole taulukossa, johon alakysely ”s FROM -lauseke viittaa, mutta se on taulukossa, johon viitataan ulkoisella kyselyllä” s FROM lauseke, kysely suoritetaan virheettömästi. SQL Server kvalifioi implisiittisesti alakyselyn sarakkeen ulkoisen kyselyn taulukon nimellä.

Useita sisäkkäisyystasoja

Alakysely voi itse sisältää yhden tai useamman alikyselyn. Lausekkeeseen voidaan sijoittaa mikä tahansa määrä alakyselyjä.

Seuraava kysely löytää niiden työntekijöiden nimet, jotka ovat myös myyntihenkilöitä.

Tässä on tulosjoukko.

Sisin kysely palauttaa myyntihenkilötunnukset. Seuraavan ylemmän tason kysely arvioidaan näillä myyntihenkilötunnuksilla ja palauttaa työntekijöiden yhteystiedot. Lopuksi ulompi kysely käyttää yhteystunnuksia työntekijöiden nimien löytämiseen.

Voit ilmaista tämän kyselyn myös liitoksena:

Monia kyselyjä voidaan arvioida suorittamalla alakysely kerran ja korvaamalla tuloksena oleva arvo tai arvot ulkoisen kyselyn WHERE -lausekkeeseen. Kyselyissä, jotka sisältävät korreloidun alikyselyn (tunnetaan myös toistuvana alakyselynä), alakysely riippuu arvojensa ulkoisesta kyselystä. Tämä tarkoittaa, että alakysely suoritetaan toistuvasti, kerran jokaiselle riville, jonka ulompi kysely voi valita. Tämä kysely hakee yhden esiintymän jokaisen työntekijän etu- ja sukunimestä, jolle bonus SalesPerson-taulukossa on 5000 ja jolle työntekijän tunnistenumerot vastaavat Employee- ja SalesPerson-taulukoita.

Tässä on tulosjoukko.

Tämän lauseen edellistä alikyselyä ei voida arvioida ulkoisesta kyselystä riippumatta. Se tarvitsee arvoa Employee.BusinessEntityID: lle, mutta tämä arvo muuttuu, kun SQL Server tutkii työntekijän eri rivejä.
Juuri näin kysely arvioidaan: SQL Server harkitsee jokaisen Employee-taulukon rivin sisällyttämistä tuloksiin korvaamalla kunkin rivin arvo sisäiseen kyselyyn. Esimerkiksi, jos SQL Server tutkii ensin rivin Syed Abbas, muuttuja Employee.BusinessEntityID ottaa arvon 285, jonka SQL Server korvaa utes sisäiseen kyselyyn.

Tulos on 0 (Syed Abbas ei saanut bonusta, koska hän on ei myyntihenkilö), joten ulompi kysely arvioi:

Koska tämä on väärä, rivillä Syed Abbas ei sisälly tuloksiin.

Write a Comment

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *