Отбор групп строк (предложение HAVING)
Точно так же, как предложение WHERE используется для отбора отдельных строк, участвующих в запросе, предложение HAVING используется для отбора групп строк, созданных предложением GROUP BY.
Синтаксис:
HAVING <условие отбора групп строк>
В предложении HAVING используются такие же типы условий, как и в предложении WHERE. Кроме того, учитывая, что условие в предложении HAVING применяется к группе строк, в нем можно использовать агрегатные функции, столбцы группировки, константы, а также выражения, состоящие из перечисленных элементов.
На практике условие в предложении HAVING всегда должно включать в себя как минимум одну агрегатную функцию. Если это не так, условие поиска нужно переместить в предложение WHERE.
Примечание. Все имена столбцов из предложения HAVING, которые не используются как аргументы агрегатных функций, должны быть обязательно указаны в предложении GROUP BY!!!
Пример 41. Вывести список мелодий, которые установлены более чем для одного контакта.
|
|
SELECT M.NAZV, COUNT(*)
FROM MELODII M, KONTAKTY K
WHERE (M.ID=K.MEL_ID)
GROUP BY M.ID, M.NAZV
HAVING COUNT(*)>1
Пример 42. Вывести информацию о контактах (имя, количество вызовов, общая длительность), разговоры с которыми (без учета пропущенных) длились в среднем более 1 минуты).
SELECT K.NAME1, COUNT(*), SUM(DLIT)
FROM KONTAKTY K, NOMERA N, VYZOVY V, TIPY_VYZ T
WHERE (K.ID=N.KONT_ID) AND (N.ID=V.NOMER_ID) AND (V.TIP_ID=T.ID)
AND (T.NAZV<>'Пропущенный')
GROUP BY K.ID, K.NAME1
HAVING AVG(DLIT)>60
1. Из всех таблиц, указанных в предложении FROM, сформировать одну общую таблицу как декартово произведение (или соединение при наличии операции JOIN).
2. Если имеется предложение WHERE, применить заданное в нем условие отбора к каждой строке общей таблицы и оставить только те строки, для которых это условие выполняется (TRUE), остальные строки отбросить.
3. Если имеется предложение GROUP BY, разделить оставшиеся строки на группы таким образом, чтобы в строках каждой группы были одинаковые значения во всех столбцах группировки.
4. Если имеется предложение HAVING, применить заданное в нем условие поиска к каждой группе строк и оставить только те группы строк, для которых это условие выполняется.
5. Для каждой из оставшихся строк (при наличии группировки – для каждой из групп строк) вычислить значение каждого элемента в списке возвращаемых столбцов (предложение SELECT) и создать одну строку таблицы результатов запроса.
6. Если указано ключевое слово DISTINCT, удалить из таблицы результатов запроса все повторяющиеся строки.
7. Если имеется предложение ORDER BY, отсортировать результаты запроса.