Строки, возвращаемые SELECT-запросом, могут быть объединены в группы на основе значений определенного выражения для каждой стро-ки. Примером такого группирования может служить объединение в группы книг одного жанра, информация о которых имеется в таблице KNIGA. Так как в таблице присутствуют книги только трех жанров, то будут сформированы только три группы строк. Применив к каждой группе функцию SUM для столбца, содержащего значение цены, можно получить суммарную величину стоимости книг по каждому жанру. Для осуществления группирования используется конструкция GROUP BY оператора SELECT, в которой указывается перечень, состоящий из одно-го или нескольких выражений, разделенных запятыми, по значениям ко торых и осуществляется группирование. Если оператор SELECT содер-жит пункт GROUP BY, то список извлекаемых значений ограничен. Он может содержать константы, групповые функции, функцию SYSDATE и выражения, идентичные выражениям, указанным в пункте GROUP BY. На формирование результирующих строк могут быть наложены опреде-ленные условия. Для задания такого условия используется ключевое сло-во HAVING.
Демонстрационные примеры
1.Выбрать из таблицы KNIGA информацию о количестве различных жанров:
SELECT COUNT(DISTINCT ЖАНР) FROM KNIGA;
2.Выбрать из таблицы KNIGA информацию о количестве, суммарной стоимости и максимальной стоимости имеющихся книг:
SELECT COUNT(КОД_КНИГИ), SUM(ЦЕНА), MAX(ЦЕНА) FROM KNIGA;
3.Выбрать из таблицы KNIGA по каждому издательству информацию о количестве и суммарной стоимости изданных им книг, сгруппировав ее по жанрам:
SELECT ИЗДАТЕЛЬСТВО, ЖАНР, COUNT(НАЗВАНИЕ), SUM(ЦЕНА) FROM KNIGA GROUP BY ИЗДАТЕЛЬСТВО, ЖАНР;
4.Выбрать из таблицы KNIGA информацию о количестве и средней стоимости (округлив значение средней стоимости до двух знаков после запятой) книг в тех жанрах, где количество различных названий книг не менее 4:
SELECT ЖАНР, COUNT(DISTINCT НАЗВАНИЕ), ROUND(AVG(ЦЕНА), 2) FROM KNIGA GROUP BY ЖАНР
HAVING COUNT(DISTINCT НАЗВАНИЕ) >= 4;
5.Выбрать из таблицы KNIGA информацию о минимальной стоимо-сти книг в жанре «Роман»:
SELECT MIN(ЦЕНА) FROM KNIGA WHERE ЖАНР = 'Роман';
6.Выбрать из таблицы KNIGA информацию о самой дешевой книге в жанре «Роман»:
SELECT АВТОР, НАЗВАНИЕ, ЦЕНА FROM KNIGA
WHERE ЦЕНА = (SELECT MIN(ЦЕНА) FROM KNIGA WHERE ЖАНР = 'Роман') AND ЖАНР = 'Роман';
7.Выбрать из таблицы KNIGA информацию (фамилия автора, назва-ние жанр, цена) о книгах, имеющих максимальную стоимость в своем жанре:
а) SELECT АВТОР, НАЗВАНИЕ, ЖАНР, ЦЕНА FROM KNIGA WHERE (ЦЕНА, ЖАНР) IN (SELECT MAX(ЦЕНА), ЖАНР FROM KNIGA GROUP BY ЖАНР);
б) SELECT АВТОР, НАЗВАНИЕ, KNIGA.ЖАНР, ЦЕНА FROM KNIGA, (SELECT ЖАНР, MAX(ЦЕНА) МАКС FROM KNIGA GROUP BY ЖАНР) P1 WHERE ЦЕНА = МАКС AND KNIGA.ЖАНР = P1.ЖАНР;
в) SELECT АВТОР, НАЗВАНИЕ, ЖАНР, ЦЕНА FROM KNIGA P1 WHERE ЦЕНА = (SELECT MAX(ЦЕНА) FROM KNIGA WHERE KNIGA.ЖАНР = P1.ЖАНР);
П о я с н е н и е. Третий запрос содержит коррелированный подза-прос. Поскольку в своем условии подзапрос содержит ссылку на столбец родительского запроса, поэтому он будет выполняться один раз для каж-дой строки, извлекаемой родительским запросом. В первом и во втором вариантах подзапрос не является коррелированным, он выполняется только один раз для родительского запроса.
8.Выбрать из таблицы KNIGA информацию о книгах, стоимостью больше средней стоимости книг:
SELECT АВТОР, НАЗВАНИЕ, ЦЕНА FROM KNIGA WHERE ЦЕНА > (SELECT AVG(ЦЕНА) FROM KNIGA);
9.Выдать из таблицы KNIGA список жанров, по которым имеется наибольшее количество различных книг, с указанием количества книг:
SELECT ЖАНР, COUNT(DISTINCT НАЗВАНИЕ) FROM KNIGA
GROUP BY ЖАНР HAVING COUNT(DISTINCT НАЗВАНИЕ)=
(SELECT MAX(COUNT(DISTINCT НАЗВАНИЕ)) FROM KNIGA
GROUP BY ЖАНР);
10.Выбрать из таблицы KNIGA информацию о книгах (фамилия ав-тора, название), относящихся к жанрам, по которым имеется наибольшее количество различных книг: