← Назад к вопросам

Как отсортировать выборку в SQL

1.3 Junior🔥 271 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Сортировка выборки в SQL

Основной синтаксис: ORDER BY

Для сортировки результатов SELECT запроса используется клауза ORDER BY. Это один из самых важных компонентов SQL для управления порядком вывода данных.

1. Базовая сортировка - ORDER BY

1.1 Сортировка по одному столбцу (по возрастанию)

-- Сортировка по возрастанию (по умолчанию ASC)
SELECT id, name, salary
FROM employees
ORDER BY salary;

-- Явное указание ASC
SELECT id, name, salary
FROM employees
ORDER BY salary ASC;

1.2 Сортировка по убыванию

-- DESC - сортировка по убыванию
SELECT id, name, salary
FROM employees
ORDER BY salary DESC;

-- Найти самого высокооплачиваемого сотрудника
SELECT TOP 1 id, name, salary
FROM employees
ORDER BY salary DESC;

2. Сортировка по нескольким столбцам

2.1 Многоуровневая сортировка

-- Сортировка сначала по отделу, потом по зарплате (убыванию)
SELECT id, name, department, salary
FROM employees
ORDER BY department ASC, salary DESC;

-- Результат:
-- department | name       | salary
-- IT         | John       | 5000
-- IT         | Alice      | 4500
-- HR         | Bob        | 3500
-- HR         | Carol      | 3000

2.2 Разные направления для каждого столбца

-- Сортировать по году (убыванию), потом по месяцу (возрастанию)
SELECT year, month, revenue
FROM sales
ORDER BY year DESC, month ASC;

3. Сортировка по выражениям и вычисляемым полям

3.1 Сортировка по результату выражения

-- Сортировка по полной зарплате (base + bonus)
SELECT id, name, base_salary, bonus
FROM employees
ORDER BY base_salary + bonus DESC;

-- Сортировка по длине имени
SELECT id, name, email
FROM users
ORDER BY LENGTH(name) DESC;

3.2 Сортировка по alias

-- Сортировка по alias столбца
SELECT id, name, salary * 12 AS annual_salary
FROM employees
ORDER BY annual_salary DESC;

4. Сортировка текстовых данных

4.1 Сортировка строк

-- Сортировка по алфавиту
SELECT id, name, email
FROM users
ORDER BY name ASC;

-- Сортировка по убыванию (обратный алфавит)
SELECT id, name
FROM products
ORDER BY name DESC;

4.2 Case-sensitive сортировка

-- В PostgreSQL: case-sensitive сортировка
SELECT name
FROM items
ORDER BY name COLLATE "C";

-- В MySQL: case-insensitive
SELECT name
FROM items
ORDER BY name COLLATE utf8_general_ci;

5. Сортировка дат и времени

5.1 Сортировка дат

-- Сортировка по дате (новые первыми)
SELECT id, title, created_at
FROM posts
ORDER BY created_at DESC;

-- Сортировка по году, потом по месяцу
SELECT id, title, created_at
FROM posts
ORDER BY YEAR(created_at) DESC, MONTH(created_at) ASC;

5.2 Сортировка по интервалам времени

-- Сортировка по часам
SELECT id, event_time
FROM events
ORDER BY HOUR(event_time) DESC;

-- Сортировка по дате + время
SELECT id, timestamp
FROM logs
ORDER BY timestamp DESC;

6. Специальные случаи сортировки

6.1 Сортировка NULL значений

-- По умолчанию NULL идет первым (в большинстве СУБД)
SELECT id, name, phone
FROM contacts
ORDER BY phone ASC;

-- Поместить NULL в конец (PostgreSQL)
SELECT id, name, phone
FROM contacts
ORDER BY phone ASC NULLS LAST;

-- Поместить NULL в начало (PostgreSQL)
SELECT id, name, phone
FROM contacts
ORDER BY phone ASC NULLS FIRST;

-- MySQL: использовать CASE
SELECT id, name, phone
FROM contacts
ORDER BY CASE WHEN phone IS NULL THEN 1 ELSE 0 END, phone ASC;

6.2 Сортировка с CASE выражением

-- Сортировка по кастомному порядку
SELECT id, status, name
FROM orders
ORDER BY CASE status
    WHEN 'urgent' THEN 1
    WHEN 'normal' THEN 2
    WHEN 'low' THEN 3
    ELSE 4
END;

-- Результат: urgent, normal, low, прочие

7. Сортировка с OFFSET и LIMIT

7.1 Пагинация

-- Получить страницу 2 (по 10 элементов)
SELECT id, name, email
FROM users
ORDER BY id DESC
LIMIT 10 OFFSET 10;

-- SQL Server синтаксис
SELECT id, name, email
FROM users
ORDER BY id DESC
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;

8. Сортировка с функциями окна

8.1 ROW_NUMBER с сортировкой

-- Ранжирование с сортировкой
SELECT id, name, salary,
       ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
FROM employees;

-- С партиционированием
SELECT id, name, salary, department,
       ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;

9. Сортировка в JOIN запросах

9.1 Сортировка объединенных таблиц

-- Сортировка результата JOIN
SELECT e.id, e.name, d.department_name, e.salary
FROM employees e
JOIN departments d ON e.department_id = d.id
ORDER BY d.department_name ASC, e.salary DESC;

-- Сортировка по полю из одной таблицы
SELECT e.id, e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id
ORDER BY COALESCE(d.department_name, 'Unknown') ASC;

10. Оптимизация сортировки

10.1 Создание индекса для сортировки

-- Создать индекс для быстрой сортировки
CREATE INDEX idx_employees_salary ON employees(salary DESC);

-- Составной индекс для многоуровневой сортировки
CREATE INDEX idx_orders_status_date ON orders(status ASC, order_date DESC);

10.2 EXPLAIN для анализа

-- Проверить план выполнения
EXPLAIN
SELECT id, name, salary
FROM employees
ORDER BY salary DESC
LIMIT 100;

11. Практические примеры в Java/Spring

11.1 Spring Data JPA

import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;

public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    // Сортировка по одному полю
    List<Employee> findAll(Sort.by("salary").descending());
    
    // Сортировка по нескольким полям
    List<Employee> findAll(
        Sort.by("department").ascending()
            .and(Sort.by("salary").descending())
    );
}

@Service
public class EmployeeService {
    private final EmployeeRepository repository;
    
    public List<Employee> getSortedEmployees() {
        // Сортировка по зарплате убыванию
        Sort sort = Sort.by(Sort.Direction.DESC, "salary");
        return repository.findAll(sort);
    }
    
    public List<Employee> getMultipleSorted() {
        Sort sort = Sort.by("department").ascending()
                       .and(Sort.by("salary").descending());
        return repository.findAll(sort);
    }
}

11.2 Native SQL запрос

public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    @Query(value = "SELECT * FROM employees ORDER BY salary DESC LIMIT :limit",
           nativeQuery = true)
    List<Employee> findTopByNativeQuery(@Param("limit") int limit);
}

12. Таблица синтаксиса в разных СУБД

СУБДLIMITTOPFETCH
MySQLLIMIT--
PostgreSQLLIMIT-FETCH
SQL Server-TOPFETCH
Oracle--FETCH

Заключение

Основные моменты сортировки в SQL:

  1. ORDER BY - основной инструмент для сортировки
  2. ASC (по умолчанию) - возрастание, DESC - убывание
  3. Можно сортировать по нескольким столбцам и выражениям
  4. Индексы значительно ускоряют сортировку
  5. NULL значения требуют специальной обработки
  6. LIMIT/OFFSET для пагинации результатов
  7. Spring Data предоставляет удобный API для сортировки
Как отсортировать выборку в SQL | PrepBro