MySQL LIMIT & OFFSET com exemplos

⚡ Resumo Inteligente

O MySQL A palavra-chave LIMIT restringe o número de linhas retornadas por uma consulta, e o valor OFFSET define a partir de qual linha o resultado começa. Juntas, elas mantêm os conjuntos de resultados pequenos, aceleram o carregamento das páginas e permitem a paginação registro por registro.

  • 🔢 Comportamento Essencial: LIMIT N retorna no máximo N linhas. Uma tabela com menos linhas que N retorna todas elas, sem erro.
  • 0️⃣ Caso Zero: LIMIT 0 não retorna nenhuma linha, o que a torna uma maneira barata de inspecionar os metadados da coluna.
  • 📍 Sintaxe de deslocamento: LIMIT 1, 2 pula uma linha e retorna duas, portanto o deslocamento é escrito primeiro e a contagem de linhas em segundo lugar.
  • 📄 Fórmula de paginação: OFFSET é igual ao tamanho da página multiplicado pelo número da página menos um, o que transforma um conjunto de resultados em páginas numeradas.
  • ↕️ Dependência de ordem: Sem a opção ORDER BY, MySQL Pode retornar linhas diferentes a cada execução, portanto, LIMIT só é determinístico com uma ordenação explícita.
  • ⚙️ Apoio à declaração: LIMIT também limita o número de linhas afetadas por UPDATE e DELETE, protegendo uma tabela grande de gravações ilimitadas.
  • ???? Aviso sobre o desempenho: Um grande deslocamento faz MySQL Leia e descarte cada linha ignorada, fazendo com que as páginas mais profundas cresçam mais lentamente.

MySQL LIMITE e DESLOCAMENTO

Qual é a palavra-chave LIMIT em MySQL?

O LIMITE A palavra-chave `WHERE` restringe o número de linhas retornadas no resultado de uma consulta. Ela pode ser usada com as instruções `SELECT`, `UPDATE` e `DELETE`, limitando assim o número de linhas que uma consulta lê, bem como o número de linhas que uma operação de gravação afeta.

A sintaxe da palavra-chave LIMIT é a seguinte.

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

AQUI

  • “SELECIONE {nome(s) do(s) campo(s) | *} FROM nome(s) da(s) tabela(s)” é o Instrução SELECT contendo os campos que gostaríamos de retornar em nossa consulta.
  • “[ONDE condição]” É opcional, mas quando fornecido, especifica um filtro no conjunto de resultados. Cláusula WHERE é aplicado antes do LIMIT, portanto a filtragem ocorre primeiro e o limite é aplicado ao que resta.
  • “LIMITE N” é a palavra-chave, e N é qualquer número a partir de 0. Definir 0 como limite não retorna nenhum registro. Definir um número como 5 retorna cinco registros. Se a tabela contiver menos registros que N, todos eles serão retornados e nenhum erro será gerado.

A sintaxe é curta, mas vale a pena explicar o motivo de sua existência antes dos exemplos.

Por que devemos usar a palavra-chave LIMIT?

Suponha que estamos desenvolvendoping O aplicativo que roda sobre o banco de dados MyflixDB. Os desenvolvedores do sistema nos pediram para limitar o número de registros exibidos por página a 20, a fim de evitar lentidão no carregamento. Como podemos implementar um sistema que atenda a esse requisito?

A palavra-chave LIMIT lida exatamente com essa situação. Em vez de puxar todas as linhas de membros para o aplicativo e descartar a maioria delas, a consulta retorna 20 registros por página e o banco de dados faz o trabalho. Três benefícios decorrem disso.

  • Resposta mais rápida: Menos dados são lidos do disco e menos dados trafegam pela rede.
  • Reduzir o uso de memória: O aplicativo contém uma página de linhas, não a tabela inteira.
  • Safer escreve: um LIMITE em uma ATUALIZAÇÃO ou um EXCLUIR A declaração limita quantas linhas um erro pode afetar.

MySQL Exemplos de consulta LIMIT

Os exemplos abaixo são executados na tabela de membros do banco de dados myflixdb. O primeiro retorna duas linhas e nada mais.

SELECT * FROM members LIMIT 2;
número de membro nomes completos gênero data_de_nascimento data_de_registro endereço físico endereço postal número de contato E-mail Número do cartão de crédito
1 Janet Jones Feminino 21-07-1980 NULL Lote da Primeira Rua nº 4 Mala Privada 0759 253 542 janetjones@yagoo.cm NULL
2 Janete Smith Jones Feminino 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL

Conforme demonstrado no resultado acima, apenas dois membros foram devolvidos.

Obtendo uma lista de dez (10) membros do banco de dados

Suponha que desejemos uma lista dos 10 primeiros membros registrados no banco de dados do Myflix. O script abaixo solicita essa lista.

SELECT * FROM members LIMIT 10;

A execução do script produz o resultado mostrado abaixo.

número de membro nomes completos gênero data_de_nascimento data_de_registro endereço físico endereço postal número de contato E-mail Número do cartão de crédito
1 Janet Jones Feminino 21-07-1980 NULL Lote da Primeira Rua nº 4 Mala Privada 0759 253 542 janetjones@yagoo.cm NULL
2 Janete Smith Jones Feminino 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Robert Phil Masculino 12-07-1989 NULL Rua 3 34 NULL 12345 rm@tstreet.com NULL
4 Gloria Williams Feminino 14-02-1984 NULL Rua 2 23 NULL NULL NULL NULL
5 Leonardo Hofstadter Masculino NULL NULL crista de madeira NULL 845738767 NULL NULL
6 Sheldon Cooper Masculino NULL NULL crista de madeira NULL 976736763 NULL NULL
7 Rajesh Koothrappali Masculino NULL NULL crista de madeira NULL 938867763 NULL NULL
8 Leslie Winkle Masculino 14-02-1984 NULL crista de madeira NULL 987636553 NULL NULL
9 Howard Wolowitz Masculino 24-08-1981 NULL Parque Sul Caixa postal 4563 987786553 lwolowitz[at]email.me NULL

Apenas 9 membros foram retornados, porque N na cláusula LIMIT é maior que o número de registros na tabela. Solicitar explicitamente 9 linhas produz o mesmo conjunto de resultados.

SELECT * FROM members LIMIT 9;

💡 Dica: LIMIT seleciona linhas de qualquer ordem em que o servidor as produza. Adicione um ORDENAR POR cláusula sempre que a identidade das filas for importante, caso contrário, “os 10 primeiros membros” não garante que se refiram às mesmas nove pessoas duas vezes.

Limitar o número de linhas é a primeira parte da funcionalidade. Escolher onde a janela começa é a segunda.

Utilizando o valor OFFSET na consulta LIMIT

O DESVIO O parâmetro `value` é usado com mais frequência em conjunto com a palavra-chave `LIMIT`. Ele especifica a partir de qual linha o servidor começa a recuperar os dados, de modo que as linhas anteriores a esse ponto são ignoradas.

Suponha que desejamos um número limitado de membros a partir do meio da tabela. O script abaixo começa na segunda linha e limita o resultado a dois registros.

SELECT * FROM `members` LIMIT 1, 2;

Executando-o em MySQL Workbench A consulta ao banco de dados myflixdb produz o seguinte resultado.

número de membro nomes completos gênero data_de_nascimento data_de_registro endereço físico endereço postal número de contato E-mail Número do cartão de crédito
2 Janete Smith Jones Feminino 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Robert Phil Masculino 12-07-1989 NULL Rua 3 34 NULL 12345 rm@tstreet.com NULL

Observe que aqui DESLOCAMENTO = 1, portanto, a linha nº 2 é a primeira linha retornada, e LIMITE = 2Consequentemente, apenas 2 registros são retornados.

Na forma de dois argumentos, o deslocamento é escrito primeiro e a contagem de linhas em segundo lugar, o que é fácil de inverter acidentalmente. MySQL Também aceita uma forma explícita que elimina a ambiguidade, e é essa que deve ser preferida em novos códigos.

SELECT * FROM `members` LIMIT 2 OFFSET 1;

Ambas as instruções retornam as mesmas duas linhas. Com o deslocamento compreendido, o padrão de paginação do qual todas as telas de listagem dependem decorre diretamente disso.

Como paginar resultados de consulta com LIMIT e OFFSET

A paginação divide um grande conjunto de resultados em páginas numeradas, e as funções LIMIT e OFFSET são o mecanismo que realiza essa tarefa. Dois valores controlam cada solicitação de página: o tamanho da página, que indica quantos registros aparecem em uma tela, e o número da página solicitada pelo usuário.

O deslocamento é derivado deles com uma única fórmula.

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

A página 2 mantém o mesmo limite e avança o deslocamento em um tamanho de página.

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

Três regras mantêm uma listagem paginada correta e rápida.

  1. Sempre classificar: Uma consulta paginada sem ORDER BY pode mostrar o mesmo registro em duas páginas diferentes e ocultar completamente outro, porque o servidor tem liberdade para alterar a ordem das linhas entre as chamadas.
  2. Classificar por uma coluna única: Empates na coluna de classificação deixam a ordem das linhas empatadas indefinida. Classificar pela chave primária ou adicioná-la como critério de desempate resolve o problema.
  3. Veja as páginas detalhadas: DESLOCAMENTO 100000 forças MySQL Ler cem mil linhas e descartá-las antes de retornar as próximas vinte. O tempo de resposta aumenta com o número da página.

Para paginação muito profunda, a paginação por conjunto de chaves evita completamente o deslocamento. Em vez de contar as linhas a serem ignoradas, a consulta memoriza a última chave da página anterior e solicita as linhas subsequentes.

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

Este formato mantém a velocidade em qualquer profundidade, porque o índice salta diretamente para a chave inicial em vez de percorrer as linhas anteriores. A desvantagem é que as páginas devem ser percorridas em sequência, então o saltoping Não é mais possível acessar diretamente a página 500.

LIMITE em MySQL vs TOP e FETCH FIRST

LIMIT não faz parte de todos os dialetos SQL, o que é importante quando uma consulta precisa ser transferida entre mecanismos de banco de dados. MySQL, PostgreSQL e SQLite compartilhar a palavra-chave LIMIT. O SQL Server usa TOP e Oracle usa a cláusula padrão FETCH FIRST. A tabela abaixo compara as três.

Cláusula Motor Exemplo Pula linhas
LIMITE … DESLOCAMENTO MySQL, PostgreSQL, SQLite SELECIONE * DE membros LIMITADO A 20 DESLOCAMENTO A 40; Sim, com DESLOCAMENTO
TOPO SQL Server SELECIONE OS 20 MELHORES * membros; Não, OFFSET… FETCH é necessário.
BUSCAR PRIMEIRO Oracle, Db2, SQL padrão SELECT * FROM members FETCH FIRST 20 ROWS ONLY; Sim, com DESLOCAMENTO… LINHAS

O comportamento é o mesmo em todos os casos: limitar o número de linhas e, opcionalmente, ignorar algumas linhas inicialmente. Apenas a grafia muda. Portanto, uma consulta que precisa ser executada em mais de um mecanismo de busca deve isolar a cláusula de limitação de linhas em vez de espalhá-la pelo código.

Perguntas Frequentes

Sim. Ambos aceitam uma contagem de linhas simples, como por exemplo: EXCLUIR FROM members LIMIT 10. O formato de deslocamento com dois argumentos não é permitido nesse caso, portanto, apenas o número de linhas afetadas pode ser limitado.

O deslocamento começa em zero, portanto, DESLOCAMENTO 0 inicia na primeira linha e DESLOCAMENTO 1 inicia na segunda. A contagem de linhas em si é uma quantidade simples e é lida como um número normal.

Execute uma consulta SELECT COUNT(*) separada com a mesma cláusula WHERE, mas sem LIMIT. A contagem informa ao aplicativo quantas páginas existem, enquanto a consulta LIMIT retorna as linhas da página atual.

Muitas vezes, sim. Assistentes de IA integrados em clientes como MySQL Workbench Reescreva uma consulta OFFSET em uma cláusula WHERE com base na última chave vista. Confirme se a coluna de classificação é única e indexada antes de confiar na reescrita.

Porque a instrução gerada geralmente omite a cláusula ORDER BY. Sem uma ordenação explícita, MySQL pode retornar as linhas em qualquer ordem, portanto, o mesmo LIMIT pode produzir uma amostra diferente a cada execução. Adicione a ordenação você mesmo.

Resuma esta postagem com: