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.

Loogiset operaattorit

Loogiset operaattorit yhdistävät useita ehtoja SQL-kyselyissä. Ne mahdollistavat monipuolisempien hakulauseiden muodostamisen, kun halutaan huomioida useampia kriteerejä.

Molempien ehtojen on toteuduttava: AND-operaattori

AND-operaattori vaatii, että kaikki liittyvät ehtolausekkeet ovat tosia, jotta koko ehtolauseke olisi tosi. Seuraavassa esimerkissä kysellään tuotteita, joiden malli sisältää merkkijonon "AD" ja hinta ylittää 10 000 euroa.


SELECT Merkki, Malli, Hinta 
FROM Tuotteet
WHERE Malli LIKE '%AD%'
AND
Hinta > 10000;


Riittää että yksi ehto toteutuu: OR-operaattori

Or-operaattorilla riittää, että yksi liitetyistä ehdoista on tosi, jotta koko ehtolausekkeestä tulee tosi. Seuraavassa esimerkissä palautetaan listaus tuotteista, joiden mallin nimessä esiintyy "AD" tai hinta ylittää 10 000 euroa. Siispä:


SELECT Merkki, Malli, Hinta 
FROM Tuotteet
WHERE Malli LIKE '%AD%'
OR
Hinta > 10000;


Vertailuehdon negaatio: NOT-operaattori

NOT-operaattori kääntää vertailuehdon totuusarvon. Seuraava esimerkkikysely palauttaa kaikki Tuotteet, joiden mallinimessä ei esiinny merkkijonoa "AD".


SELECT Merkki, Malli, Hinta
FROM Tuotteet
WHERE Malli NOT LIKE '%AD%'  ;


Ehtojen ryhmittely sulkeilla - ja miksi sulkeiden käyttö auttaa ehkäisemään salakavalat logiikkavirheet

Kun kysely sisältää useita loogisia operaattoreita, niiden suoritusjärjestystä ohjataan sulkeiden käytöllä. Käytä sulkeita varmistaaksesi, että ehtosi evaluoidaan halutussa järjestyksessä. Ilman sulkeita SQL tulkitsee ehdot oletusjärjestyksessä (NOT → AND → OR), mikä voi johtaa vääriin ja yllättäviin tuloksiin.


SELECT Merkki, Malli, Hinta 
FROM Tuotteet
WHERE (Malli LIKE '%AD%' OR Malli LIKE '%FO%')
AND Hinta < 20000;


Yllä oleva esimerkkikysely tekee listauksen tuotteista, joiden mallinimessä on "AD" tai "FO" ja hinta on alle 20 000 euroa. Jos sulkeet unohdettaisiin, tietokanta suorittaisi AND-ehdon ensin. Tällöin hinta-raja koskisikin vain jälkimmäistä FO-ehtoa - ja tulosjoukko olisi täysin virheellinen.

Voit harjoitella SQL:n loogisten operaattoreiden käyttöä turvallisesti SQL-koulutuksissamme.

Miksi OR-operaattori voi hidastaa tietokantakyselyä – ja miten korjata tilanne

Loogisten operaattoreiden yhdistelmä voi vaikuttaa merkittävästi kyselyn suorituskykyyn. Esimerkiksi OR-operaattorit suurilla tauluilla voivat estää indeksien hyödyntämisen, mikä johtaa koko taulun skannaukseen. Seuraava esimerkki havainnollistaa tilannetta:


-- Hidas kysely suurilla tauluilla
SELECT AsiakasID, Nimi, Kaupunki
FROM Asiakkaat
WHERE Kaupunki = 'Helsinki'
   OR Kaupunki = 'Espoo';

Jos Kaupunki-sarakkeessa ei ole indeksiä, tietokanta joutuu lukemaan taulun jokaisen rivin. Parempi vaihtoehto on käyttää IN-operaattoria tai varmistaa, että ehtona oleva sarake on indeksoitu:


-- Tehokkaampi versio samasta kyselystä
SELECT AsiakasID, Nimi, Kaupunki
FROM Asiakkaat
WHERE Kaupunki IN ('Helsinki', 'Espoo');

Suositeltuja käytännön ratkaisuja ovat:

Näitä ja useita muita optimointiratkaisuja voit opiskella tarjoamassamme SQL-kyselyjen optimointi ja tuning -koulutuksessa. Eli

Miksi NULL-arvot sotkevat loogiset ehdot ja aiheuttavat yllätyksiä?

Vaikka totuusarvot ovat aina kaksiarvoisia (tosi tai epätosi), SQL-kyselyissä on monen muun ohjelmointikielen tavoin mukana kolmas, tuntematon (ei määritelty) tila, jonka aiheuttaa NULL. Tämä aiheuttaa helposti merkittäviä ongelmia loogisia operaattoreita käyttävien kyselyiden kanssa.

Jos tietokantarakenne sallii NULL-arvot jollekin kentälle, on lähes jokaiseen kyseistä dataa koskevaan SQL-kyselyyn liitettävä IS NULL tai IS NOT NULL -käsittelijä loogisen operaattorin avulla. Esimerkiksi alla oleva kysely palauttaa kaikki tuotteet joissa hinta on alle 20 000 yksikköä tai hintaa ei ole määritelty.


SELECT * FROM Tuotteet 
WHERE Hinta < 20000 OR Hinta IS NULL;

Jos käytät NOT IN -rakennetta alikyselyn kanssa, ja alikyselyn tulosjoukosta löytyy yksikin NULL-arvo, koko pääkyselysi lakkaa toimimasta ja palauttaa täysin tyhjän tulosjoukon. Esimerkiksi jos haluat listata asiakkaat, joilla ei ole yhtään tilausta: alikysely hakee tilausten AsiakasID:t, mutta taulussa sattuu olemaan joku rivi, jonka AsiakasID palauttaa NULL-arvon.


SELECT Nimi 
FROM Asiakkaat 
WHERE AsiakasID NOT IN (SELECT AsiakasID FROM Tilaukset);

Tässä tilanteessa ratkaisu on käyttää NOT EXISTS -rakennetta:


SELECT Nimi 
FROM Asiakkaat a
WHERE NOT EXISTS (
    SELECT 1 FROM Tilaukset t WHERE t.AsiakasID = a.AsiakasID
);

Nämä kaksi ilmiötä todistavat sen, miksi NULL-arvojen käsittely yhdistettynä loogisiin operaattoreihin on oma taiteenlajinsa SQL-kyselyissä. Käsittelemme aihetta syvällisemmin lukuisissa SQL- ja tietokantakoulutuksissamme.