Пусть необходимо определить первичные ключи, соответствующие каталогам id_catalog, в которых есть хоть одна товарная позиция. Для этого достаточно осуществить запрос к таблице products, который извлечет поле id catalog (листинг 7.28).
Как видно из листинга 7.28, результат не совсем удобен для восприятия. Было бы лучше, если бы запрос вернул уникальные значения столбца id_catalog. Для этого перед именем столбца можно использовать ключевое слово distinct, которое предписывает MySQL извлекать только уникальные значения.
Как показано в листинге 7.29, результат запроса не содержит ни одного повторяющегося значения. Использование ключевого слова distinct допускается совместно с функцией count(). В листинге 7.30 первый запрос возвращает общее число записей в таблице products, а второй — число уникальных значений id_catalog.
Для ключевого слова distinct имеется противоположное слово all, которое предписывает извлечение всех значений столбца, в том числе и повторяющихся. Поскольку такое поведение установлено по умолчанию, ключевое слово all часто опускают.
Для извлечения уникальных записей чаще прибегают к конструкции group by, за которой указывается имя столбца, по которому группируется результат.
Однако, в отличие от ключевого слова distinct, использование функции count () совместно с group by приводит не к подсчету уникальных значений id_catalog, а квыводу числа записей, соответствующих каждому из уникальных значений id_cataiog.
Как видно из листинга 7.32, каталог с первичным ключом id_catalog = 1 содержит 9 товарных позиций, с id_catalog = 2 — 6 и т. д.
При использовании конструкции group by точно так же возможно использование условия where.
Чаще при составлении условий требуется ограничить выборку по результату функции, например, выбрать каталоги, где число товарных позиций больше пяти. Использование для этих целей конструкции where приводит к ошибке.
Для решения этой проблемы вместо ключевого слова where используется ключевое слово having, которое располагается вслед за конструкцией group by.
В условии having можно использовать все столбцы результирующей таблицы, не только вычисляемые, например, в листинге 7.36 приводится пример запроса, извлекающего уникальные значения столбца id_catalog, больше двух
Отличие запросов, представленных в листингах 7.33 и 7.36, заключается в том, чтов случае использования ключевого слова where сначала производится выборка из таблицы с применением условия и лишь затем группировка результата, а в случае использования ключевого слова having сначала происходит группировка таблицы и лишь затем выборка с применением условия.
Допускается использование условия having без группировки group by.
В этом случае каждая строка таблицы рассматривается как отдельная группа.