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

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

Добавьте первичный ключ, чтобы гарантировать уникальность:

SELECT DISTINCT ON (id) first_name, last_name
FROM employees;

Результат запроса с 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 лекция
Недоступен
Извлечение уникальных значений
Извлечение уникальных значений
Комментарии (8)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anemon Уровень 13 Expert
9 августа 2025
🤓
Евгений Уровень 49 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 для категории почему-то он неправильно сортирует по ценам.
Евгений Уровень 39
1 июля 2025
По пункту 6. Есть мнение, что DISTINCT ON (первичный ключ) равнозначно отсутствию DISTINCT
Вячеслав Уровень 10
3 июля 2025
по логике точно получается так)) первичный ключ должен быть уникален, поэтому вернёт всю таблицу
Игорь Уровень 14
19 июня 2025
Почему-то в первой задаче не принимается решение с CONCAT, только с ||. Хотя в условиях задания сказано что можно использовать и то и то...
Артем Ювелиров Уровень 15
21 июня 2025
на самом деле это курс по ручному тестированию)😁
Вячеслав Уровень 10
3 июля 2025
ахах, точно) замаскированный под курс по SQL)))
Вячеслав Уровень 10
3 июля 2025
Игорь, а в комментарии в окне кода для кого только палки нарисованы?))) *сарказм*