Классика баз данных - статьи

       

в разделе SELECT простых атрибутов


Кроме указания в разделе SELECT простых атрибутов и встроенных функций пользователь может конструировать в этом разделе арифметические выражения. Все перечисленные ниже выражения являются допустимыми:

AVG(SAL)/52 AVG(SAL)+AVG(COMM) AVG(SAL+COMM)

Отношение может быть разделено на группы в соответствии с значением некоторого атрибута, и затем встроенная функция применяется к каждой группе. Этот тип запроса показан в примере Q8. Раздел GROUP BY всегда используется вместе с какой-либо встроенной функцией. Если используется этот раздел, то каждый элемент в разделе SELECT должен быть уникальным группы, а не индивидуального кортежа. Например, в Q8 у каждой группы служащих имеются уникальный DNO и уникальная средняя зарплата. Если в разделе SELECT запроса Q8 добавить EMPNO, возникнет ошибка, так как EMPNO не является уникальным свойством каждой группы.

Q8. Выдать номера всех отделов и среднюю зарплату в каждом из них. SELECT DNO,AVG(SAL) FROM EMP GROUP BY DNO

Отношение может быть разделяться на группы с последующим применением некоторого предиката или набора предикатов для выбора только требуемых групп и отбраковки других. Эти предикаты, задающие требования к группам, всегда основываются на встроенных функциях и размещаются в специальном разделе HAVING, как показано в запросе Q9. Предикат в разделе HAVING может сравнивать некоторое агрегатное свойство группы с константой (например, AVG(SAL) < 10000) или с другим агрегатным свойством той же самой группы (например, AVG(SAL) ≤ AVG(COMM)).

Q9. Выдать номера отделов, в которых средняя зарплата служащих не превышает 10000. SELECT DNO FROM EMP GROUP BY DNO HAVING AVG(SAL)<10000

Если в запросе содержатся и раздел WHERE, и раздел HAVING, то они обрабатываются в следующем порядке: сначале применяется раздел WHERE для отбора кортежей; затем формируются группы; далее применяется раздел HAVING для отбора групп, как показано в запросе Q10.

Q10. Перечислить отделы, в которых работает более десяти клерков. SELECT DNO FROM EMP WHERE JOB = 'CLERK' GROUP BY DNO HAVING COUNT(*) > 10


Содержание  Назад  Вперед