Группировка записей
Пусть необходимо определить первичные ключи, соответствующие каталогам 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.
В этом случае каждая строка таблицы рассматривается как отдельная группа.
Объединение таблиц
Как было сказано выше, оператор select возвращает результат в виде таблицы. Если формат результирующих таблиц (число, порядок следования и тип столбцов) совпадает, то возможно объединение результатов выполнения двух операторов select в одну результирующую таблицу. Это достигается использованием оператора union.
Пусть имеются два запроса, представленные в листинге 7.38.
Объединить результаты из этих двух таблиц можно, соединив два запроса select при помощи ключевого слова union, как это продемонстрировано в листинге 7.39.
Во втором запросе select, производящем выборку из таблицы orders, к значению первичного ключа id_orders добавляется значение 5, таким образом, все значения в результирующей таблице становятся уникальными. Однако если результирующая таблица содержит повторяющиеся строки, СУБД MySQL автоматически отбрасывает дубликаты (листинг 7.40)
Как видно из листинга 7.40, вместо десяти записей выводится только пять. Изменить поведение по умолчанию можно при помощи ключевого слова all, которое добавляется после оператора union. Использование union all требует, чтобы возвращались все строки из обеих результирующих таблиц.
Для формы union all существует противоположенный оператор union distinct, ho т. к. оператор union по умолчанию отбрасывает не уникальные столбцы, ключевое слово distinct часто опускают.
Дата добавления: 2020-11-18; просмотров: 349;