Useimmissa SQL-kyselyissä tärkein osa kyselyä ovat ehtolausekkeet. Ehtolausekkeet määrittelevät, mitkä rivit valitaan mukaan kyselyyn ja mitkä jätetään pois.

Kysely ilman ehtoja kohdistuu kaikkeen dataan — eli se hakee kaikki rivit.

Ehtojen avulla rajataan ja suodatetaan kyselyn vaikutusaluetta. Tällöin kysely muuttuu muotoon "hae vain ne rivit, joissa seuraavat ehdot toteutuvat".

Jokainen ehto rakentuu lausekkeista, jotka palauttavat arvoja, sekä niitä vertailevista rakenteista, jotka testaavat, täyttääkö kukin tietue annetut kriteerit.

SQL-lausekkeet: miten muodostetaan vertailukelpoisia arvoja

Lauseke on SQL:ssä mikä tahansa ilmaus, joka palauttaa arvon. Itse asiassa lähes kaikki, mitä esimerkiksi SELECT- tai FROM-avainsanan jälkeen kirjoitetaan, on lauseke. Seuraavassa esimerkissä Id, Merkki ja Malli ovat kaikki omia lausekkeitaan:


SELECT Id, Merkki, Malli FROM Autot


Lauseke voi olla yksinkertainen, kuten sarakkeen nimi (Hinta), laskettu arvo kuten (Hinta * 0.9), tai vaikka tekstikenttä.

Yhteistä kaikille on, että lauseke palauttaa arvon, jota voidaan käyttää edelleen – esimerkiksi vertailussa.

SQL WHERE-ehto: miten rajaat kyselyn tuloksia

Ehdot määrittelevät, mitkä tietueet otetaan mukaan kyselyyn — ja mitkä jätetään pois. Ne toimivat suodattimena, joka karsii pois epäolennaisen.

Ehtolauseen perussyntaksi on yksinkertainen, ja sen voi upottaa osaksi SELECT, UPDATE, DELETE-kyselyitä:


SELECT <lauseet> WHERE <Ehto>
UPDATE <lauseet> WHERE <Ehto>
DELETE FROM <lauseet> WHERE <Ehto>


Ehto voi olla lyhyt ja selkeä perusvertailu, rakentua useista loogisista ehdoista, tai käyttää toista tietojoukkoa rajaavana ehtona. WHERE-ehdon tarkoitus on sen tyypistä riippumatta aina sama: rajata kyselyn vaikutusaluetta tietuetasolla.

Väärin kohdennetut WHERE-ehdot kyselyissä ovat yksi yleisimmistä syistä tuotantotietokantojen ongelmiin. Pahimmillaan virheellinen WHERE-ehto voi tarkoittaa joko virheellistä raportointia tai miljoonien rivien muuttamista tai poistamista yhdellä kyselyllä. Näitä riskejä käsittelemme erillisissä UPDATE- ja DELETE-kyselyitä käsittelevissä opasartikkeleissa.

WHERE-ehto ja suorituskyky

WHERE-ehdon kohdistaminen vaikuttaa suoraan siihen, kuinka paljon dataa kysely lukee ja käsittelee - ja missä järjestyksessä.

Mikäli WHERE-ehto perustuu sarakkeeseen, jolle ei ole indeksiä, joutuu tietokanta usein käymään läpi suuren osan taulun riveistä ennen kuin tulosjoukko voidaan muodostaa. Mikäli ehtona oleva kenttä on indeksoitu, tietokanta hyödyntää indeksiä kyselyn tehokkaampaan suorittamiseen.

Alla olevassa kyselysuunnitelmassa (SQL queryplan) sama kysely suoritetaan kahdesti: ensin ilman indeksoitua saraketta ja sen jälkeen indeksoitua saraketta hyödyntäen. Erot kyselyn toimintatavassa ja suoritusstrategiassa ovat selvästi havaittavissa.

WHERE-ehdon vaikutus kyselyn suorituskykyyn. Kuvassa saman kyselyn kyselysuunnitelma kun a)WHERE-ehtona oleva kenttä ei ole indeksoitu  b)WHERE-ehtona oleva kenttä on indeksoitu
Kuva: WHERE-ehdon vaikutus kyselyn suorituskykyyn. Kuvassa saman kyselyn kyselysuunnitelma kun a)WHERE-ehtona oleva kenttä ei ole indeksoitu b)WHERE-ehtona oleva kenttä on indeksoitu.

Tuotantoympäristöissä tämänkaltaiset erot korostuvat erityisesti suurissa tauluissa ja kuormitetuissa järjestelmissä.

SQL:n HAVING-lause: ehtoja ryhmitellyille arvoille

Siinä missä WHERE suodattaa rivejä ennen ryhmittelyä, HAVING-ehto suodattaa ryhmiteltyjä tuloksia eli GROUP BY -lauseen jälkeen muodostettuja ryhmiä. Ilman GROUP BY -lauseketta HAVING-ehto ei yleensä tuota toivottua lopputulosta.

HAVING-ehdon perussyntaksi on:


SELECT <lauseet> WHERE <Ehto> GROUP BY <ryhmittely> HAVING <ehto>

HAVING-ehdon virheellinen käyttö voi johtaa tilanteisiin, joissa raportointi näyttää oikealta mutta perustuu väärin rajattuun dataan.

Ehdot vaikuttavat suorituskykyyn

Tuotantoympäristöissä WHERE- ja HAVING-ehtojen valinnalla on merkittävä vaikutus suorituskykyyn ja kyselysuunnitelmiin. Näitä eroja ja optimoituja kyselysuunnitelmia käsitellään SQL-koulutuksissamme.

Artikkelin seuraavissa osissa tutustumme tarkemmin eri operaattoreihin, joita voidaan käyttää SQL:n ehtolausekkeissa.