Сортировка, LIMIT, DISTINCT

Управляем порядком, количеством и уникальностью строк в результате.

ORDER BY задаёт порядок строк в результате; без него база может вернуть строки в любом порядке.

ORDER BY — сортировка

Сам по себе SQL не гарантирует порядок строк. Чтобы упорядочить результат, добавляют ORDER BY столбец. По умолчанию сортировка по возрастанию (ASC); для убывания пишут DESC.

CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, price INTEGER);

INSERT INTO products (name, price) VALUES
    ('Клавиатура', 2500), ('Мышь', 1200), ('Монитор', 18000),
    ('Коврик', 600), ('Наушники', 5000);

SELECT name, price
FROM products
ORDER BY price DESC;

Вывод:

Монитор|18000
Наушники|5000
Клавиатура|2500
Мышь|1200
Коврик|600

Можно сортировать по нескольким столбцам: ORDER BY category, price DESC — сначала по категории, а внутри каждой категории по убыванию цены.

LIMIT — ограничение количества

LIMIT n возвращает не больше n строк. В связке с ORDER BY это даёт «топ-N»: например, три самых дорогих товара.

CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, price INTEGER);

INSERT INTO products (name, price) VALUES
    ('Клавиатура', 2500), ('Мышь', 1200), ('Монитор', 18000),
    ('Коврик', 600), ('Наушники', 5000);

SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 3;

Вывод:

Монитор|18000
Наушники|5000
Клавиатура|2500

OFFSET — пропуск строк

OFFSET m пропускает первые m строк. Связка LIMIT + OFFSET — основа постраничного вывода (пагинации). Возьмём «вторую страницу» по 2 товара, отсортировав по цене:

CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, price INTEGER);

INSERT INTO products (name, price) VALUES
    ('Клавиатура', 2500), ('Мышь', 1200), ('Монитор', 18000),
    ('Коврик', 600), ('Наушники', 5000);

SELECT name, price
FROM products
ORDER BY price
LIMIT 2 OFFSET 2;

Вывод:

Клавиатура|2500
Наушники|5000

Мы пропустили два самых дешёвых товара (Коврик, Мышь) и взяли следующие два.

DISTINCT — только уникальные

DISTINCT убирает дубликаты из результата. Частая задача — получить список уникальных значений столбца, например все категории без повторов.

CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, category TEXT);

INSERT INTO products (name, category) VALUES
    ('Клавиатура', 'Периферия'), ('Мышь', 'Периферия'),
    ('Монитор', 'Экраны'), ('Наушники', 'Аудио'), ('Колонки', 'Аудио');

SELECT DISTINCT category
FROM products
ORDER BY category;

Вывод:

Аудио
Периферия
Экраны

Хотя «Периферия» и «Аудио» встречались дважды, в результате каждая категория ровно один раз.

Итог

  • ORDER BY столбец [ASC|DESC] задаёт порядок; можно сортировать по нескольким столбцам.
  • LIMIT n ограничивает число строк, OFFSET m пропускает первые m — вместе дают пагинацию.
  • DISTINCT оставляет только уникальные строки результата.
Проверьте себя
1. Что вернёт ORDER BY price DESC LIMIT 3?
AТри самых дешёвых товара
BТри самых дорогих товара
CВсе товары в случайном порядке
DРовно товар №3
2. Для чего применяют связку LIMIT + OFFSET?
AДля удаления строк
BДля постраничного вывода (пагинации)
CДля сортировки по двум столбцам
DДля подсчёта строк
3. Что делает DISTINCT?
AСортирует строки
BОставляет только уникальные строки результата
CСчитает количество строк
DОграничивает число строк
Поддержать проект