Luku 4

Tulosrivien rajaus

SQL-kysely palauttaa oletuksena kaikki ehtoihin täsmäävät rivit, mutta voimme tarvittaessa pyytää vain osan tulostaulun riveistä. Tämä on hyödyllistä esimerkiksi sovelluksissa, joissa halutaan näyttää yhdellä sivulla vain osa haun tuloksista.

Rajaustavat

Kun lisäämme kyselyn loppuun LIMIT x, kysely antaa vain x ensimmäistä tulosriviä. Esimerkiksi LIMIT 3 tarkoittaa, että kysely antaa kolme ensimmäistä tulosriviä.

Yleisempi muoto on LIMIT x OFFSET y, mikä tarkoittaa, että haluamme x riviä kohdasta y alkaen (0-indeksoituna). Esimerkiksi LIMIT 3 OFFSET 1 tarkoittaa, että kysely antaa toisen, kolmannen ja neljännen tulosrivin.

Esimerkki

Tarkastellaan esimerkkinä kyselyä, joka hakee tuotteita halvimmasta kalleimpaan:

SELECT * FROM Tuotteet ORDER BY hinta;

Kyselyn tuloksena on seuraava tulostaulu:

id          nimi        hinta     
----------  ----------  ----------
3           nauris      2
5           selleri     4         
2           porkkana    5         
1           retiisi     7         
4           lanttu      8         

Saamme haettua kolme halvinta tuotetta seuraavasti:

SELECT * FROM Tuotteet ORDER BY hinta LIMIT 3;

Kyselyn tulos on seuraava:

id          nimi        hinta     
----------  ----------  ----------
3           nauris      2         
5           selleri     4         
2           porkkana    5      

Seuraava kysely puolestaan hakee kolme halvinta tuotetta toiseksi halvimmasta tuotteesta alkaen:

SELECT * FROM Tuotteet ORDER BY hinta LIMIT 3 OFFSET 1;

Tämän kyselyn tulos on seuraava:

id          nimi        hinta     
----------  ----------  ----------
5           selleri     4         
2           porkkana    5         
1           retiisi     7      

Sivutuksen toteutus

Tyypillinen käyttötarkoitus tulosrivien rajaukselle on sivutuksen toteuttaminen nettisivustolla. Tietokannan kyselyt antavat usein paljon rivejä, ja niistä halutaan näyttää käyttäjälle vain osa.

Esimerkiksi voimme haluta toteuttaa keskustelupalstan niin, että joka sivulla on 50 viestiä. Seuraavat kolme kyselyä hakevat ensimmäisen, toisen ja kolmannen sivun viestit:

SELECT * FROM Viestit WHERE ketju_id=123 ORDER BY id LIMIT 50 OFFSET 0;
SELECT * FROM Viestit WHERE ketju_id=123 ORDER BY id LIMIT 50 OFFSET 50;
SELECT * FROM Viestit WHERE ketju_id=123 ORDER BY id LIMIT 50 OFFSET 100;

Yleisemmin kun haluamme sivulle n viestiä, saamme haettua sivun x viestit rajauksella LIMIT n OFFSET n*(x-1).

Jatka tästä seuraavaan osaan: