MySQL LIMIT & OFFSET med eksempler
โก Smart oppsummering
Ocuco MySQL Nรธkkelordet LIMIT begrenser hvor mange rader en spรธrring returnerer, og OFFSET-verdien bestemmer hvilken rad resultatet starter fra. Sammen holder de resultatsettene smรฅ, sรธrger for at sider lastes inn raskt og driver paginering post-for-post.

Hva er LIMIT-nรธkkelordet i MySQL?
Ocuco BEGRENSE Nรธkkelordet begrenser antall rader som returneres i et spรธrreresultat. Det kan brukes med SELECT-, UPDATE- og DELETE-setningene, slik at det begrenser antall rader en spรธrring leser, samt antall rader en skriving pรฅvirker.
Syntaksen for LIMIT-nรธkkelordet er som fรธlger.
SELECT {fieldname(s) | *} FROM tableName(s) [WHERE condition] LIMIT N;
HER
- "VELG {feltnavn(e) | *} FRA tabellnavn(e)" er den SELECT-setning som inneholder feltene vi รธnsker รฅ returnere i sรธket vรฅrt.
- ยซ[WHERE-tilstand]ยป er valgfritt, men nรฅr det oppgis, spesifiserer det et filter pรฅ resultatsettet. HVOR klausul brukes fรธr LIMIT, sรฅ filtrering skjer fรธrst og grensen brukes pรฅ det som overlever.
- ยซGRENSE Nยป er nรธkkelordet, og N er et hvilket som helst tall som starter fra 0. Hvis du setter 0 som grense, returneres ingen poster i det hele tatt. Hvis du setter et tall som 5, returneres fem poster. Hvis tabellen inneholder fรฆrre poster enn N, returneres alle, og det oppstรฅr ingen feil.
Syntaksen er kort, men grunnen til at den eksisterer er verdt รฅ nevne fรธr eksemplene.
Hvorfor bรธr vi bruke LIMIT-nรธkkelordet?
Anta at vi er utvikledeping applikasjonen som kjรธrer oppรฅ myflixdb. Systemdesignerne har bedt oss om รฅ begrense antall poster som vises pรฅ en side til 20 poster for รฅ motvirke treg lastetid. Hvordan implementerer vi et system som oppfyller et slikt krav?
Nรธkkelordet LIMIT hรฅndterer akkurat denne situasjonen. I stedet for รฅ hente hver medlemsrad inn i applikasjonen og forkaste de fleste av dem, returnerer spรธrringen 20 poster per side, og databasen gjรธr jobben. Tre fordeler fรธlger av det.
- Raskere respons: mindre data leses fra disken og mindre data krysser nettverket.
- Lavere minnebruk: Applikasjonen inneholder รฉn side med rader, ikke hele tabellen.
- Safer skriver: en GRENSE pรฅ en OPPDATERING eller en SLETT Utsagnet setter en grense for hvor mange rader en feil kan berรธre.
MySQL LIMIT-spรธrreeksempler
Eksemplene nedenfor kjรธrer mot medlemstabellen i myflixdb-databasen. Det fรธrste returnerer to rader og ingenting mer.
SELECT * FROM members LIMIT 2;
| medlemsnummer | fulle_ navn | kjรธnn | fรธdselsdato | registreringsdato | fysisk_ adresse | postadresse | kontaktnummer | emalje | kredittkortnummer |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Hunn | 21-07-1980 | NULL | First Street tomt nr. 4 | Privat bag | 0759 253 542 | janetjones@yagoo.cm | NULL |
| 2 | Janet Smith Jones | Hunn | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
Som resultatet ovenfor viser, har bare to medlemmer blitt returnert.
Hente en liste med ti (10) medlemmer fra databasen
Anta at vi รธnsker en liste over de fรธrste 10 registrerte medlemmene fra Myflix-databasen. Skriptet nedenfor ber om dem.
SELECT * FROM members LIMIT 10;
ร kjรธre skriptet gir resultatet som vises nedenfor.
| medlemsnummer | fulle_ navn | kjรธnn | fรธdselsdato | registreringsdato | fysisk_ adresse | postadresse | kontaktnummer | emalje | kredittkortnummer |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Hunn | 21-07-1980 | NULL | First Street tomt nr. 4 | Privat bag | 0759 253 542 | janetjones@yagoo.cm | NULL |
| 2 | Janet Smith Jones | Hunn | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
| 3 | Robert Phil | mann | 12-07-1989 | NULL | 3rd Street 34 | NULL | 12345 | rm@tstreet.com | NULL |
| 4 | Gloria Williams | Hunn | 14-02-1984 | NULL | 2nd Street 23 | NULL | NULL | NULL | NULL |
| 5 | Leonard Hofstadter | mann | NULL | NULL | Woodcrest | NULL | 845738767 | NULL | NULL |
| 6 | Sheldon Cooper | mann | NULL | NULL | Woodcrest | NULL | 976736763 | NULL | NULL |
| 7 | Rajesh Koothrappali | mann | NULL | NULL | Woodcrest | NULL | 938867763 | NULL | NULL |
| 8 | Leslie Winkle | mann | 14-02-1984 | NULL | Woodcrest | NULL | 987636553 | NULL | NULL |
| 9 | Howard Wolowitz | mann | 24-08-1981 | NULL | Sรธr Park | PO Box 4563 | 987786553 | lwolowitz[at]email.me | NULL |
Bare 9 medlemmer er returnert, fordi N i LIMIT-klausulen er stรธrre enn antall poster i tabellen. ร spรธrre etter 9 rader gir eksplisitt det samme resultatsettet.
SELECT * FROM members LIMIT 9;
๐ก Tips: LIMIT velger rader fra den rekkefรธlgen serveren tilfeldigvis produserer. Legg til en REKKEFรLGE ETTER klausulen nรฅr identiteten til radene har betydning, ellers er det ikke garantert at ยซde fรธrste 10 medlemmeneยป betyr de samme ni personene to ganger.
ร begrense radantallet er den fรธrste halvdelen av funksjonen. ร velge hvor vinduet starter er den andre.
Bruk av OFFSET-verdien i LIMIT-spรธrringen
Ocuco OFFSET `value` brukes oftest sammen med LIMIT-nรธkkelordet. Det angir hvilken rad serveren begynner รฅ hente data fra, sรฅ rader fรธr det punktet hoppes over.
Anta at vi รธnsker et begrenset antall medlemmer som starter fra midten av tabellen. Skriptet nedenfor starter pรฅ andre rad og begrenser resultatet til to poster.
SELECT * FROM `members` LIMIT 1, 2;
Utfรธrer det i MySQL Workbench mot myflixdb gir fรธlgende resultat.
| medlemsnummer | fulle_ navn | kjรธnn | fรธdselsdato | registreringsdato | fysisk_ adresse | postadresse | kontaktnummer | emalje | kredittkortnummer |
|---|---|---|---|---|---|---|---|---|---|
| 2 | Janet Smith Jones | Hunn | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
| 3 | Robert Phil | mann | 12-07-1989 | NULL | 3rd Street 34 | NULL | 12345 | rm@tstreet.com | NULL |
Merk at her FORSKYVNING = 1, derfor er rad nr. 2 den fรธrste raden som returneres, og GRENSE = 2, derfor kommer bare 2 poster tilbake.
I formen med to argumenter skrives forskyvningen fรธrst og radantall deretter, noe som er lett รฅ reversere ved et uhell. MySQL aksepterer ogsรฅ en eksplisitt form som fjerner tvetydigheten, og det er den som foretrekkes i ny kode.
SELECT * FROM `members` LIMIT 2 OFFSET 1;
Begge setningene returnerer de samme to radene. Nรฅr offset-en er forstรฅtt, faller pagineringsmรธnsteret som alle oppfรธringsskjermer er avhengige av, direkte ut av den.
Slik paginererer du sรธkeresultater med LIMIT og OFFSET
Paginering deler et stort resultatsett inn i nummererte sider, og LIMIT sammen med OFFSET er mekanismen som gjรธr det. To verdier styrer hver sideforespรธrsel: sidestรธrrelsen, som er hvor mange poster som vises pรฅ รฉn skjerm, og sidetallet som forespurt av brukeren.
Offsetet er avledet fra dem med en enkelt formel.
-- OFFSET = page_size * (page_number - 1) SELECT membership_number, full_names FROM members ORDER BY membership_number ASC LIMIT 20 OFFSET 0; -- page 1
Side 2 beholder samme grense og flytter forskyvningen fremover med รฉn sidestรธrrelse.
SELECT membership_number, full_names FROM members ORDER BY membership_number ASC LIMIT 20 OFFSET 20; -- page 2
Tre regler sรธrger for at en paginert liste er korrekt og rask.
- Sorter alltid: En paginert spรธrring uten ORDER BY kan vise den samme posten pรฅ to forskjellige sider og skjule en annen helt, fordi serveren stรฅr fritt til รฅ endre radrekkefรธlgen mellom kall.
- Sorter pรฅ en unik kolonne: Uavgjorte rader i sorteringskolonnen lar rekkefรธlgen pรฅ de uavgjorte radene vรฆre udefinert. ร sortere pรฅ primรฆrnรธkkelen, eller legge den til som en uavgjort, fjerner problemet.
- Se dype sider: FORSKYVNING 100 000 krefter MySQL รฅ lese hundre tusen rader og kaste dem fรธr man returnerer de neste tjue. Svartiden รธker med sidetallet.
For svรฆrt dyp paginering unngรฅr nรธkkelsett-paginering forskyvningen fullstendig. I stedet for รฅ telle rader som skal hoppes over, husker spรธrringen den siste nรธkkelen fra forrige side og spรธr etter radene etter den.
SELECT membership_number, full_names FROM members WHERE membership_number > 20 -- last id from the previous page ORDER BY membership_number ASC LIMIT 20;
Denne formen holder seg rask uansett dybde, fordi indeksen hopper rett til starttasten i stedet for รฅ gรฅ gjennom radene foran den. Ulempen er at sider mรฅ gรฅs i rekkefรธlge, sรฅ hoppping Det er ikke lenger mulig รฅ gรฅ direkte til side 500.
LIMIT i MySQL vs. TOPP og HENT FรRST
LIMIT er ikke en del av alle SQL-dialekter, noe som er viktig sรฅ snart en spรธrring mรฅ flyttes mellom databasemotorer. MySQL, PostgreSQLog SQLite del LIMIT-nรธkkelordet. SQL Server bruker TOP, og Oracle bruker standard FETCH FIRST-klausulen. Tabellen nedenfor sammenligner de tre.
| Klausul | Motor | Eksempel | Hopper over rader |
|---|---|---|---|
| GRENSE โฆ FORSKYVNING | MySQL, PostgreSQL, SQLite | VELG * FRA medlemmer GRENSE 20 FORSKYVNING 40; | Ja, med FORSKYVNING |
| TOPP | SQL Server | VELG TOPP 20 * FRA medlemmer; | Nei, OFFSET โฆ FETCH er pรฅkrevd |
| HENT FรRST | Oracle, Db2, standard SQL | VELG * FRA medlemmer HENT KUN DE FรRSTE 20 RADENE; | Ja, med FORSKYVNING โฆ RADER |
Oppfรธrselen er den samme i begge tilfeller: sett en grense for antall rader og hopp eventuelt over et antall rader fรธrst. Bare stavemรฅten endres. En spรธrring som mรฅ kjรธre pรฅ mer enn รฉn motor, bรธr derfor isolere radbegrensningsklausulen i stedet for รฅ spre den gjennom kodebasen.
