← К оглавлению занятия

Занятие 06. Ограничение выборки. Выбор уникальных значений

📁 Блок: SQL / MySQL ⏱️ Время изучения: ~60 мин 🎯 Сложность: Начальная
#order #by #limit #offset #distinct #select

⚡ Кратко: суть темы

Занятие учит управлять объёмом и порядком возвращаемых строк. Разбираем сортировку ORDER BY, ограничение выборки LIMIT, пропуск строк OFFSET и удаление дубликатов DISTINCT.

  • ORDER BY column [ASC|DESC] — задаёт порядок строк.
  • LIMIT n возвращает не более n строк; OFFSET m пропускает первые m строк.
  • SELECT DISTINCT column возвращает только уникальные значения.

Что запомнить: порядок операторов — SELECT → DISTINCT → FROM → WHERE → ORDER BY → LIMIT → OFFSET.

Частая ошибка: использовать LIMIT без ORDER BY и ожидать предсказуемый порядок строк.

📖 Сортировка результатов: ORDER BY

Оператор ORDER BY задаёт порядок строк в результирующей таблице. Без него СУБД возвращает строки в том порядке, в котором их удобнее всего прочитать — обычно это порядок физического хранения, но он не гарантирован.

SELECT product_name, standard_cost
FROM products
ORDER BY standard_cost DESC;
  • ASC — по возрастанию (по умолчанию).
  • DESC — по убыванию.
  • Можно перечислять несколько столбцов: сначала сортируется по первому, а внутри одинаковых значений — по второму.
SELECT company, city
FROM customers
ORDER BY company ASC, city ASC;

Проверить по документации: в стандарте SQL NULL считается неопределённым значением. В PostgreSQL NULL идёт последним при ORDER BY ... ASC, а в MySQL — первым. Поведение можно явно задать через NULLS FIRST / NULLS LAST в PostgreSQL.

📖 Ограничение выборки: LIMIT

LIMIT возвращает не более указанного количества строк. Обычно используется вместе с ORDER BY, иначе «первые N строк» будут непредсказуемы.

SELECT product_name, standard_cost
FROM products
ORDER BY standard_cost ASC
LIMIT 5;

Альтернативный синтаксис в других СУБД:

  • SQL Server: SELECT TOP 5 ...
  • Oracle: ROWNUM <= 5 или FETCH FIRST 5 ROWS ONLY (стандарт SQL:2008).
  • PostgreSQL: поддерживает и LIMIT, и FETCH FIRST.

📖 Пропуск строк: OFFSET

OFFSET пропускает указанное количество строк от начала результата. Вместе с LIMIT реализует постраничный вывод — пагинацию.

SELECT product_name
FROM products
ORDER BY product_name ASC
LIMIT 10 OFFSET 10;

Этот запрос вернёт строки со 11-й по 20-ю, если считать с 1. Важно: OFFSET 10 пропускает первые 10 строк.

Проверить по документации: для больших OFFSET производительность падает — СУБД всё равно считывает и сортирует строки, а потом отбрасывает часть. В продакшене часто используют «ключевую пагинацию» по индексированному столбцу.

📖 Уникальные значения: DISTINCT

DISTINCT удаляет повторяющиеся строки из результата. Его удобно использовать, чтобы быстро посмотреть, какие значения вообще встречаются в столбце.

SELECT DISTINCT city
FROM customers;

Если указать несколько столбцов, уникальной считается комбинация значений:

SELECT DISTINCT city, country_region
FROM customers;

📖 Комбинирование операторов

Операторы можно комбинировать в одном запросе. Порядок выполнения в MySQL:

  1. SELECT DISTINCT — выбирает и уникализирует столбцы.
  2. FROM — указывает таблицу.
  3. WHERE — фильтрует строки.
  4. ORDER BY — сортирует результат.
  5. LIMIT / OFFSET — оставляет нужный диапазон строк.
SELECT DISTINCT city
FROM customers
ORDER BY city ASC
LIMIT 3 OFFSET 2;

✨ Современные практики

  • Всегда добавляйте ORDER BY, если используете LIMIT — иначе результат не детерминирован.
  • Для пагинации больших таблиц предпочитайте пагинацию по индексированному ключу вместо больших OFFSET.
  • DISTINCT — не замена GROUP BY с агрегатами: если нужно считать количество, используйте GROUP BY и COUNT.