Kuinka rajata kyselyn vaikutusaluetta SQL:n vertailuoperaattoreilla
SQL-lauseiden operaattorit mahdollistavat tietojen vertailun, yhdistämisen ja muokkaamisen osana kyselyä. Ne määrittävät, millä ehdoilla ja logiikalla tietoa käsitellään — tämän takia ne ovat olennainen SQL-kielen toimintaa. Operaattorit jaetaan perinteisesti kuuteen pääryhmään: aritmeettiset, vertailu-, merkki-, loogiset, joukko- ja muut operaattorit.
Vertailuoperaattorit
Vertailuoperaattoreilla vertaillaan lausekkeiden arvoja. Vertailu palauttaa yhden kolmesta loogisesta arvosta: tosi (True), epätosi (False) tai määrittämätön (Null)
Yhtäsuuruuden vertailu SQL-kielessä
SQL-kielessä yhtäsuuruus merkitään =.
Yhtäsuuruus on yleisin WHERE-ehdossa käytetty vertailuoperaattori.
Tällöin sen avulla haetaan tietueet, joiden arvo vastaa täsmälleen annettua arvoa:
SELECT Merkki, Malli, Hinta
FROM Tuotteet
WHERE Hinta = 50000;
Jos kysely löytää useita saman arvon sisältäviä tietueita, palauttaa se kaikki ehdot täyttävät tietueet.
Eräs yleisimmistä SQL-kyselyn suorituskykyä heikentävistä inhimillisistä virheistä on verrata numeerista arvoa tekstiarvoon. Esimerkiksi kaksi alla olevaa kyselyä toimivat eri tavalla:
SELECT Merkki, Malli, Hinta
FROM Tuotteet
WHERE ID = 100;
SELECT Merkki, Malli, Hinta
FROM Tuotteet
WHERE ID = '100';
Vaikka jälkimmäinen kysely voikin palauttaa oikean vastauksen, tietokannan on pakko tehdä automaattinen tyyppimuunnos jokaiselle riville. Tämä estää tietokantaa käyttämästä indeksejä, mikä tekee isossa taulussa kyselystä turhan hitaan. Tämänkaltaiset tilanteet opit tunnistamaan ja ratkaisemaan SQL-kyselyiden tuning ja optimointi -koulutuksessa.
Riippuen tietokannan tai sarakkeen kollaatio-asetuksista, merkkijonoarvojen vertailu saattaa olla joko riippuvainen tai riippumaton kirjainkoosta. Jos ympäristö on case-sensitive, alla oleva kysely ei välttämättä palauta tuloksia:
SELECT Merkki, Malli, Hinta
FROM Tuotteet
WHERE Malli = 'LADA';
Suurempi kuin ja pienempi kuin operaattorit
Vertailuoperaattorit suurempi kuin (>) ja pienempi kuin (<) mahdollistavat suuruus- ja pienuusvertailut.
Näihin voi yhdistää yhtäsuuruuteen, jolloin yhtäsuuruusoperaattori sijoitetaan vertailuoperaattorimerkin oikealle puolelle — eli >= ja <=.
SELECT Merkki, Malli, Hinta
FROM Tuotteet
WHERE Hinta <= 50000;
Numeeristen arvojen lisäksi vertailuoperaattorit toimivat myös merkkijonoilla. Tällöin vertailu perustuu aakkosjärjestykseen ja tietokannan kollaatio-asetuksiin. Tämä voi tuottaa yllätyksiä esimerkiksi sen suhteen, miten isot ja pienet kirjaimet tai erikoismerkit järjestetään. Käsittelemme tietokantojen kollaatio-asetuksia ja niiden vaikutuksia vertailuihin tarkemmin tietokantakohtaisissa koulutuksissamme: Microsoft Access, Microsoft SQL Server ja MySQL.
Seuraavassa esimerkissä palautetaan kaikki Tuotteet , joiden malli on aakkosjärjestyksessä ennen tai sama kuin 'LADA'.
SELECT Merkki, Malli, Hinta
FROM Tuotteet
WHERE Malli <= 'LADA';
Erisuuruus
Joskus halutaan hakea kaikki tietueet, jotka eivät vastaa tiettyä arvoa.
Tätä varten käytetään erisuuruutta ilmaisevaa operaattoria <>.
SELECT Merkki, Malli, Hinta
FROM Tuotteet
WHERE Malli <> 'LADA';
Toinen vaihtoehtoinen ja ei-standardi syntaksi erisuuruden ilmaisemiselle on !=-operaattori.
Tämän käyttöä tulisi kuitenkin välttää.
Erisuuruuden käyttöön liittyy myös yleinen sudenkuoppa.
Jos sarakkeessa on NULL-arvoja, erisuuruusvertailu ei palauta NULL-arvon sisältäviä rivejä.
Puuttuvat arvot saa sisällytettyä tulosjoukkoon lisäämällä ehtoon erillisen IS NULL tarkastuksen.
SELECT Merkki, Malli, Hinta
FROM Tuotteet
WHERE Hinta <> 50000 OR Hinta IS NULL