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.

Тепер ти готовий боротися з будь-якими загадками, пов'язаними з форматуванням і сортуванням! Рухаємось далі.

1
Опитування
Витяг унікальних значень, рівень 6, лекція 4
Недоступний
Витяг унікальних значень
Витяг унікальних значень
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ