Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
15.01.2021
Размер:
154.95 Кб
Скачать

GROUP BY (группировка)

должна располагаться вслед за фразой WHERE.

При наличии фразы GROUP BY фраза SELECT применяется к каждой группе, сформированной фразой группировки. Каждое выражение в списке фразы SELECT должно принимать единственное значение для группы, т.е. оно может быть:

константой;

агрегатной функцией, которая оперирует всеми значениями ее аргумента только в пределах группы и сводит эти значения к единственному значению (например, к сумме);

выражением, идентичным тому, что стоит во фразе

GROUP BY;

выражением, которое построено из приведенных выше выражений.

Группирование по одному столбцу (1)

Запрос. По каждому корпусу подсчитать количество находящихся в них кафедр.

SELECT Building AS "Корпус", COUNT(*) AS "К-во кафедр"

FROM DEPARTMENT

GROUP BY Building;

Корпус К-во кафедр

---------- ----------------

3 3

51

62

3 строк выбрано.

Это самый простой вариант использования GROUP BY. Таблица группируется по значениям одного столбца. Приведем примеры

Группирование по одному столбцу (2)

Запрос. По каждой из профессий указать суммарный фонд заработной платы.

SELECT Post AS "Должность", SUM(Salary +

Rise) AS "Сумма зарплаты"

FROM TEACHER

GROUP BY Post;

Должность Сумма зарплаты

--------------- ------------------------

ассистент

2960

доцент

4761

преподаватель

3420

профессор

4660

• 4 строк выбрано.

Если в запросе используется фраза WHERE и GROUP BY, то строки, не удовлетворяющие фразе WHERE, исключаются до выполнения группирования, то есть группирование производится только по тем строкам, которые удовлетворяют фразе WHERE.

Группирование по одному столбцу (3)

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

SELECT f.Name AS "Факультет", SUM(d.Fund) AS "Фонд кафедр"

FROM FACULTY f, DEPARTMENT d WHERE f.FacPK = d.FacFK

GROUP BY f.Name;

Факультет Фонд кафедр

------------------- ------------------

информатика 48000 кибернетика 51100

• 2 строк выбрано.

Группирование по нескольким столбцам

Запрос. Вывести количество лекций, читаемых преподавателями–доцентами по неделям (первая и вторая).

SELECT t.Name, l.Week, Count(*) FROM TEACHER t, LECTURE l

WHERE t.TchPK = l.TchFK AND LOWER(t.Post)= 'доцент' GROUP BY t.Name, l.Week;

NAME WEEK СOUNT(*)

----------- ----------- -------------

Заплатинский 1 1 Лебедь 1 1 Лебедь 2 1 Радишевский 1 1 Радишевский 2 1

• 5 строк выбрано.

Группирование по выражениям над столбцами

Запрос. По каждому значению зарплаты, не превышающему 800, выдать это значение и количество преподавателей, такую зарплату получающие.

SELECT Salary + Rise, COUNT(*) FROM TEACHER WHERE Salary + Rise <= 800

GROUP BY Salary + Rise;

SALARY+RISE COUNT(*)

----------- ----------

720 1

740 1

750 2

800 1

• 4 строк выбрано.

Вкладывание агрегатных функций

SELECT AVG(MIN(Salary)) FROM

TEACHER;

ORA-00978: вложенная групповая функция без GROUP BY

Значения NULL в столбцах группирования

Запрос. По каждому номеру телефона указать количество преподавателей, которые ими пользуются.

SELECT NVL(Tel, 'NULL VALUE') AS "Телефоны", Count(*)

FROM TEACHER

GROUP BY Tel;

Телефоны COUNT(*)

---------- ----------

2152295 2

5135472 1

5135497 2

5139827 5 NULL VALUE 5

• 5 строк выбрано.

Условие отбора групп

Запрос А.Получить сведения о тех корпусах, суммарное количество мест аудиторий которых превышает 100.

SELECT Building FROM ROOM WHERE

SUM(Seats) > 100 GROUP BY Building;

WHERE SUM(Seats) > 100 * Ошибка в строке 3: ORA-00934: групповая функция здесь не разрешена

является неверной, так как фраза WHERE проверяет условия только на отдельных строках, а мы указали в ней агрегатную функцию, которая вычисляется на группе.

WHERE, GROUP BY и HAVING

обрабатываются в следующем порядке:

если имеется фраза WHERE, то удаляются те строки, которые не удовлетворяют условию этой фразы;

согласно фразе GROUP BY формируются группы строк;

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

HAVING.

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

Фраза играет такую же роль для групп, что и фраза WHERE для строк: она используется для исключения групп, определяемых фразой GROUP BY, точно так же, как WHERE используется для исключения строк. Эта фраза включается в предложение лишь при наличии фразы GROUP BY, и она должна принимать единственное логическое условие для любой из сформированных групп.