Выбрать главу

ORDER BY product_type_id;

VARIANCE(PRICE)

50.50125

280.8772

.125

7

0

Вы также можете включить вызов агрегатной функции в ORDER BY, как

показано в следующем примере:

□ SELECT VARIANCE(price)

FROM products

GROUP BY product_type_id

ORDER BY VARIANCE(price);

VARIANCE(PRICE)

0.

125

7

50.50125

280.8772

Неправильное использование вызовов агрегатных функций

Если запрос содержит агрегатную функцию и выбирает столбцы, которые

не включены в эту функцию, эти столбцы должны быть помещены во фразу

GROUP BY. Если не сделать это, то вы получите сообщение об ошибке

ORA-00937: not a single-group group function (ORA-00937: групповая функция

более чем для одной группы). Следующий запрос выбирает столбец

product_type_id и AVG(price), но в нем пропущена фраза GROUP BY для столбца

product_type_id:

Использование простых функций 131

□ SQL> SELECT produ ct_type_id, AVG(price)

2 FROM products;

SELECT produ ct_type_id, AVG(price)

*

ERROR a t lin e 1:

0RA-00937: not a s in g le -g ro u p group fu n c tio n

Эта ошибка возникает потому, что база данных не знает, что ей делать

со столбцом product_type_id в результирующем наборе. Подумайте; запрос

пытается использовать агрегатную функцию AVG(), которая оперирует несколькими

строками, но он пытается также получить значения столбца

p rodu ct_type_id для каждой индивидуальной строки. Этого нельзя сделать

одновременно. Поэтому нужно добавить фразу GROUP BY, которая укажет

базе данных, что необходимо сгруппировать несколько строк с одним

и тем же значением product_type_id. Тогда база данных сможет передать

эти сгруппированные строки на вход функции AVG().

Предупреждение Если ваш запрос содержит агрегатную функцию и выбирает столбцы, которые

не включены в эту функцию, эти столбцы должны быть помещены во фразу GROUP BY.

Кроме того, во фразе WHERE нельзя использовать агрегатные функции

для ограничения числа строк. При попытке сделать это вы получите следующее

сообщение об ошибке: ORA-00934: group function is not allowed here.

(ORA-00934: здесь недопустима групповая функция.) Например:

□ SQL> SELECT produ ct_type_id , AVG(price)

2 FROM products

3 WHERE AVG(p rice) > 20

4 GROUP BY product_type_id;

WHERE AVG(price) > 20

ERROR at lin e 3:

ORA-00934: group fu n c tio n i s not allowed here

Ошибка возникает потому, что фразу WHERE можно использовать только

для фильтрации отдельных строк, а не групп строк. Для фильтрации групп

строк используется фраза HAVING, с которой вы ознакомитесь далее.

Использование фразы HAVING для фильтрации групп строк

Фраза HAVING используется для фильтрации групп строк. Фраза HAVING помещается

после фразы GROUP BY:

□ SELECT...

FROM...

WHERE

GROUP B Y ...

HAVING...

ORDER B Y ...;

Примечание Фраза GROUP BY может использоваться без фразы HAVING, но HAVING обязательно

должна использоваться в сочетании с GROUP BY.

132 Гпава 4

Например, нужно увидеть типы товара, средняя цена которых превышает

$20. Для этого следует:

■ использовать фразу GROUP BY для группировки строк в блоки с одним

и тем же значением produ ct_type_id,

■ использовать фразу HAVING для ограничения возвращаемых результатов

теми группами, для которых средняя цена превышает $20.

Следующий запрос иллюстрирует применение фраз GROUP BY и HAVING:

□ SELECT product_type_id, AVG(price)

FROM products

GROUP BY product_type_id

HAVING AVG(price) > 20;

PRODUCT_TYPE_ID AVG(PRICE)

В выходные данные вошли только строки, для которых средняя цена

товара превышает $20:

Совместное использование WHERE и GROUP BY

Фразы GROUP BY и WHERE можно использовать вместе в одном запросе. При

этом сначала фраза WHERE отфильтровывает возвращаемые строки, а затем

оставшиеся строки группируются в блоки фразами GROUP BY. В следующем

запросе используются

■ фраза WHERE для фильтрации строк из таблицы products, чтобы оставить

только строки, для которых price меньше $15,

■ фраза GROUP B Y для группировки оставшихся строк по значению столбца

product_type_id

□ SELECT product_type_id, AVG(price)

FROM products

WHERE price < 15

GROUP BY product_type_id

ORDER BY product_type_id;

PRODUCT_TYPE_ID AVG(PRICE)

Совместное использование фраз WHERE, GROUP BY и HAVING

Можно использовать в одном запросе фразы WHERE, GROUP BY и HAVING. В этом

случае сначала фраза WHERE фильтрует строки, затем оставшиеся строки

группируются в блоки фразой GROUP BY и, наконец, полученные группы

строк фильтруются фразой HAVING. В следующем запросе используются

2

24.975

26.22

2

3

4

14.55

13.24

12.99

13.49

Использование простых функций 133

■ фраза WHERE для фильтрации строк таблицы products, чтобы оставить

только строки, для которых price меньше $15,