ORDER BY SQL: DISTINCT и LIMIT
ORDER BY SQL задаёт порядок строк в результате, DISTINCT удаляет повторяющиеся комбинации значений, а LIMIT ограничивает количество строк. Эти конструкции часто используются вместе, но решают разные задачи и применяются на разных этапах запроса.
Обновлено · Команда SQL Arena
Что потренируете
- DISTINCT для уникальных строк
- ORDER BY по одному и нескольким полям
- ASC и DESC
- LIMIT и OFFSET
- Детерминированная сортировка
Пример задачи в тренажёре
Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.
Есть отделы и сотрудники. Выведите уникальные сочетания отдела и должности: название отдела как department и должность как role. Отсортируйте сначала по отделу, затем по должности и оставьте первые пять строк.
SELECT DISTINCT d.name AS department, e.role FROM departments d JOIN employees e ON e.department_id = d.id ORDER BY department, e.role LIMIT 5;
| # | department | role |
|---|---|---|
| 1 | Analytics | Analyst |
| 2 | Analytics | Data Engineer |
| 3 | Design | Designer |
| 4 | Finance | Accountant |
Есть отделы и сотрудники. Выведите уникальные сочетания отдела и должности: название отдела как department и должность как role. Отсортируйте сначала по отделу, затем по должности и оставьте первые пять строк.
SELECT DISTINCT d.name AS department, e.role FROM departments d JOIN employees e ON e.department_id = d.id ORDER BY department, e.role LIMIT 5;
Как работают DISTINCT, ORDER BY и LIMIT
После JOIN одна должность может встретиться несколько раз. В Analytics два сотрудника имеют роль Analyst, а в Platform два сотрудника — Backend Engineer. SELECT DISTINCT d.name, e.role убирает такие повторы. Важно: DISTINCT применяется не отдельно к первой или второй колонке, а к комбинации всех выражений, перечисленных после SELECT DISTINCT. Поэтому две строки считаются одинаковыми только тогда, когда совпадают и department, и role.
ORDER BY department, e.role сортирует сначала по названию отдела, а внутри одинакового department — по должности. По умолчанию используется ASC, то есть возрастание. Для обратной сортировки можно указать DESC. Если одного поля недостаточно для однозначного порядка, добавляют второе и последующие поля. Особенно это важно вместе с LIMIT: запрос должен чётко определять, какие именно строки попадут в первые N.
LIMIT 5 применяется после сортировки результата и оставляет пять строк. Поэтому конструкция подходит для запросов вроде «вывести первые 10 строк». Но сами по себе слова «первые строки» ничего не значат без критерия порядка. SELECT ... LIMIT 10 без ORDER BY может вернуть любые десять подходящих строк, и их последовательность не гарантируется. В PostgreSQL вместо LIMIT можно также использовать стандартную форму FETCH FIRST 5 ROWS ONLY.
SELECT DISTINCT d.name AS department, e.role FROM departments d JOIN employees e ON e.department_id = d.id ORDER BY department, e.role LIMIT 5;
| department | role |
|---|---|
| Analytics | Analyst |
| Analytics | Data Engineer |
| Design | Designer |
| Finance | Accountant |
| Platform | Backend Engineer |
Ошибки с DISTINCT, ORDER BY и LIMIT
Использовать LIMIT без ORDER BY
LIMIT ограничивает число строк, но не определяет, какие строки должны считаться первыми. Если нужны самые новые, самые дорогие или первые по алфавиту записи, это правило должно быть явно задано в ORDER BY.
Считать DISTINCT способом исправить неправильный JOIN
DISTINCT действительно может скрыть повторяющиеся строки, но не исправляет ошибочную связь таблиц. Если дубли появились из-за неверного JOIN, сначала нужно исправить условие соединения, а не маскировать результат.
Забывать о равных значениях и NULL
Если несколько строк имеют одинаковое значение первого поля сортировки, их взаимный порядок без дополнительного ключа не определён. Отдельно учитывайте NULL: его положение при ASC и DESC зависит от СУБД и может явно задаваться через NULLS FIRST или NULLS LAST там, где это поддерживается.
Задачи по теме в тренажёре
Курс «SQL с нуля»DISTINCT нужен, когда результат должен содержать уникальные значения или уникальные комбинации колонок. ORDER BY отвечает только за последовательность и не удаляет повторы. LIMIT ограничивает количество уже сформированных строк, а OFFSET позволяет пропустить часть результата, например LIMIT 20 OFFSET 40. Для постраничного вывода это удобно, хотя на больших объёмах данных существуют и другие способы пагинации. В PostgreSQL можно использовать FETCH FIRST N ROWS ONLY, если нужен синтаксис, близкий к стандарту SQL. Для практики в SQL Arena есть задачи «Лекарства, которые продаются без рецепта», «Виды животных на грани исчезновения», «Типы площадок для концертов в Москве», «Палаты, где принимает Bennett», «Самый загруженный день» для ClickHouse, «ROI каждого фестиваля», «Последняя запись в группе» и «Сервис с наибольшим числом ошибок» для ClickHouse. Всего в тренажёре 1 192 задачи с автопроверкой. Бесплатно доступны 292 задачи на PostgreSQL, MySQL, ClickHouse и BigQuery.
- EasyбесплатноЛекарства, которые продаются без рецептаpostgresqlmysqlclickhouse
- EasyбесплатноВиды животных на грани исчезновенияpostgresqlmysqlclickhouse
- EasyбесплатноТипы площадок для концертов в Москвеpostgresqlmysqlclickhouse
- EasyбесплатноПалаты, где принимает Bennettpostgresqlmysqlclickhouse
- MediumPremiumСамый загруженный день (ClickHouse)clickhouse
- HardPremiumROI каждого фестиваляpostgresqlmysqlclickhouse
- ExpertPremiumПоследняя запись в группеpostgresql
- MediumPremiumСервис с наибольшим числом ошибок (ClickHouse)clickhouse
Справочник по теме
Подробные статьи с синтаксисом и примерами в справочнике SQL Arena.
Частые вопросы
Как работает ORDER BY в SQL?
ORDER BY сортирует итоговые строки по одному или нескольким выражениям. ASC задаёт порядок по возрастанию, DESC — по убыванию. Если значения первого ключа совпадают, можно добавить второй ключ сортировки.
Что делает DISTINCT в SQL?
SELECT DISTINCT удаляет повторяющиеся строки из результата. Если после DISTINCT перечислено несколько колонок, уникальность определяется по всей их комбинации, а не по каждой колонке отдельно.
Как в SQL вывести первые 10 строк?
В PostgreSQL часто используют ORDER BY ... LIMIT 10. ORDER BY нужен, если важно, какие именно записи считаются первыми. Без сортировки база не гарантирует определённый порядок строк.
Как в SQL ограничить количество строк?
В PostgreSQL можно использовать LIMIT N или FETCH FIRST N ROWS ONLY. Для пропуска строк есть OFFSET. Если ограничение используется для топ-N выборки, сначала задайте корректный ORDER BY.
Закрепите сортировку на задачах
Попробуйте запросы, где нужно самостоятельно выбрать DISTINCT, несколько полей ORDER BY или ограничение результата. Бесплатные задачи запускаются прямо в браузере.
Практиковать ORDER BY