Загрузка...
Думаю следует начать с того, что SQL является стандартом, например: ANSI SQL 89, ANSI SQL 92 и т.д., которого придерживаются как Microsoft в его реализации Transact SQL или сокращённо TSQL, так и компания Oracle.
Поэтому освоив работу DISTINCT в диалекте MySQL, трудностей в других СУБД, думаю, не возникнет.
Как уже было опомянуто, все эксперименты по DISTINCT будут проводиться в СУБД MySQL:
Для экспериментов создана простая таблица с несколькими писателями и она будет приложена в виде ссылки на zip-архив в конце страницы.
1 - Рассмотрим первый вариант использования DISTINCT - это тот случай, когда он относится к клаузуле SELECT, сразу хотелось бы сказать, что DISTINCT является противоположностью ALL, например:
SELECT * FROM table И SELECT ALL * FROM table - выдадут совершенно одинаковый результат, т.е. запросы совершенно одинковые. ALL - параметр не обязательный, но даже если его не указывать, то он есть всегда, за исключением тех случаев, когда используется DISTINCT.
SELECT использованием ALL:
SELECT без использования ALL:
Для последующих экспериментов не будет из пользоваться звёздочка в SELECT, а только два поля: name, lastname:
Обратите внимание, в полученном результате довольно-таки много избыточной информации.
Теперь изменим запрос, добавив в него DISTINCT и проверим результат:
Результат: DISTINCT - удалил повторяющиеся строки и оставил уникальные комбинации имён и фамилий. Т.е. DISTINCT пишется перед первой колонкой или перед звёздочкой и относится ко всей строке, его не надо писать перед каждой колонкой - это будет ошибкой и запрос не выполнится, например:
Запрос завершился с ошибкой: ERROR 1064 (42000)
Вывод: DISTINCT, который относится к самому SELECT всегда пишется только один раз и всегда между клаузулой SELECT и первым полем или перед звёздочкой, но в случае звёздочки скорее всего будет бесполезен!
2-й вариант использования DISTINCT - это его использование в аггрегатных функция, для примера рассмотрим функцию COUNT:
SELECT
COUNT(*) AS cnt_all
, COUNT(DISTINCT name, lastname) AS cnt_unique_nl
, COUNT(DISTINCT name) AS cnt_unique_name
, COUNT(DISTINCT lastname) AS cnt_unique_lastname
FROM writers;
COUNT(*) AS cnt_all - количество всех строк/записей в таблице
COUNT(DISTINCT name, lastname) AS cnt_unique_nl - количество уникальных комбинаций: имя фамилия. DISTINCT убирает дубли.
COUNT(DISTINCT name) AS cnt_unique_name - количество уникальных имён. DISTINCT тоже убирает дубли.
COUNT(DISTINCT lastname) AS cnt_unique_lastname - количество уникальных фамилий. DISTINCT опять убирает дубли.
Рекомендую после прочтения всё же перейти к практике и самостоятельно сделать как можно больше запросов для закрепления материала!