Koostefunktiot

SQL:stä löytyy seuraavanlaiset koostefunktiot:

AVG keskiarvo

COUNT arvojen lukumäärä

MAX suurin arvo

MIN pienin arvo

SUM summa

Koostefunktioita voidaan käyttää vain joko SELECT-lauseen kenttäluettelossa tai HAVING-lauseessa. WHERE-lauseessa niitä ei voi käyttää. Count(*) laskee kaikkien haun tulosrivien lukumäärän myös sellaisten, jotka ovat NULL. Count(kentännimi) laskee vain niiden rivien lukumäärän, jotka eivät ole NULL. Muut koostefunktiot jättävät NULL-arvot huomioimatta. Jos koostefunktion tuloskentälle ei määritellä mitään nimeä, niin nimen muodostuminen on hyvin ohjelmistokohtaista. Jos samassa haussa on sekä koostefunktioita että tavallisia kenttiä, on lopputulos ryhmiteltävä tavallisten kenttien perusteella. Ryhmittely tapahtuu GROUP BY -määreellä, jossa pitää luetella kaikki tavalliset kentät siinä järjestyksessä, jossa halutaan ryhmittelyn tapahtuvan.

Tulosjoukon käsittely tapahtuu siis seuraavasti:

  1. Rajataan ensin kelpuutettava joukko WHERE-lauseella.
  2. Ryhmitellään (GROUP BY) halutun kentän mukaan.
  3. Rajataan ryhmiteltyä joukkoa HAVING-lauseella käyttäen koostefunktioita.

/* Lasketaan montako riviä on oppilaat taulussa. */

SELECT COUNT(*) AS lukumäärä

FROM Oppilaat

lukumäärä

7

/* Lasketaan montako puhelinnumeroa löytyy oppilaat taulusta. NULLeja ei lasketa. */

SELECT COUNT(puhelin) AS lukumäärä

FROM Oppilaat

lukumäärä

5

/* Kaikkien niiden tenttisuoritusten keskiarvo joiden arvo on yli 2 */

SELECT AVG(arvosana)

FROM tentit

WHERE arvosana > 2

keskiarvo

2,75

SELECT-, WHERE- ja HAVING -lauseissa voidaan suorittaa myös laskutoimituksia yksittäisten kenttien arvoilla (SELECT, WHERE) tai niistä koostetuilla arvoilla (HAVING-lause). NULL-arvoilla laskettaessa myös tulos on NULL. NULL-arvojen ongelmia voidaan kiertää mm. COALESCE-funktiolla, joka ei kuitenkaan toimi Paradoxissa tai Accessissa.

/* Haetaan kaikki puhelinnumerot. Niiden kohdalle, joilla ei ole puhelinnumeroa, kirjoitetaan teksti 'ei numeroa' */

SELECT COALESCE(puhelin, 'ei numeroa') AS puhnro

FROM Oppilaat

puhnro

ei numeroa

03-0000000

014-000000

014-654321

014-601234

014-123456

ei numeroa

/* Haetaan kaikkien tenttisuoritusten keskiarvo ryhmiteltynä sotun mukaan. */

SELECT sotu, AVG(arvosana) AS keskiarvo

FROM tentit

GROUP BY sotu

sotu

keskiarvo

010177-333A

1,35

100135-0000

2,25

111170-7070

1

121273-000X

0

300375-1234

1,5

/* Haetaan kaikkien TIE160-kurssin tenttisuoritusten keskiarvo ryhmiteltynä sotun mukaan. /*

SELECT sotu, AVG(arvosana) AS keskiarvo

FROM tentit

WHERE kurssitunnus = 'TIE160'

GROUP BY sotu

sotu

keskiarvo

010177-333A

1

100135-0000

2,25

/* Haetaan keskiarvo niiden opiskelijoiden TIE160-kurssin tenttisuorituksista, jotka ovat yrittäneet vähintään 2 kertaa. */

SELECT sotu, AVG(arvosana)

FROM tentit

WHERE kurssitunnus = 'TIE160'

GROUP BY sotu

HAVING COUNT(arvosana) >= 2

sotu

keskiarvo

010177-333A

0,916666666666667

/* Haetaan keskiarvo niiden tenttisuorituksista, jotka ovat yrittäneet vähintään 2 kertaa. Haun tulos järjestetään keskiarvon mukaan siten, että suurimman keskiarvon saanut tulee ensimmäiseksi (laskeva järjestys). */

SELECT sotu, AVG(arvosana) as Keskiarvo

FROM tentit

GROUP BY sotu

HAVING COUNT(arvosana) >= 2

ORDER BY Keskiarvo DESC

sotu

Keskiarvo

300375-1234

1,5

010177-333A

1,35

/* Haetaan arvosanojen keskiarvo, paras arvosana sekä keskiarvon ja parhaan arvosanan erotus niiden opiskelijoiden tenttisuorituksista, jotka ovat yrittäneet vähintään 2 kertaa. Haun tulos järjestetään keskiarvon mukaan siten, että suurimman keskiarvon saanut tulee ensimmäiseksi (laskeva järjestys). */

SELECT sotu, MAX(arvosana) as Paras, AVG(arvosana) as Keskiarvo, MAX(arvosana) - AVG(arvosana) as Erotus

FROM tentit

GROUP BY sotu

HAVING COUNT(arvosana) >= 2

ORDER BY Keskiarvo DESC

sotu

Paras

Keskiarvo

Erotus

300375-1234

3

1,5

1,5

010177-333A

3

1,35

1,65