Комментарии (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. Таблица синтаксиса в разных СУБД
| СУБД | LIMIT | TOP | FETCH |
|---|---|---|---|
| MySQL | LIMIT | - | - |
| PostgreSQL | LIMIT | - | FETCH |
| SQL Server | - | TOP | FETCH |
| Oracle | - | - | FETCH |
Заключение
Основные моменты сортировки в SQL:
- ORDER BY - основной инструмент для сортировки
- ASC (по умолчанию) - возрастание, DESC - убывание
- Можно сортировать по нескольким столбцам и выражениям
- Индексы значительно ускоряют сортировку
- NULL значения требуют специальной обработки
- LIMIT/OFFSET для пагинации результатов
- Spring Data предоставляет удобный API для сортировки