MySQL LIMIT & OFFSET s příklady
⚡ Chytré shrnutí
Jedno MySQL Klíčové slovo LIMIT omezuje počet řádků, které dotaz vrátí, a hodnota OFFSET určuje, od kterého řádku výsledek začíná. Společně udržují sady výsledků malé, umožňují rychlé načítání stránek a umožňují stránkování záznam po záznamu.

Co je klíčové slovo LIMIT v MySQL?
Jedno LIMIT Klíčové slovo omezuje počet řádků vrácených ve výsledku dotazu. Lze jej použít s příkazy SELECT, UPDATE a DELETE, takže omezuje řádky, které dotaz čte, a také řádky, které zápis ovlivňuje.
Syntaxe klíčového slova LIMIT je následující.
SELECT {fieldname(s) | *} FROM tableName(s) [WHERE condition] LIMIT N;
ZDE
- “SELECT {název pole | *} FROM tableName(s)” je příkaz SELECT obsahující pole, která bychom chtěli v našem dotazu vrátit.
- “[KDE podmínka]” je volitelný, ale pokud je zadán, určuje filtr pro výslednou sadu. klauzule WHERE se aplikuje před LIMIT, takže filtrování probíhá jako první a omezení se aplikuje na to, co přežije.
- „LIMIT N“ je klíčové slovo a N je libovolné číslo začínající 0. Zadáním 0 jako limitu se nevrátí žádné záznamy. Zadáním čísla, například 5, se vrátí pět záznamů. Pokud tabulka obsahuje méně záznamů než N, vrátí se všechny a nedojde k žádné chybě.
Syntaxe je krátká, ale důvod její existence stojí za to uvést před příklady.
Proč bychom měli používat klíčové slovo LIMIT?
Předpokládejme, že se vyvíjímeping aplikace, která běží nad myflixdb. Návrháři systému nás požádali, abychom omezili počet záznamů zobrazených na stránce na 20 záznamů, abychom čelili pomalému načítání. Jak implementujeme systém, který splňuje tento požadavek?
Klíčové slovo LIMIT přesně tuto situaci řeší. Místo načtení každého řádku člena do aplikace a zahození většiny z nich dotaz vrátí 20 záznamů na stránku a databáze provede práci. Z toho vyplývají tři výhody.
- Rychlejší odezva: Z disku se načte méně dat a sítí se prochází méně dat.
- Nižší využití paměti: Aplikace uchovává jednu stránku řádků, nikoli celou tabulku.
- Safer píše: LIMIT na AKTUALIZACI nebo DELETE Příkaz omezuje, kolika řádků se může chyba dotknout.
MySQL Příklady dotazů LIMIT
Níže uvedené příklady fungují na základě tabulky members v databázi myflixdb. První z nich vrací dva řádky a nic víc.
SELECT * FROM members LIMIT 2;
| členské číslo | celá_ jména | rod | datum_narození | datum_registrace | fyzická adresa | poštovní_ adresa | kontaktní číslo | číslo kreditní karty | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Janet Jonesová | Žena | 21-07-1980 | NULL | První ulice pozemek č. 4 | Soukromá taška | 0759 253 542 | janetjones@yagoo.cm | NULL |
| 2 | Janet Smith Jonesová | Žena | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
Jak ukazuje výše uvedený výsledek, byli vráceni pouze dva členové.
Získání seznamu deseti (10) členů z databáze
Předpokládejme, že chceme seznam prvních 10 registrovaných členů z databáze Myflix. Následující skript se na ně zeptá.
SELECT * FROM members LIMIT 10;
Spuštění skriptu dává výsledek zobrazený níže.
| členské číslo | celá_ jména | rod | datum_narození | datum_registrace | fyzická adresa | poštovní_ adresa | kontaktní číslo | číslo kreditní karty | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Janet Jonesová | Žena | 21-07-1980 | NULL | První ulice pozemek č. 4 | Soukromá taška | 0759 253 542 | janetjones@yagoo.cm | NULL |
| 2 | Janet Smith Jonesová | Žena | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
| 3 | Robert Phil | Muž | 12-07-1989 | NULL | 3. ulice 34 | NULL | 12345 | rm@tstreet.com | NULL |
| 4 | Gloria Williamsová | Žena | 14-02-1984 | NULL | 2. ulice 23 | NULL | NULL | NULL | NULL |
| 5 | Leonard Hofstadter | Muž | NULL | NULL | Woodcrest | NULL | 845738767 | NULL | NULL |
| 6 | Sheldon Cooper | Muž | NULL | NULL | Woodcrest | NULL | 976736763 | NULL | NULL |
| 7 | Rajesh Koothrappali | Muž | NULL | NULL | Woodcrest | NULL | 938867763 | NULL | NULL |
| 8 | Leslie Winkle | Muž | 14-02-1984 | NULL | Woodcrest | NULL | 987636553 | NULL | NULL |
| 9 | Howard Wolowitz | Muž | 24-08-1981 | NULL | South Park | PO Box 4563 | 987786553 | lwolowitz[zavináč]email.me | NULL |
Bylo vráceno pouze 9 členů, protože N v klauzuli LIMIT je větší než počet záznamů v tabulce. Explicitní požadavek na 9 řádků vrátí stejnou sadu výsledků.
SELECT * FROM members LIMIT 9;
💡 Tip: Funkce LIMIT vybírá řádky z libovolného pořadí, které server vygeneruje. Přidejte SEŘADIT PODLE klauzuli vždy, když záleží na identitě řádků, jinak není zaručeno, že „prvních 10 členů“ bude znamenat stejných devět osob dvakrát.
Omezení počtu řádků je první polovina funkce. Výběr místa začátku okna je druhá.
Použití hodnoty OFFSET v dotazu LIMIT
Jedno OFFSET Argument value se nejčastěji používá společně s klíčovým slovem LIMIT. Určuje, od kterého řádku server začne načítat data, takže řádky před tímto bodem se přeskočí.
Předpokládejme, že chceme omezený počet členů počínaje od středu tabulky. Následující skript začíná na druhém řádku a omezuje výsledek na dva záznamy.
SELECT * FROM `members` LIMIT 1, 2;
Provedení v MySQL Workbench proti myflixdb dává následující výsledek.
| členské číslo | celá_ jména | rod | datum_narození | datum_registrace | fyzická adresa | poštovní_ adresa | kontaktní číslo | číslo kreditní karty | |
|---|---|---|---|---|---|---|---|---|---|
| 2 | Janet Smith Jonesová | Žena | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
| 3 | Robert Phil | Muž | 12-07-1989 | NULL | 3. ulice 34 | NULL | 12345 | rm@tstreet.com | NULL |
Všimněte si, že zde POSUN = 1, proto je řádek č. 2 prvním vráceným řádkem a LIMIT = 2, proto se vracejí pouze 2 záznamy.
Ve dvouargumentové formě se jako první zapíše offset a jako druhý počet řádků, což lze snadno omylem obrátit. MySQL také akceptuje explicitní formu, která odstraňuje nejednoznačnost, a je to ta, která se v novém kódu preferuje.
SELECT * FROM `members` LIMIT 2 OFFSET 1;
Oba příkazy vracejí stejné dva řádky. S pochopením offsetu z něj přímo vyplývá stránkovací vzor, na kterém se každá obrazovka s výpisem spoléhá.
Jak stránkovat výsledky dotazu pomocí funkcí LIMIT a OFFSET
Stránkování rozděluje velkou sadu výsledků na očíslované stránky a funkce LIMIT spolu s funkcí OFFSET je mechanismus, který to dělá. Každý požadavek na stránku řídí dvě hodnoty: velikost stránky, což je počet záznamů zobrazených na jedné obrazovce, a číslo stránky požadované uživatelem.
Offset se z nich odvozuje pomocí jediného vzorce.
-- OFFSET = page_size * (page_number - 1) SELECT membership_number, full_names FROM members ORDER BY membership_number ASC LIMIT 20 OFFSET 0; -- page 1
Stránka 2 si zachovává stejný limit a posune offset dopředu o jednu velikost stránky.
SELECT membership_number, full_names FROM members ORDER BY membership_number ASC LIMIT 20 OFFSET 20; -- page 2
Tři pravidla udržují stránkovaný výpis správný a rychlý.
- Vždy seřaďte: Stránkovaný dotaz bez ORDER BY může zobrazit stejný záznam na dvou různých stránkách a další zcela skrýt, protože server může mezi voláními libovolně měnit pořadí řádků.
- Seřadit podle jedinečného sloupce: Vázání ve sloupci řazení nechává pořadí vázaných řádků nedefinované. Řazení podle primárního klíče nebo jeho přidání jako rozdělovače řazení tento problém odstraňuje.
- Sledujte hluboké stránky: OFFSET 100000 sil MySQL přečíst sto tisíc řádků a zahodit je před vrácením dalších dvaceti. Doba odezvy roste s číslem stránky.
Pro velmi hluboké stránkování se stránkování sadou klíčů zcela vyhýbá posunu. Místo počítání řádků, které se mají přeskočit, si dotaz pamatuje poslední klíč z předchozí stránky a ptá se na řádky za ním.
SELECT membership_number, full_names FROM members WHERE membership_number > 20 -- last id from the previous page ORDER BY membership_number ASC LIMIT 20;
Tato forma zůstává rychlá v jakékoli hloubce, protože index skáče přímo na počáteční klíč, místo aby procházel řádky před ním. Nevýhodou je, že stránky je nutné procházet postupně, takže skákatping Přímý přechod na stranu 500 již není možný.
LIMIT v MySQL vs. TOP a FETCH FIRST
LIMIT není součástí každého dialektu SQL, což je důležité, jakmile se dotaz musí přesouvat mezi databázovými stroji. MySQL, PostgreSQL, a SQLite sdílejte klíčové slovo LIMIT. SQL Server používá TOP a Oracle používá standardní klauzuli FETCH FIRST. Níže uvedená tabulka porovnává tyto tři.
| Doložka | Motor | Příklad | Přeskočí řádky |
|---|---|---|---|
| LIMIT … POSUN | MySQL, PostgreSQL, SQLite | VYBRAT * Z členů LIMIT 20 POSUN 40; | Ano, s OFFSET |
| VÝŠKA | SQL Server | VYBERTE 20 NEJLEPŠÍCH * Z ČLENŮ; | Ne, je vyžadován OFFSET … FETCH |
| NEJDŘÍVE PŘINÁŠEJTE | Oracle, Db2, standardní SQL | SELECT * FROM members NAČÍST POUZE PRVNÍCH 20 ŘÁDKŮ; | Ano, s ODSAZENÍM … ŘÁDKŮ |
Chování je v obou případech stejné: omezit počet řádků a volitelně nejprve přeskočit několik řádků. Mění se pouze pravopis. Dotaz, který musí běžet na více než jednom enginu, by proto měl klauzuli omezující počet řádků izolovat, spíše než ji rozptýlit po kódové základně.
