ЗНАЧЕНИЯ NULL В СТОЛБЦАХ ГРУППИРОВКИ
Когда в столбце группировки содержится значение null, возникают дополнительные осложнения. Если значение столбца неизвестно, к какой группе его следует отнести? В предложении where при сравнении двух значений null результат имеет значение null (а не true), т.е. два значения null не считаются одинаковыми. Если такое соглашение применить в предложении group by, это приведет к тому, что каждая строка со значением null в столбце группировки будет помещена в отдельную группу, состоящую из одной этой строки.
На практике это правило очень неудобно. Поэтому в стандарте ANSI/ISO определено, что два значения null в предложении group by равны. Если две строки имеют значение null в одинаковых столбцах группировки и идентичные значения во всех остальных столбцах группировки, они помещаются в одну группу. Небольшая таблица иллюстрирует принцип обработки значений null предложением group by в соответствии со стандартом ANSI/ISO, как показано в следующем запросе:
Хотя такой принцип обработки значений null определен в стандарте SQL, он реализован не во всех диалектах SQL. Прежде чем рассчитывать определенные результаты, следует протестировать свою базу данных.
УСЛОВИЯ ПОИСКА ГРУПП (ПРЕДЛОЖЕНИЕ HAVING)
Точно так же, как предложение where используется для отбора отдельных строк, участвующих в запросе, предложение having можно применить для отбора групп строк. Его формат соответствует формату предложения where. Предложение having состоит из ключевого слова having, за которым следует условие поиска. Таким образом, данное предложение oпpeдeляe условие поиска для групп.
Следующий пример иллюстрирует роль предложения having:
Вначале предложение group by разделяет заказы на группы по служащим. После того предложение having исключает все группы, в которых общая стоимость заказа не превышает $30000. И, наконец, предложение select вычисляет среднюю стоимость заказа для каждой из оставшихся групп и генерирует таблицу результатов запроса.
В предложении having указываются точно такие же условия поиска, что и в предложении where. Ниже приведен еще дин пример использования условия поиска групп:
В соответствии с этими правилами, SQL выполняет приведенный выше запрос таким образом:
1. Объединяет таблицы offices и salesreps, чтобы определить город, в котором работает служащий.
2. Группирует строки объединенной таблицы по офисам.
3. Исключает группы, содержащие две или менее строки — это те строки, которые не удовлетворяют критерию предложения having.
4. Вычисляет общие плановые и фактические объемы продаж для каждой группы.
Чтобы осуществить этот запрос, SQL выполняет следующие действия:
1. Объединяет таблицы orders и products, чтобы получить описание, цену и количество единиц на складе для каждого заказанного товара.
2. Группирует строки объединенной таблицы по идентификатору производителя и товара.
3. Исключает группы, в которых количество заказанных единиц составляет менее 75 процентов от количества на складе.
4. Вычисляет общее количество заказанных единиц для каждой группы.
5. Генерирует одну итоговую строку запроса для каждой группы.
6. Сортирует результаты запроса таким образом, чтобы товары, которых на складе больше, шли первыми.
Как было сказано ранее, столбцы description, price и qty_on_hand должны быть указаны в качестве столбцов группировки, поскольку они перечислены в списке возвращаемых столбцов. Однако на деле они не участвуют в процессе группировки, поскольку столбцы mfr_id и prouct_id полностью определяют строку таблицы products, и три оставшихся столбца автоматически имеют в группе одно значение.