Sivuttaminen on prosessi, jota käytetään suurten tietojen jakamiseen pienemmiksi erillisiksi sivuiksi, ja tämä prosessi tunnetaan myös nimellä sivutus. Paginointia käytetään yleisesti web-sovelluksissa ja se on nähtävissä Googlessa. Kun haemme jotain Googlessa, se näyttää tulokset erillisellä sivulla; tämä on paginoinnin pääidea.
Nyt käsittelemme artikkelin seuraavissa osissa sitä, miten paginointi toteutetaan SQL Serverissä.
Esimerkkidatan valmistelu
Ennen kuin ryhdymme käsittelemään paginointia yksityiskohtaisesti, luomme esimerkkitaulukon ja täytämme sen synteettisillä tiedoilla. Seuraavassa kyselyssä luomme SampleFruits-taulun, johon tallennetaan hedelmien nimet ja myyntihinnat. Artikkelin seuraavassa osassa käytämme tätä taulukkoa.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
CREATE TABLE SampleFruits (
Id INT PRIMARY KEY IDENTITY(1,1) ,
FruitName VARCHAR(50) ,
Price INT
)
GO
INSERT INTO SampleFruits VALUES(’Apple’,20)
INSERT INTO SampleFruits VALUES(’Apricot’,12)
INSERT INTO SampleFruits VALUES(’Banana’,8)
INSERT INTO SampleFruits VALUES(’Cherry’,11)
INSERT INTO SampleFruits VALUES(’Strawberry’,26)
INSERT INTO SampleFruits VALUES(’Lemon’,4)
INSERT INTO SampleFruits VALUES(’Kiwi’,14)
INSERT INTO SampleFruits VALUES(’Coconut’,34)
INSERT INTO SampleFruits VALUES(’Orange’,24)
INSERT INTO SampleFruits VALUES(’Raspberry’,13)
INSERT INTO SampleFruits VALUES(’Mango’,9)
INSERT INTO SampleFruits VALUES(’Mandariini’,19)
INSERT INTO SampleFruits VALUES(’Ananas’,22)
GO
SELECT * FROM SampleFruits
|
Mitä on paginointi SQL Serverissä?
SQL Serverin kannalta paginoinnin tavoitteena on, että tulosjoukko jaetaan erillisiin sivuihin kyselyn avulla. Kun OFFSET- ja FETCH-argumentteja käytetään SELECT-lauseen ORDER BY -lausekkeen kanssa, kyseessä on SQL Serverin sivutusratkaisu.
OFFSET-argumentilla määritetään, kuinka monta riviä kyselyn tulosjoukosta ohitetaan. Seuraavassa esimerkissä kysely ohittaa SampleFruits-taulukon 3 ensimmäistä riviä ja palauttaa sitten kaikki loput rivit. Price
Kun asetamme OFFSET-arvoksi 0:n, tulosjoukosta ei ohiteta yhtään riviä. Seuraava kysely voi olla esimerkki tästä käyttötavasta:
1
2
3
|
SELECT FruitName,Price FROM SampleFruits
ORDER BY Price
OFFSET 0 ROWS
|
Toisaalta jos asetamme OFFSET-arvoksi suuremman kuin tulosjoukon rivien kokonaislukumäärä, tuloksessa ei näytetä yhtään riviä. Kun tarkastelemme seuraavaa kyselyä, SampleFruits-taulukon rivien kokonaismäärä on 13, ja asetamme OFFSET-arvoksi 20, joten kysely ei näytä yhtään tulosta.
1
2
3
|
SELECT FruitName,Price FROM SampleFruits
ORDER BY Price
OFFSET 20 ROWS
|
FETCH-argumentti määrittää, kuinka monta riviä tuloksessa näytetään, ja FETCH-argumenttia on käytettävä OFFSET-argumentin kanssa. Seuraavassa esimerkissä ohitamme 5 ensimmäistä riviä ja rajoitamme tulossarjan 6 riviin esimerkkitaulukkomme osalta. Price
Tip: TOP CLAUSE rajoittaa SELECT-lauseen palauttamien rivien määrää. Kun käytämme TOP-lauseketta ilman ORDER BY:tä, voidaan palauttaa mielivaltaisia tuloksia. Kun tarkastelemme seuraavaa esimerkkiä, se palauttaa 3 satunnaista riviä jokaisella kyselyn suorituksella.
1
2
|
SELECT TOP 7 FruitName, Price
FROM SampleFruits
|
Kuten opimme, OFFSET-FETCH-argumentti edellyttää SELECT-lauseessa ORDER BY -lauseketta. Jos haluamme toteuttaa määrittelemättömän järjestyksen, joka muistuttaa aiempaa TOP-lausekkeen käyttöä OFFSET-FETCH-argumenttien kanssa, voimme käyttää kyselyä, joka näyttää seuraavalta:
1
2
3
|
SELECT FruitName ,Price FROM SampleFruits
ORDER BY (SELECT NULL)
OFFSET 0 ROWS FETCH NEXT 7 ROWS ONLY
OFFSET 0 ROWS FETCH NEXT 7 ROWS ONLY
|
Paginointikysely SQL Serverissä
Sen jälkeen, kun olet selvittänyt vastauksen kysymykseen ”Mikä on paginointi”?” -kysymykseen, opettelemme, miten voimme kirjoittaa paginointikyselyn SQL Serverissä. Aluksi suoritamme seuraavan kyselyn ja puutumme kyselyyn:
Kuten näemme, olemme ilmoittaneet kaksi muuttujaa yllä olevassa kyselyssä, ja nämä muuttujat ovat:
- @PageNumber – Se määrittää näytettävän sivun numeron
- @RowsOfPage – Se määrittää, kuinka monta riviä sivulla näytetään. Tuloksena SELECT-lause näyttää toisen sivun, joka sisältää 4 riviä
Dynaaminen lajittelu paginoinnin avulla
Sovellukset saattavat joutua lajittelemaan tietoja eri sarakkeiden mukaan joko nousevassa tai laskevassa järjestyksessä paginoinnin ohella. Tällaisen vaatimuksen voittamiseksi voimme käyttää ORDER BY -lauseketta CASE-ehtojen kanssa, jolloin saamme kyselyn, joka voidaan lajitella muuttujien mukaan. Seuraava kysely voi olla esimerkki tästä käyttötavasta:
1
2
3
4
5
6
7
DECLARE @PageNumber AS INT DECLARE @RowsOfPage AS INT
DECLARE @SortingCol AS VARCHAR(100) =’FruitName’
DECLARE @SortType AS VARCHAR(100) = ’DESC’
SET @PageNumber=1
SET @RowsOfPage=4
SELECT FruitName,Price FROM SampleFruits
ORDER BY
CASE WHEN @SortingCol = ’Price’ AND @SortType =’ASC’ THEN Price END ,
CASE WHEN @SortingCol = ’Price’ AND @SortType =’DESC’ THEN Price END DESC,
CASE WHEN @SortingCol = ’FruitName’ AND @SortType =’ASC’ THEN FruitName END ,
CASE WHEN @SortingCol = ’FruitName’ AND @SortType =’DESC’ THEN FruitName END DESC
OFFSET (@PageNumber-1)*@RowsOfPage ROWS
FETCH NEXT @RowsOfPage ROWS ONLY
|
Myös, voimme muuttaa lajittelusaraketta ja lajittelusuuntaa edellä olevan kyselyn muuttujien avulla.
Paginointi silmukassa
Tässä esimerkissä opettelemme kyselytekniikan, joka palauttaa kaikki erillisen sivun tulokset yhdellä kyselyllä.
1
2
3
4
5
6
7
8
9
AS INT DECLARE @MaxTablePage AS FLOAT
SET @PageNumber=1
SET @RowsOfPage=4
SELECT @MaxTablePage = COUNT(*) FROM SampleFruits
SET @MaxTablePage = CEILING(@MaxTablePage/@RowsOfPage)
WHILE @MaxTablePage >= @PageNumber
BEGIN
SELECT FruitName,Price FROM SampleFruits
ORDER BY Price
OFFSET (@PageNumber- loimme melko yksinkertaisen kaavan. Määritimme ensin SampleFruit-taulukon rivien kokonaismäärän @MaxTablePage-muuttujaan ja jaoimme sen sitten sillä, kuinka monta riviä näytetään yhdellä sivulla. Laskimme siis näytettävien sivujen määrän. Laskettu arvo voi kuitenkin olla desimaaliluku, ja sitä varten käytimme CEILING-funktiota pyöristämään sen pienimpään kokonaislukuun, joka on suurempi kuin laskettu luku. Toisena vaiheena toteutimme WHILE-LOOPin ja iteroimme @PageNumber-muuttujaa, kunnes numeron viimeinen sivu on saavutettu.
JohtopäätösTässä artikkelissa yritimme selvittää vastauksen kysymykseen ”Mikä on Pagination?” erityisesti SQL Serverin osalta. OFFSET-FETCH-argumentit auttavat toteuttamaan, kuinka monta riviä haluamme ohittaa ja kuinka monta riviä haluamme näyttää tulosjoukossa, kun käytämme niitä ORDER BY -lausekkeen kanssa SELECT-lauseissa. Ja lopuksi opimme, miten voimme toteuttaa SQL Serverissä sivuttamisen näillä argumenteilla.
Esat Erkec on SQL Server -ammattilainen, joka aloitti uransa kahdeksan vuotta sitten ohjelmistokehittäjänä. Hän on SQL Server Microsoft Certified Solutions Expert.
Pääosa hänen urastaan on keskittynyt SQL Server -tietokantojen hallintaan ja kehittämiseen. Hänen nykyiset kiinnostuksen kohteensa ovat tietokantojen hallinta ja Business Intelligence. Löydät hänet LinkedInistä. Katso kaikki käyttäjän Esat Erkec viestit Viimeisimmät viestit: Esat Erkec (katso kaikki)
|