Занятие 06. Ограничение выборки. Выбор уникальных значений
⚡ Кратко: суть темы
Занятие учит управлять объёмом и порядком возвращаемых строк. Разбираем сортировку 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:
SELECT DISTINCT— выбирает и уникализирует столбцы.FROM— указывает таблицу.WHERE— фильтрует строки.ORDER BY— сортирует результат.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.