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.

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 | 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 | 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 | 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ฤ.
- 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.
- 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.
- 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.
