JavaRush /Курсы /SQL SELF /Типичные ошибки при сортировке и форматировании данных

Типичные ошибки при сортировке и форматировании данных

SQL SELF
6 уровень , 4 лекция
Открыта

Сортировка и форматирование — это логично и полезно. Но иногда можно случайно запутаться и получить неожиданные результаты. Давайте вместе разберём самые частые ошибки, чтобы ваши данные всегда выглядели идеально и шли в правильном порядке!

1. Сортировка данных разных типов

Представьте себе ситуацию: вы сортируете таблицу по столбцу, который содержит смесь чисел и строк. PostgreSQL, конечно, постарается вам помочь, но результат может вас удивить. Например у вас есть таблица, где value - текст:

id value
1 10
2 2
3 apple
4 20

И вы пишите запрос:

SELECT *
FROM mixed_data 
ORDER BY value;

Ожидаемый результат? Может быть: 2, 10, 20, apple? Нет, PostgreSQL сортирует строки на основе их лексикографического/алфавитного порядка, и результат будет: 10, 2, 20, apple.

Как избежать ошибки?

Если вы знаете, что ваш текстовый столбец содержит числовые данные, явно преобразуйте их в число перед сортировкой:

SELECT * FROM mixed_data ORDER BY value::INT;

Теперь результат будет: 2, 10, 20.

Но будь осторожен: если в вашем столбце окажутся строки, которые нельзя преобразовать в числа, запрос выдаст ошибку!

2. Указание нескольких столбцов для сортировки

Одна из типичных ошибок — забыть о порядке приоритетов при сортировке по нескольким столбцам. Например, если вы хотите отсортировать студентов по фамилии, а затем по возрасту, но перепутали порядок:

id last_name age
1 Lin 18
2 Lin 20
3 Song 19

Ваш запрос:

-- Неправильная сортировка
SELECT * 
FROM students 
ORDER BY age, last_name;

Результат:

id last_name age
1 Lin 18
3 Song 19
2 Lin 20

В данном случае PostgreSQL сначала отсортирует студентов по возрасту, а потом по фамилии. Не совсем то, чего вы хотели, правда?

Правильный запрос:

SELECT *
FROM students 
ORDER BY last_name, age;

Результат:

id last_name age
1 Lin 18
2 Lin 20
3 Song 19

Теперь сортировка сначала идёт по фамилии, а внутри фамилии — по возрасту. Именно то, что ожидалось!

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

Иногда требуется применить одновременную сортировку с разными направлениями для столбцов. Например, отсортировать товары по категории (по возрастанию), а в рамках каждой категории — по цене (по убыванию). Ошибка возникает, если забыть указать направление для второго столбца:

id category price
1 Electronics 99.99
2 Electronics 199.99
3 Furniture 299.99
4 Furniture 199.99

Ваш запрос:

-- Неправильная сортировка
SELECT * 
FROM products 
ORDER BY category, price;

Результат: цены внутри категорий отсортированы по возрастанию, а вы, возможно, хотели по убыванию.

Правильный запрос:

SELECT *
FROM products 
ORDER BY category ASC, price DESC;

Ошибки при форматировании

4. Неправильное использование CONCAT()

Допустим, вы хотите объединить имя и фамилию в одну строку, но в спешке забыли добавить разделитель между ними:

id first_name last_name
1 John Doe
2 Jane Smith

Ваш запрос:

SELECT
    CONCAT(first_name, last_name) AS full_name 
FROM employees;

Результат:

full_name
JohnDoe
JaneSmith

Как исправить?

Добавьте пробел между именем и фамилией:

SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;

Теперь всё будет выглядеть гораздо красивее:

full_name
John Doe
Jane Smith

5. Ошибки при использовании CAST()

Допустим, вы пытаетесь преобразовать дату в строку для красивого вывода, но забыли указать формат:

id event_date
1 2023-01-15

Ваш запрос:

-- Неправильное преобразование
SELECT 
    CAST(event_date AS TEXT) 
FROM events;

Результат: дата будет преобразована в формат YYYY-MM-DD, что не всегда удобно для ваших пользователей.

Как исправить?

Используйте функцию TO_CHAR() для указания формата:

SELECT
    TO_CHAR(event_date, 'DD-MM-YYYY') AS formatted_date 
FROM events;

Теперь дата будет отображаться в формате 15-01-2023.

6. Ошибки при использовании DISTINCT

DISTINCT — мощный инструмент для извлечения уникальных значений, но иногда он используется неправильно. Например, вы хотите получить список уникальных имён сотрудников:

SELECT DISTINCT first_name, last_name
FROM employees;

На первый взгляд, запрос выглядит корректно, но если у двух сотрудников одинаковые имена и фамилии, они будут отображаться как один результат, даже если это разные люди.

Пример данных:

id first_name last_name
1 Alex Lin
2 Maria Chi
3 Alex Lin

Результат запроса:

first_name last_name
Alex Lin
Maria Chi

Как избежать ошибки?

Если вам действительно нужны уникальные люди (а не строки таблицы), выбирайте по тому набору колонок, по которому хотите различать записи. Например, через GROUP BY:

SELECT first_name, last_name
FROM employees
GROUP BY first_name, last_name;

Использовать DISTINCT ON (id), где id — это первичный ключ, бессмысленно: PK уже уникален, поэтому такой запрос вернёт все строки, как обычный SELECT. Запомните: DISTINCT всегда работает по всем колонкам в SELECT — это семантика, а не баг.

Результат запроса с DISTINCT ON (id) (вернёт все строки таблицы):

id first_name last_name
1 Alex Lin
2 Maria Chi
3 Alex Lin

Как избежать ошибок?

Работа с данными требует внимательности к деталям. Чтобы избежать описанных выше ошибок:

Проверяйте типы данных: убедитесь, что используемые функции поддерживают типы данных ваших столбцов.

Проверяйте порядок сортировки: убедитесь, что столбцы указаны в правильном порядке. Не забывайте о направлениях сортировки ASC, DESC.

Тестируйте запросы на небольших выборках данных: это поможет выявить ошибки на ранних этапах.

Не забывайте про документацию PostgreSQL: она поможет ответить на сложные вопросы о функциях и их использовании. Вот ссылочка: оф. документация PostgreSQL.

Теперь вы готовы бороться с любыми загадками, связанными с форматированием и сортировкой! Двигаемся дальше.

2
Задача
SQL SELF, 6 уровень, 4 лекция
Недоступна
Форматирование строки с разделителем
Форматирование строки с разделителем
2
Задача
SQL SELF, 6 уровень, 4 лекция
Недоступна
Сортировка по нескольким столбцам с разными направлениями
Сортировка по нескольким столбцам с разными направлениями
1
Опрос
Извлечение уникальных значений, 6 уровень, 4 лекция
Недоступен
Извлечение уникальных значений
Извлечение уникальных значений
Комментарии (9)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Euraks Уровень 24
2 июня 2026
🦔
Anemon Уровень 13 Expert
9 августа 2025
🤓
Евгений Уровень 57 Expert
17 июля 2025
Во второй задаче есть баг в комплияторе. Написал сортировку без явного указания ASC (да, это ошибка по заданию, но на результат влиять не должно):

select *
from products
order by category, price DESC;
Результат вышел неправильный:

id	category	price
1	Electronics	99.99
2	Electronics	199.99
4	Furniture	199.99
3	Furniture	299.99
Я уж думал, что у меня крыша едет, но проверил локально на своей базе, и запрос работает правильно. А в компиляторе без указания ASC для категории почему-то он неправильно сортирует по ценам.
Евгений Уровень 61
1 июля 2025
По пункту 6. Есть мнение, что DISTINCT ON (первичный ключ) равнозначно отсутствию DISTINCT
Вячеслав Уровень 10
3 июля 2025
по логике точно получается так)) первичный ключ должен быть уникален, поэтому вернёт всю таблицу
Игорь Уровень 14
19 июня 2025
Почему-то в первой задаче не принимается решение с CONCAT, только с ||. Хотя в условиях задания сказано что можно использовать и то и то...
Артем Ювелиров Уровень 15
21 июня 2025
на самом деле это курс по ручному тестированию)😁
Вячеслав Уровень 10
3 июля 2025
ахах, точно) замаскированный под курс по SQL)))
Вячеслав Уровень 10
3 июля 2025
Игорь, а в комментарии в окне кода для кого только палки нарисованы?))) *сарказм*