Іноді бази даних нагадують людину з поганою пам’яттю — все записує, але забуває, що вже записав. В результаті ти відкриваєш таблицю з містами клієнтів, а там десять "Берлінів", п’ять "Сіетлів" і купа інших повторів. Таке буває, якщо одне й те саме місто зустрічається у різних клієнтів. Але ж ти не хочеш будувати рекламну кампанію по десяти "Берлінах", коли це всього лише одне місто, правда?
Щоб витягнути тільки унікальні значення — без дублікатів — є зручна команда 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 лише додасть зайве навантаження на СУБД.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ