JavaRush /Курси /SQL SELF /Витягування унікальних значень з DISTINCT

Витягування унікальних значень з DISTINCT

SQL SELF
Рівень 6 , Лекція 1
Відкрита

Іноді бази даних нагадують людину з поганою пам’яттю — все записує, але забуває, що вже записав. В результаті ти відкриваєш таблицю з містами клієнтів, а там десять "Берлінів", п’ять "Сіетлів" і купа інших повторів. Таке буває, якщо одне й те саме місто зустрічається у різних клієнтів. Але ж ти не хочеш будувати рекламну кампанію по десяти "Берлінах", коли це всього лише одне місто, правда?

Щоб витягнути тільки унікальні значення — без дублікатів — є зручна команда DISTINCT. Вона як чарівна швабра: одним рухом прибирає повторювані рядки і залишає тільки те, що реально відрізняється.

DISTINCT дозволяє витягувати тільки унікальні рядки з результату запиту. Це корисно в ситуаціях, коли треба позбутися повторюваних даних, наприклад:

  • Унікальні товари в замовленнях.
  • Унікальні імена клієнтів.
  • Унікальні комбінації даних, наприклад "місто + країна".

Як працює DISTINCT?

Синтаксис DISTINCT простий і зрозумілий, як це часто буває з SQL:

SELECT DISTINCT колонка1, колонка2, ...
FROM таблиця;

Коли ти додаєш DISTINCT у запит, база даних гарантує, що кожен рядок у результаті буде унікальним.

Приклади використання DISTINCT

Почнемо з класичних прикладів, щоб зрозуміти, як працює DISTINCT.

Приклад 1: Унікальні значення одного стовпця

Нехай у нас є таблиця students з даними про студентів:

-- Таблиця students

id first_name last_name city
1 Maria Chi Seattle
2 Alex Lin Toronto
3 Anna Song Seattle
4 Nat Cole Chicago
5 Maria Chi Seattle

Ми хочемо дізнатися, з яких міст приїжджають студенти. Пишемо запит

SELECT city
FROM students;

і отримуємо результат:

city
Seattle
Toronto
Seattle
Chicago
Seattle

Трохи не те, що ми хотіли :(

Щоб прибрати дублікати треба використати DISTINCT:

SELECT DISTINCT city
FROM students;

Результат:

city
Seattle
Toronto
Chicago

Без DISTINCT у результаті ми побачимо повторення "Seattle" тричі, а нам треба було лише по одному разу.

Приклад 2: Унікальні значення кількох стовпців

Тепер уявімо, що ми хочемо отримати унікальні комбінації "ім’я + прізвище", бо серед студентів можуть бути однофамільці чи люди з однаковими іменами.

Нехай у нас є та ж таблиця students:

-- Таблиця students

id first_name last_name city
1 Maria Chi Seattle
2 Alex Lin Toronto
3 Anna Song Seattle
4 Nat Cole Chicago
5 Maria Chi Seattle

Запит:

SELECT DISTINCT first_name, last_name
FROM students;

Результат:

first_name last_name
Maria Chi
Alex Lin
Anna Song
Nat Cole

Таким чином, DISTINCT працює як фільтр: він враховує всі вказані стовпці і виключає повтори тільки тих рядків, де значення всіх цих стовпців співпадають.

Приклад 3: Унікальні комбінації і сортування

Тепер ми комбінуємо DISTINCT з сортуванням ORDER BY, щоб отримати унікальні значення, впорядковані в алфавітному порядку за прізвищем.

Нехай у нас є таблиця students:

-- Таблиця students

id first_name last_name city
1 Maria Chi Seattle
2 Alex Lin Toronto
3 Anna Song Seattle
4 Nat Cole Chicago
5 Maria Chi Seattle

Запит:

SELECT DISTINCT first_name, last_name
FROM students
ORDER BY last_name ASC;

Результат:

first_name last_name
Maria Chi
Nat Cole
Alex Lin
Anna Song

Дублікати рядків видалені, а прізвища відсортовані по алфавіту.

Приклад 4: Використання на агрегаціях

Що, якщо ми спробуємо застосувати DISTINCT до функції, наприклад, COUNT?

SELECT COUNT(DISTINCT city) AS unique_city_count
FROM students;

Результат:

unique_city_count
3

Цей запит поверне кількість унікальних міст. Зручно, правда?

Особливості роботи DISTINCT

При використанні DISTINCT важливо розуміти, що він працює по всіх вказаних стовпцях. Якщо ти додаси більше стовпців у запит, результат може змінитися.

Приклад 5: Чому так важливо розуміти контекст?

Якщо ти додаси у запит додаткові поля, це може вплинути на унікальність рядків.

SELECT DISTINCT first_name, city
FROM students;

Таблиця students:

id first_name last_name city
1 Maria Chi Seattle
2 Alex Lin Austin
3 Anna Song Seattle
4 Otto Art Denver
5 Maria Chi Portland

Результат:

first_name city
Maria Seattle
Alex Austin
Anna Seattle
Otto Denver
Maria Portland

Кожна комбінація "ім’я + місто" тепер унікальна. Тому пам’ятай: унікальність визначається всіма вказаними стовпцями, а не кожним окремо.

Типові помилки при роботі з DISTINCT

Одна з найпоширеніших помилок при використанні DISTINCT — неправильне розуміння того, що саме робить запит. Наприклад, якщо у запиті вказати забагато стовпців, ти можеш отримати результат, який далекий від очікуваного, бо унікальність буде визначатися по всіх стовпцях.

Наприклад:

SELECT DISTINCT *
FROM students;

У цьому випадку кожен рядок буде вважатися унікальним, бо всі стовпці враховуються.

Ще одна помилка — використовувати DISTINCT там, де він не потрібен. Якщо ти впевнений, що дані вже унікальні (наприклад, стовпець, який є первинним ключем), то DISTINCT лише додасть зайве навантаження на СУБД.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ