Что такое `LIMIT` в SQL и как его использовать для пагинации?

Ответ

LIMIT — это SQL-оператор, который ограничивает количество строк, возвращаемых запросом. Это один из ключевых инструментов для реализации пагинации (постраничного вывода данных).

Использование для пагинации

Для пагинации LIMIT почти всегда используется в паре с оператором OFFSET, который указывает, сколько строк нужно пропустить от начала выборки.

  • LIMIT N: Вернуть первые N строк.
  • LIMIT N OFFSET M: Пропустить M строк и вернуть следующие N строк.

Например, чтобы показать 20 записей на 3-й странице:
OFFSET = (3 - 1) * 20 = 40
LIMIT = 20

SELECT * FROM products ORDER BY created_at DESC LIMIT 20 OFFSET 40;

Пример на Go (GORM)

В Go ORM, таких как GORM, для этого есть удобные методы .Limit() и .Offset().

package main

import (
    "gorm.io/gorm"
)

type User struct {
    ID   uint
    Name string
}

func GetUsersPage(db *gorm.DB, page, pageSize int) ([]User, error) {
    var users []User

    offset := (page - 1) * pageSize

    // SELECT * FROM users LIMIT pageSize OFFSET offset;
    result := db.Limit(pageSize).Offset(offset).Find(&users)

    return users, result.Error
}

Важные замечания

  1. Производительность: На больших таблицах использование OFFSET с большим значением может быть неэффективным, так как база данных все равно считывает, а затем отбрасывает все пропущенные строки. Для высоконагруженных систем предпочитают keyset/cursor-based pagination.
  2. Синтаксис: Синтаксис может отличаться в разных СУБД:
    • PostgreSQL/MySQL/SQLite: LIMIT ... OFFSET ...
    • MS SQL Server: OFFSET ... ROWS FETCH NEXT ... ROWS ONLY
    • Oracle: OFFSET ... ROWS FETCH NEXT ... ROWS ONLY (с версии 12c) или ROWNUM в старых версиях.