Alikysely on SELECT-lauseke, joka sijaitsee SELECT-, SELECT... INTO, INSERT... INTO-, DELETE- tai UPDATE-lauseke tai jonkin muun alikyselyn sisällä.
Syntaksi
Voit luoda alikyselyn käyttämällä kolmea syntaksimuotoa:
vertailu [ANY | KAIKKI | SOME] (sqlstatement)
lauseke [NOT] IN (sqlstatement)
[EI] EXISTS (sqlstatement)
Alikyselyssä on seuraavat osat:
Osa |
Kuvaus |
Vertailu |
lauseke ja vertailuoperaattori, joka vertaa lauseketta alikyselyn tuloksiin. |
lauseke |
Lauseke, jonka alikyselyn tulosjoukkoa etsitään. |
sql-lauseke |
SELECT-lauseke, joka seuraa samaa muotoa ja sääntöjä kuin mikä tahansa muu SELECT-lauseke. Sen on oltava sulkeissa. |
Huomautuksia
Voit käyttää alikyselyä lausekkeen sijaan SELECT-lausekkeen kenttäluettelossa tai WHERE- tai HAVING-lauseessa. Alikyselyssä käytetään SELECT-lauseketta yhden tai useamman tietyn arvon määrittämiseen WHERE- tai HAVING-lauselausekkeessa.
Käytä SYNonyymiä ANY- tai SOME-predikaattia pääkyselyn tietueiden noutamiseen, jotka vastaavat vertailua alikyselyssä noudettuihin tietueisiin. Seuraavassa esimerkissä palautetaan kaikki tuotteet, joiden yksikköhinta on suurempi kuin minkä tahansa myydyn tuotteen hinta vähintään 25 prosentin alennuksella:
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
Käytä ALL-predikaattia noutaaksesi vain pääkyselyn tietueet, jotka täyttävät vertailun kaikkiin alikyselyssä noudettuihin tietueisiin. Jos muutit edellisessä esimerkissä ANY-arvoksi KAIKKI, kysely palauttaisi vain ne tuotteet, joiden yksikköhinta on suurempi kuin kaikkien myytyjen tuotteiden yksikköhinta vähintään 25 prosentin alennuksella. Tämä on paljon rajoittavampaa.
IN-predikaatin avulla voit noutaa vain ne pääkyselyn tietueet, joiden alikyselyn jotkin tietueet sisältävät yhtäläisyysarvon. Seuraavassa esimerkissä palautetaan kaikki tuotteet, joiden alennus on vähintään 25 prosenttia:
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
Vastaavasti VOIT NOUTAA NOT IN -toiminnolla vain ne pääkyselyn tietueet, joiden alikyselyn yksikään tietue ei sisällä yhtä suuriarvoista arvoa.
Käytä EXISTS-predikaattia (valinnaisella EI varatulla sanalla) tosi- ja epätosivertailuissa sen määrittämiseksi, palauttaako alikysely tietueita.
Voit myös käyttää alikyselyssä taulukon nimitunnuksia viittaamaan alikyselyn ulkopuolisessa FROM-lauseessa lueteltuihin taulukoihin. Seuraavassa esimerkissä palautetaan niiden työntekijöiden nimet, joiden palkat ovat yhtä suuria tai suurempia kuin niiden työntekijöiden keskipalkka, joilla on sama tehtävänimike. Työntekijät-taulukolle annetaan tunnus "T1":
SELECT LastName, FirstName, Title, Salary FROM Employees AS T1 WHERE Salary >= (SELECT Avg(Salary) FROM Employees WHERE T1.Title = Employees.Title) Order by Title;
Edellisessä esimerkissä AS- varattu sana on valinnainen.
Jotkin alikyselyt ovat sallittuja ristiintaulukointikyselyissä – erityisesti predikaattina (WHERE-lauseessa). Alikyselyt tulosteina (SELECT-luettelossa olevat) eivät ole sallittuja ristiintaulukointikyselyissä.