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
Недоступний
Витяг унікальних значень
Витяг унікальних значень
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ