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:
/* 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 |