MySQL LIMITE E OFFSET con esempi

⚡ Riepilogo intelligente

Migliori MySQL La parola chiave LIMIT limita il numero di righe restituite da una query, mentre il valore OFFSET determina la riga di partenza del risultato. Insieme, mantengono i set di risultati di dimensioni ridotte, velocizzano il caricamento delle pagine e consentono la paginazione record per record.

  • 🔢 Comportamento fondamentale: LIMIT N restituisce al massimo N righe. Una tabella con un numero di righe inferiore a N le restituisce tutte, senza errori.
  • 0️⃣ Caso zero: LIMIT 0 non restituisce alcuna riga, il che lo rende un metodo economico per ispezionare i metadati delle colonne.
  • 📍 Sintassi di offset: LIMIT 1, 2 salta una riga e ne restituisce due, quindi l'offset viene scritto per primo e il conteggio delle righe per secondo.
  • 📄 Formula di paginazione: OFFSET equivale alla dimensione della pagina moltiplicata per il numero di pagina meno uno, trasformando così un set di risultati in pagine numerate.
  • Dipendenza dall'ordine: Senza ORDINE DA, MySQL potrebbe restituire righe diverse a ogni esecuzione, quindi LIMIT è deterministico solo con un ordinamento esplicito.
  • ⚙️ Documento a supporto: LIMIT impone anche un limite al numero di righe interessate dalle operazioni di UPDATE e DELETE, proteggendo una tabella di grandi dimensioni da scritture illimitate.
  • ???? Avvertenza sulle prestazioni: Un grande offset rende MySQL Leggi e scarta ogni riga saltata, in modo che le pagine profonde crescano più lentamente.

MySQL LIMITE e OFFSET

Qual è la parola chiave LIMIT in MySQL?

Migliori LIMITE La parola chiave limita il numero di righe restituite nel risultato di una query. Può essere utilizzata con le istruzioni SELECT, UPDATE e DELETE, quindi limita sia le righe lette da una query sia le righe interessate da un'operazione di scrittura.

La sintassi per la parola chiave LIMIT è la seguente.

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

QUI

  • “SELEZIONA {nome/i campo/i | *} FROM tableName(s)" Europe è Istruzione SELECT contenente i campi che vorremmo restituire nella nostra query.
  • “[Condizione DOVE]” è facoltativo, ma se fornito specifica un filtro sul set di risultati. Dove la clausola viene applicato prima di LIMIT, quindi il filtraggio avviene per primo e il limite viene applicato a ciò che sopravvive.
  • “LIMIT N” è la parola chiave, e N N è un numero qualsiasi a partire da 0. Impostando 0 come limite, non viene restituito alcun record. Impostando un numero come 5, vengono restituiti cinque record. Se la tabella contiene meno di N record, vengono restituiti tutti e non viene generato alcun errore.

La sintassi è breve, ma vale la pena spiegarne il motivo prima di passare agli esempi.

Perché dovremmo usare la parola chiave LIMIT?

Supponiamo di essere sviluppatoriping L'applicazione che gira su MyFlixDB. I progettisti del sistema ci hanno chiesto di limitare il numero di record visualizzati per pagina a 20, al fine di contrastare i tempi di caricamento lenti. Come possiamo implementare un sistema che soddisfi questo requisito?

La parola chiave LIMIT gestisce esattamente questa situazione. Invece di importare ogni riga relativa ai membri nell'applicazione e scartarne la maggior parte, la query restituisce 20 record per pagina e il database si occupa del resto. Da ciò derivano tre vantaggi.

  • Risposta più veloce: Vengono letti meno dati dal disco e meno dati transitano attraverso la rete.
  • Minore utilizzo della memoria: L'applicazione contiene una sola pagina di righe, non l'intera tabella.
  • Safer scrive: un LIMITE su un AGGIORNAMENTO o un DELETE L'istruzione limita il numero di righe che un errore può interessare.

MySQL Esempi di query LIMIT

Gli esempi seguenti vengono eseguiti sulla tabella members del database myflixdb. Il primo restituisce due righe e nient'altro.

SELECT * FROM members LIMIT 2;
numero_iscrizione nomi_completi genere data_di_nascita data_di_registrazione indirizzo fisico indirizzo postale numero di contatto email Numero di carta di credito
1 Janet Jones Femmina 21-07-1980 NULL Primo lotto di strada n. 4 Borsa privata 0759 253 542 janetjones@yagoo.cm NULL
2 Janet Smith Jones Femmina 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL

Come dimostra il risultato sopra riportato, sono stati restituiti solo due membri.

Ottenere un elenco di dieci (10) membri dal database

Supponiamo di voler ottenere un elenco dei primi 10 membri registrati nel database di Myflix. Lo script seguente li richiede.

SELECT * FROM members LIMIT 10;

L'esecuzione dello script produce il risultato mostrato di seguito.

numero_iscrizione nomi_completi genere data_di_nascita data_di_registrazione indirizzo fisico indirizzo postale numero di contatto email Numero di carta di credito
1 Janet Jones Femmina 21-07-1980 NULL Primo lotto di strada n. 4 Borsa privata 0759 253 542 janetjones@yagoo.cm NULL
2 Janet Smith Jones Femmina 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Roberto Fil Maschio 12-07-1989 NULL 3a strada 34 NULL 12345 rm@tstreet.com NULL
4 Gloria Williams Femmina 14-02-1984 NULL 2a strada 23 NULL NULL NULL NULL
5 Leonard Hofstadter Maschio NULL NULL Cresta di legno NULL 845738767 NULL NULL
6 Sheldon Cooper Maschio NULL NULL Cresta di legno NULL 976736763 NULL NULL
7 Rajesh Koothrappali Maschio NULL NULL Cresta di legno NULL 938867763 NULL NULL
8 Leslie Winkle Maschio 14-02-1984 NULL Cresta di legno NULL 987636553 NULL NULL
9 Howard Wolowitz Maschio 24-08-1981 NULL Parco Sud PO Box 4563 987786553 lwolowitz[at]email.me NULL

Sono stati restituiti solo 9 elementi, perché N nella clausola LIMIT è maggiore del numero di record nella tabella. Richiedere esplicitamente 9 righe produce lo stesso set di risultati.

SELECT * FROM members LIMIT 9;

Suggerimento: LIMIT seleziona le righe dall'ordine in cui il server le produce. Aggiungi un ORDINATO DA clausola ogniqualvolta l'identità delle righe è rilevante, altrimenti "i primi 10 membri" non garantisce che si riferiscano alle stesse nove persone due volte.

Limitare il numero di righe rappresenta la prima parte della funzionalità. Scegliere il punto di inizio della finestra costituisce la seconda.

Utilizzo del valore OFFSET nella query LIMIT

Migliori COMPENSARE Il parametro VALUE viene spesso utilizzato insieme alla parola chiave LIMIT. Specifica da quale riga il server inizia a recuperare i dati, pertanto le righe precedenti a quel punto vengono saltate.

Supponiamo di voler limitare il numero di membri a partire dal centro della tabella. Lo script seguente inizia dalla seconda riga e limita il risultato a due record.

SELECT * FROM `members` LIMIT 1, 2;

Eseguendolo in MySQL banco di lavoro Il confronto con myflixdb fornisce il seguente risultato.

numero_iscrizione nomi_completi genere data_di_nascita data_di_registrazione indirizzo fisico indirizzo postale numero di contatto email Numero di carta di credito
2 Janet Smith Jones Femmina 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Roberto Fil Maschio 12-07-1989 NULL 3a strada 34 NULL 12345 rm@tstreet.com NULL

Nota che qui COMPENSAZIONE = 1, quindi la riga n. 2 è la prima riga restituita e LIMITE = 2, quindi vengono restituiti solo 2 record.

Nella forma a due argomenti, l'offset viene scritto per primo e il numero di righe per secondo, il che rende facile invertire l'ordine per errore. MySQL Accetta inoltre una forma esplicita che elimina l'ambiguità ed è quella da preferire nel nuovo codice.

SELECT * FROM `members` LIMIT 2 OFFSET 1;

Entrambe le istruzioni restituiscono le stesse due righe. Una volta compreso l'offset, il modello di paginazione su cui si basa ogni schermata di elenco ne deriva direttamente.

Come impaginare i risultati di una query con LIMIT e OFFSET

La paginazione suddivide un set di risultati di grandi dimensioni in pagine numerate, e LIMIT, insieme a OFFSET, è il meccanismo che la realizza. Due valori determinano ogni richiesta di pagina: la dimensione della pagina, ovvero quanti record vengono visualizzati su una schermata, e il numero di pagina richiesto dall'utente.

L'offset viene ricavato da essi con un'unica formula.

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

La pagina 2 mantiene lo stesso limite e sposta l'offset in avanti di una dimensione di pagina.

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

Tre regole garantiscono la correttezza e la rapidità di creazione di un elenco impaginato.

  1. Ordina sempre: Una query paginata senza ORDER BY può mostrare lo stesso record su due pagine diverse e nasconderne completamente un'altra, perché il server è libero di modificare l'ordine delle righe tra una chiamata e l'altra.
  2. Ordina in base a una colonna univoca: I valori uguali nella colonna di ordinamento lasciano indefinito l'ordine delle righe a pari merito. Ordinare in base alla chiave primaria, o aggiungerla come criterio di spareggio, risolve il problema.
  3. Guarda le pagine profonde: OFFSET 100000 forze MySQL Leggere centomila righe e scartarle prima di restituirne le successive venti. Il tempo di risposta aumenta con il numero di pagina.

Per una paginazione molto profonda, la paginazione basata su keyset evita completamente l'offset. Invece di contare le righe da saltare, la query memorizza l'ultima chiave della pagina precedente e richiede le righe successive.

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

Questa forma rimane veloce a qualsiasi profondità, perché l'indice salta direttamente alla chiave iniziale invece di percorrere le righe che la precedono. Il compromesso è che le pagine devono essere percorse in sequenza, quindi saltareping Non è più possibile andare direttamente a pagina 500.

Limite in MySQL vs TOP e FETCH FIRST

LIMIT non è presente in tutti i dialetti SQL, il che diventa rilevante non appena una query deve essere elaborata da un motore di database all'altro. MySQL, PostgreSQLe SQLite condividono la parola chiave LIMIT. SQL Server utilizza TOP e Oracle utilizza la clausola FETCH FIRST standard. La tabella seguente confronta le tre.

Clausola motore Esempio Salta le righe
LIMITE … OFFSET MySQL, PostgreSQL, SQLite SELECT * FROM members LIMIT 20 OFFSET 40; Sì, con OFFSET
TOP SQL Server SELEZIONA I 20 MIGLIORI * membri; No, è richiesto OFFSET … FETCH
PRENDETE PRIMA Oracle, Db2, SQL standard SELECT * FROM members FETCH FIRST 20 ROWS ONLY; Sì, con OFFSET … RIGHE

Il comportamento è lo stesso in ogni caso: limitare il numero di righe e, facoltativamente, saltare prima un certo numero di righe. Cambia solo l'ortografia. Una query che deve essere eseguita su più di un motore dovrebbe quindi isolare la clausola di limitazione delle righe anziché disperderla nel codice.

DOMANDE FREQUENTI

Sì. Entrambi accettano un semplice conteggio delle righe, come DELETE FROM members LIMIT 10. La forma offset a due argomenti non è consentita, quindi è possibile limitare solo il numero di righe interessate.

L'offset viene contato a partire da zero, quindi OFFSET 0 inizia dalla prima riga e OFFSET 1 dalla seconda. Il numero di righe è una quantità semplice e viene letto come un normale numero.

Esegui una query SELECT COUNT(*) separata con la stessa clausola WHERE ma senza LIMIT. Il conteggio indica all'applicazione quante pagine esistono, mentre la query limitata restituisce le righe relative alla pagina corrente.

Spesso sì. Gli assistenti IA all'interno di client come MySQL banco di lavoro Riscrivi una query OFFSET in una clausola WHERE sulla chiave "last seen". Verifica che la colonna di ordinamento sia univoca e indicizzata prima di considerare valida la riscrittura.

Poiché l'istruzione generata di solito omette ORDER BY. Senza un ordinamento esplicito, MySQL Le righe possono essere restituite in qualsiasi ordine, quindi lo stesso LIMIT può produrre un campione diverso a ogni esecuzione. Aggiungi l'ordinamento manualmente.

Riassumi questo post con: