SQLShack

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

FROM SampleFruits
ORDER BY Price
OFFSET 3 ROWS

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

FROM SampleFruits
ORDER BY Price
OFFSET 5 ROWS FETCH NEXT 6 ROWS ONLY

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:

DECLARE @PageNumber AS INT
DECLARE @RowsOfPage AS INT
SET @PageNumber=2
SET @RowsOfPage=4
SELECT FruitName,Price FROM SampleFruits
ORDER BY Price
OFFSET (@PageNumber-1)*@RowsOfPage ROWS
FETCH NEXT @RowsOfPage ROWS ONLY

Kuten näemme, olemme ilmoittaneet kaksi muuttujaa yllä olevassa kyselyssä, ja nämä muuttujat ovat:

  1. @PageNumber – Se määrittää näytettävän sivun numeron
  2. @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ös

Tä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.

  • Author
  • Recent Posts
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)
  • Query Optimization Myths – March 23, 2021
  • Parametrien haistelun oireet SQL Serverissä – 17. maaliskuuta 2021
  • Automaattisen suunnitelman korjauksen käyttäminen kyselyjen virittämiseen – 4. maaliskuuta 2021

Vastaa

Sähköpostiosoitettasi ei julkaista.