MySQL LIMIT & OFFSET cu Exemple

โšก Rezumat inteligent

MySQL Cuvรขntul cheie LIMIT restricศ›ioneazฤƒ numฤƒrul de rรขnduri returnate de o interogare, iar valoarea OFFSET decide de la ce rรขnd รฎncepe rezultatul. รŽmpreunฤƒ, acestea menศ›in seturile de rezultate mici, fac ca paginile sฤƒ se รฎncarce rapid ศ™i stimuleazฤƒ paginarea รฎnregistrare cu รฎnregistrare.

  • ๐Ÿ”ข Comportament de bazฤƒ: LIMIT N returneazฤƒ cel mult N rรขnduri. Un tabel care conศ›ine mai puศ›ine rรขnduri decรขt N le returneazฤƒ pe toate, fฤƒrฤƒ eroare.
  • 0๏ธโƒฃ Caz zero: LIMIT 0 nu returneazฤƒ niciun rรขnd, ceea ce รฎl face o modalitate ieftinฤƒ de a inspecta metadatele coloanei.
  • ๐Ÿ“ Sintaxa Offset: LIMIT 1, 2 sare un rรขnd ศ™i returneazฤƒ douฤƒ, astfel รฎncรขt offset-ul este scris primul, iar numฤƒrul de rรขnduri pe al doilea.
  • ๐Ÿ“„ Formula de paginare: OFFSET este egal cu dimensiunea paginii รฎnmulศ›itฤƒ cu numฤƒrul paginii minus unu, ceea ce transformฤƒ un set de rezultate รฎn pagini numerotate.
  • โ†•๏ธ Dependenศ›a comenzii: Fฤƒrฤƒ ORDER BY, MySQL poate returna rรขnduri diferite la fiecare execuศ›ie, deci LIMIT este determinist doar cu o sortare explicitฤƒ.
  • โš™๏ธ Suport pentru declaraศ›ii: LIMIT limiteazฤƒ ศ™i rรขndurile afectate de UPDATE ศ™i DELETE, protejรขnd un tabel mare de o scriere nelimitatฤƒ.
  • ๐Ÿข Avertisment privind performanศ›a: O compensare mare face MySQL citeศ™te ศ™i ศ™terge fiecare rรขnd omis, astfel รฎncรขt paginile adรขnci cresc mai รฎncet.

MySQL LIMITฤ‚ ศ™i OFFSET

Care este cuvรขntul cheie LIMIT รฎn MySQL?

LIMITฤ‚ Cuvรขntul cheie restricศ›ioneazฤƒ numฤƒrul de rรขnduri returnate รฎntr-un rezultat al interogฤƒrii. Poate fi utilizat cu instrucศ›iunile SELECT, UPDATE ศ™i DELETE, astfel รฎncรขt limiteazฤƒ atรขt rรขndurile citite de o interogare, cรขt ศ™i rรขndurile afectate de o scriere.

Sintaxa pentru cuvรขntul cheie LIMIT este urmฤƒtoarea.

SELECT {fieldname(s) | *} FROM tableName(s) [WHERE condition] LIMIT N;

AICI

  • โ€žSELECTARE {fieldname(s) | *} FROM tableName(s)โ€ este instrucศ›iunea SELECT care conศ›in cรขmpurile pe care am dori sฤƒ le returnฤƒm รฎn interogarea noastrฤƒ.
  • โ€ž[condiศ›ia WHERE]โ€ este opศ›ional, dar atunci cรขnd este furnizat, specificฤƒ un filtru pentru setul de rezultate. clauza WHERE se aplicฤƒ รฎnainte de LIMIT, deci filtrarea are loc prima, iar limitarea se aplicฤƒ la ceea ce supravieศ›uieศ™te.
  • โ€žLIMITA Nโ€ este cuvรขntul cheie ศ™i N este orice numฤƒr รฎncepรขnd de la 0. Introducerea valorii 0 ca limitฤƒ nu returneazฤƒ nicio รฎnregistrare. Introducerea unui numฤƒr precum 5 returneazฤƒ cinci รฎnregistrฤƒri. Dacฤƒ tabelul conศ›ine mai puศ›ine รฎnregistrฤƒri decรขt N, toate sunt returnate ศ™i nu se genereazฤƒ nicio eroare.

Sintaxa este scurtฤƒ, dar motivul pentru care existฤƒ meritฤƒ menศ›ionat รฎnainte de exemple.

De ce ar trebui sฤƒ folosim cuvรขntul cheie LIMIT?

Sฤƒ presupunem cฤƒ suntem dezvoltaศ›iping aplicaศ›ia care ruleazฤƒ pe myflixdb. Designerii sistemului ne-au cerut sฤƒ limitฤƒm numฤƒrul de รฎnregistrฤƒri afiศ™ate pe o paginฤƒ la 20 de รฎnregistrฤƒri, pentru a contracara timpii de รฎncฤƒrcare lenศ›i. Cum implementฤƒm un sistem care sฤƒ รฎndeplineascฤƒ o astfel de cerinศ›ฤƒ?

Cuvรขntul cheie LIMIT gestioneazฤƒ exact aceastฤƒ situaศ›ie. รŽn loc sฤƒ extragฤƒ fiecare rรขnd de membru รฎn aplicaศ›ie ศ™i sฤƒ le elimine pe majoritatea, interogarea returneazฤƒ 20 de รฎnregistrฤƒri pe paginฤƒ, iar baza de date face treaba. Rezultฤƒ trei beneficii din aceasta.

  • Rฤƒspuns mai rapid: mai puศ›ine date sunt citite de pe disc ศ™i mai puศ›ine date traverseazฤƒ reศ›eaua.
  • Utilizare redusฤƒ a memoriei: Aplicaศ›ia conศ›ine o singurฤƒ paginฤƒ de rรขnduri, nu รฎntregul tabel.
  • Safer scrie: o LIMITฤ‚ pentru o ACTUALIZARE sau o DELETE Instrucศ›iunea limiteazฤƒ numฤƒrul de rรขnduri pe care le poate atinge o eroare.

MySQL Exemple de interogฤƒri LIMIT

Exemplele de mai jos ruleazฤƒ pe baza tabelei members din baza de date myflixdb. Primul returneazฤƒ douฤƒ rรขnduri ศ™i nimic mai mult.

SELECT * FROM members LIMIT 2;
numar de membru nume complete sex data naศ™terii data_รฎnregistrฤƒrii adresฤƒ fizicฤƒ adresa postala numฤƒr de contact e-mail Numฤƒrul cฤƒrศ›ii de credit
1 Janet Jones Femeie 21-07-1980 NULL Primul teren stradal nr. 4 Geantฤƒ privatฤƒ 0759 253 542 janetjones@yagoo.cm NULL
2 Janet Smith Jones Femeie 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL

Dupฤƒ cum aratฤƒ rezultatul de mai sus, doar doi membri au fost returnaศ›i.

Obศ›inerea unei liste de zece (10) membri din baza de date

Sฤƒ presupunem cฤƒ dorim o listฤƒ cu primii 10 membri รฎnregistraศ›i din baza de date Myflix. Scriptul de mai jos รฎi solicitฤƒ.

SELECT * FROM members LIMIT 10;

Executarea scriptului dฤƒ rezultatul prezentat mai jos.

numar de membru nume complete sex data naศ™terii data_รฎnregistrฤƒrii adresฤƒ fizicฤƒ adresa postala numฤƒr de contact e-mail Numฤƒrul cฤƒrศ›ii de credit
1 Janet Jones Femeie 21-07-1980 NULL Primul teren stradal nr. 4 Geantฤƒ privatฤƒ 0759 253 542 janetjones@yagoo.cm NULL
2 Janet Smith Jones Femeie 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Robert Phil Masculin 12-07-1989 NULL Strada a 3-a 34 NULL 12345 rm@tstreet.com NULL
4 Gloria Williams Femeie 14-02-1984 NULL Strada 2 23 NULL NULL NULL NULL
5 Leonard Hofstadter Masculin NULL NULL Woodcrest NULL 845738767 NULL NULL
6 Sheldon Cooper Masculin NULL NULL Woodcrest NULL 976736763 NULL NULL
7 Rajesh Koothrappali Masculin NULL NULL Woodcrest NULL 938867763 NULL NULL
8 Leslie Winkle Masculin 14-02-1984 NULL Woodcrest NULL 987636553 NULL NULL
9 Howard Wolowitz Masculin 24-08-1981 NULL Parcul din sud PO Box 4563 987786553 lwolowitz[la]email.me NULL

Au fost returnaศ›i doar 9 membri, deoarece N din clauza LIMIT este mai mare decรขt numฤƒrul de รฎnregistrฤƒri din tabel. Solicitarea a 9 rรขnduri produce รฎn mod explicit acelaศ™i set de rezultate.

SELECT * FROM members LIMIT 9;

๐Ÿ’ก Sfat: LIMIT selecteazฤƒ rรขnduri din orice ordine produce serverul. Adฤƒugaศ›i un COMANDA DE clauzฤƒ ori de cรขte ori identitatea rรขndurilor conteazฤƒ, altfel nu este garantat cฤƒ โ€žprimii 10 membriโ€ รฎnseamnฤƒ aceleaศ™i nouฤƒ persoane de douฤƒ ori.

Limitarea numฤƒrului de rรขnduri este prima jumฤƒtate a funcศ›ionalitฤƒศ›ii. Alegerea locului de รฎncepere a ferestrei este a doua.

Utilizarea valorii OFFSET รฎn interogarea LIMIT

OFFSET `value` este cel mai adesea utilizatฤƒ รฎmpreunฤƒ cu cuvรขntul cheie LIMIT. Aceasta specificฤƒ din ce rรขnd รฎncepe serverul sฤƒ preia datele, astfel รฎncรขt rรขndurile dinaintea acelui punct sunt omise.

Sฤƒ presupunem cฤƒ dorim un numฤƒr limitat de membri รฎncepรขnd de la mijlocul tabelului. Scriptul de mai jos รฎncepe de la al doilea rรขnd ศ™i limiteazฤƒ rezultatul la douฤƒ รฎnregistrฤƒri.

SELECT * FROM `members` LIMIT 1, 2;

Executรขndu-l รฎn MySQL Banc de lucru รฎmpotriva myflixdb dฤƒ urmฤƒtorul rezultat.

numar de membru nume complete sex data naศ™terii data_รฎnregistrฤƒrii adresฤƒ fizicฤƒ adresa postala numฤƒr de contact e-mail Numฤƒrul cฤƒrศ›ii de credit
2 Janet Smith Jones Femeie 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Robert Phil Masculin 12-07-1989 NULL Strada a 3-a 34 NULL 12345 rm@tstreet.com NULL

Reศ›ineศ›i cฤƒ aici OFFSET = 1, prin urmare, rรขndul #2 este primul rรขnd returnat ศ™i LIMITฤ‚ = 2, prin urmare, apar doar 2 รฎnregistrฤƒri.

รŽn forma cu douฤƒ argumente, offset-ul este scris primul, iar numฤƒrul de rรขnduri pe al doilea, ceea ce este uศ™or de inversat accidental. MySQL acceptฤƒ, de asemenea, o formฤƒ explicitฤƒ care eliminฤƒ ambiguitatea ศ™i este cea de preferat รฎn codul nou.

SELECT * FROM `members` LIMIT 2 OFFSET 1;

Ambele instrucศ›iuni returneazฤƒ aceleaศ™i douฤƒ rรขnduri. Odatฤƒ ce offset-ul este รฎnศ›eles, modelul de paginare pe care se bazeazฤƒ fiecare ecran de listare se destramฤƒ direct din acesta.

Cum se paginaศ›i rezultatele interogฤƒrilor cu LIMIT ศ™i OFFSET

Paginarea รฎmparte un set mare de rezultate รฎn pagini numerotate, iar LIMIT รฎmpreunฤƒ cu OFFSET reprezintฤƒ mecanismul care face acest lucru. Douฤƒ valori determinฤƒ fiecare solicitare de paginฤƒ: dimensiunea paginii, care reprezintฤƒ numฤƒrul de รฎnregistrฤƒri care apar pe un ecran, ศ™i numฤƒrul paginii solicitate de utilizator.

Offset-ul este derivat din ele cu o singurฤƒ formulฤƒ.

-- OFFSET = page_size * (page_number - 1)
SELECT membership_number, full_names
FROM members
ORDER BY membership_number ASC
LIMIT 20 OFFSET 0;   -- page 1

Pagina 2 pฤƒstreazฤƒ aceeaศ™i limitฤƒ ศ™i mutฤƒ decalajul รฎnainte cu o dimensiune de paginฤƒ.

SELECT membership_number, full_names
FROM members
ORDER BY membership_number ASC
LIMIT 20 OFFSET 20;  -- page 2

Trei reguli menศ›in o listฤƒ paginatฤƒ corectฤƒ ศ™i rapidฤƒ.

  1. Sorteazฤƒ รฎntotdeauna: O interogare paginatฤƒ fฤƒrฤƒ ORDER BY poate afiศ™a aceeaศ™i รฎnregistrare pe douฤƒ pagini diferite ศ™i ascunde complet o altฤƒ รฎnregistrare, deoarece serverul este liber sฤƒ modifice ordinea rรขndurilor รฎntre apeluri.
  2. Sorteazฤƒ dupฤƒ o coloanฤƒ unicฤƒ: Legฤƒturile din coloana de sortare lasฤƒ ordinea rรขndurilor legate nedefinitฤƒ. Sortarea dupฤƒ cheia primarฤƒ sau adฤƒugarea acesteia ca factor de departajare eliminฤƒ problema.
  3. Urmฤƒriศ›i paginile profunde: OFFSET 100000 forศ›e MySQL sฤƒ citeascฤƒ o sutฤƒ de mii de rรขnduri ศ™i sฤƒ le elimine รฎnainte de a returna urmฤƒtoarele douฤƒzeci. Timpul de rฤƒspuns creศ™te odatฤƒ cu numฤƒrul paginii.

Pentru paginarea foarte profundฤƒ, paginarea setului de chei evitฤƒ complet decalajul. รŽn loc sฤƒ numere rรขndurile de omis, interogarea reศ›ine ultima cheie de pe pagina anterioarฤƒ ศ™i solicitฤƒ rรขndurile de dupฤƒ aceasta.

SELECT membership_number, full_names
FROM members
WHERE membership_number > 20      -- last id from the previous page
ORDER BY membership_number ASC
LIMIT 20;

Aceastฤƒ formฤƒ rฤƒmรขne rapidฤƒ la orice adรขncime, deoarece indexul sare direct la cheia de รฎnceput, รฎn loc sฤƒ parcurgฤƒ rรขndurile dinaintea sa. Compromisul este cฤƒ paginile trebuie parcurse รฎn secvenศ›ฤƒ, deci sฤƒriศ›iping Nu mai este posibilฤƒ accesul direct la pagina 500.

LIMITฤ‚ รฎn MySQL vs TOP ศ™i FETCH FIRST

LIMIT nu face parte din fiecare dialect SQL, ceea ce conteazฤƒ imediat ce o interogare trebuie sฤƒ se mute รฎntre motoarele de baze de date. MySQL, PostgreSQL ศ™i SQLite partajaศ›i cuvรขntul cheie LIMIT. SQL Server foloseศ™te TOP ศ™i Oracle foloseศ™te clauza standard FETCH FIRST. Tabelul de mai jos comparฤƒ cele trei.

Clauzฤƒ Motor Exemplu Omite rรขndurile
LIMITฤ‚ โ€ฆ OFFSET MySQL, PostgreSQL, SQLite SELECT * FROM membri LIMIT 20 OFFSET 40; Da, cu OFFSET
TOP SQL Server SELECTAศšI TOP 20 * DINTRE membri; Nu, OFFSET โ€ฆ este necesar FETCH
FETCH MAINTI Oracle, Db2, SQL standard SELECT * FROM membri PRELUARE DOAR PRIMELE 20 DE Rร‚NDURI; Da, cu OFFSET โ€ฆ Rร‚NDURI

Comportamentul este acelaศ™i รฎn fiecare caz: limitaศ›i numฤƒrul de rรขnduri ศ™i, opศ›ional, sฤƒriศ›i mai รฎntรขi peste un numฤƒr de rรขnduri. Se schimbฤƒ doar ortografia. O interogare care trebuie sฤƒ ruleze pe mai multe motoare ar trebui, prin urmare, sฤƒ izoleze clauza de limitare a rรขndurilor, รฎn loc sฤƒ o รฎmprฤƒศ™tie prin baza de cod.

รŽntrebฤƒri frecvente

Da. Ambele acceptฤƒ un numฤƒr simplu de rรขnduri, cum ar fi DELETE FROM members LIMIT 10. Forma de offset cu douฤƒ argumente nu este permisฤƒ acolo, deci poate fi limitat doar numฤƒrul de rรขnduri afectate.

Offset-ul รฎncepe de la zero, deci OFFSET 0 รฎncepe de la primul rรขnd, iar OFFSET 1 รฎncepe de la al doilea. Numฤƒrul de rรขnduri รฎn sine este o cantitate simplฤƒ ศ™i este citit ca un numฤƒr normal.

Executaศ›i o comandฤƒ SELECT COUNT(*) separatฤƒ cu aceeaศ™i clauzฤƒ WHERE, dar fฤƒrฤƒ LIMIT. Numฤƒrul indicฤƒ aplicaศ›iei cรขte pagini existฤƒ, รฎn timp ce interogarea limitatฤƒ returneazฤƒ rรขndurile pentru pagina curentฤƒ.

Adesea, da. Asistenศ›ii AI din interiorul clienศ›ilor, cum ar fi MySQL Banc de lucru rescrie o interogare OFFSET รฎntr-o clauzฤƒ WHERE pe ultima cheie vฤƒzutฤƒ. Confirmaศ›i cฤƒ coloana de sortare este unicฤƒ ศ™i indexatฤƒ รฎnainte de a avea รฎncredere รฎn rescriere.

Deoarece instrucศ›iunea generatฤƒ omite de obicei ORDER BY. Fฤƒrฤƒ o sortare explicitฤƒ, MySQL poate returna rรขndurile รฎn orice ordine, astfel รฎncรขt aceeaศ™i funcศ›ie LIMIT poate produce un eศ™antion diferit la fiecare rulare. Adฤƒugaศ›i sortarea singur.

Rezumaศ›i aceastฤƒ postare cu: