Как отобрать уникальные значения в таблице?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Получение уникальных значений в SQL
Получение уникальных (distinct) значений из таблицы - одна из базовых операций в запросах к БД.
1. DISTINCT в SELECT
Базовый синтаксис:
SELECT DISTINCT column_name FROM table_name;
Примеры:
-- Получить все уникальные города
SELECT DISTINCT city FROM users;
-- Результат: Moscow, SPB, Yekaterinburg (без дубликатов)
Несколько столбцов:
-- Уникальные комбинации город и страна
SELECT DISTINCT city, country FROM users;
ДИСТИNCT применяется ко всему SELECT списку, не к одному столбцу.
2. COUNT(DISTINCT)
Подсчёт уникальных значений:
SELECT COUNT(DISTINCT city) FROM users;
Практический пример:
-- Количество уникальных пользователей, оставивших комментарии
SELECT COUNT(DISTINCT user_id) FROM comments;
3. GROUP BY для уникальных значений
Альтернатива DISTINCT:
SELECT city FROM users GROUP BY city;
GROUP BY позволяет добавлять агрегирующие функции:
-- Города и количество пользователей в каждом
SELECT city, COUNT(*) as user_count FROM users GROUP BY city ORDER BY user_count DESC;
ДИСТИNCT это сделать не может.
4. Фильтрация уникальных значений
С условиями:
-- Уникальные города активных пользователей
SELECT DISTINCT city FROM users WHERE status = active;
С группировкой и условиями:
-- Города где есть более 10 пользователей
SELECT city, COUNT(*) as count FROM users GROUP BY city HAVING COUNT(*) > 10;
5. Производительность
На больших таблицах DISTINCT может быть медленным:
Решения:
- Добавить индекс на столбец
- Использовать WHERE для фильтрации перед DISTINCT
- GROUP BY может быть быстрее чем DISTINCT
Проверка плана выполнения:
EXPLAIN SELECT DISTINCT city FROM users;
6. Исключение NULL значений
NULL обрабатывается как отдельное значение:
SELECT DISTINCT phone FROM users;
Исключение NULL:
SELECT DISTINCT phone FROM users WHERE phone IS NOT NULL;
7. Сортировка уникальных значений
DISTINCT с ORDER BY:
SELECT DISTINCT city FROM users ORDER BY city;
При DISTINCT можно ORDER BY только по столбцам из SELECT списка.
8. Практические примеры
Пример 1: Уникальные email адреса покупателей
SELECT DISTINCT email FROM orders WHERE status = completed ORDER BY email;
Пример 2: Категории товаров, купленные в 2024 году
SELECT DISTINCT p.category FROM products p
INNER JOIN order_items oi ON p.id = oi.product_id
INNER JOIN orders o ON oi.order_id = o.id
WHERE YEAR(o.created_at) = 2024;
Пример 3: Статистика уникальных значений
SELECT
COUNT(DISTINCT user_id) as unique_users,
COUNT(DISTINCT product_id) as unique_products,
COUNT(*) as total_orders
FROM orders;
9. Когда использовать GROUP BY вместо DISTINCT
GROUP BY лучше когда:
- Нужны агрегирующие функции
- Нужны условия на агрегаты
- Нужна более сложная логика
-- Только DISTINCT
SELECT DISTINCT department FROM employees;
-- Нужна статистика - GROUP BY
SELECT department, COUNT(*), AVG(salary) FROM employees GROUP BY department;
10. Производительность и индексы
- DISTINCT требует сортировку или хеш-агрегацию
- На больших таблицах может быть медленным
- Всегда проверяй EXPLAIN план выполнения
- Добавляй индексы если DISTINCT часто используется
- GROUP BY иногда работает быстрее
Правильное использование DISTINCT критично для написания эффективных SQL запросов.