Бази даних-20210115T104840Z-001 / Lab5R-Functions-Group-by-Having-Order-by-NEW
.pdfFROM DEPARTMENT;
Агрегатные функции с фразой WHERE. При наличии фразы WHERE областью действия агрегатной функции являются те строки, которые удовлетворяют условию фразы WHERE.
Пример. Какова средняя ставка ассистентов, которые не имеют надбавки.
SELECT AVG(Salary) FROM TEACHER
WHERE UPPER(Post) = 'ASSISTANT' AND Commission IS NULL;
Пример. Какой максимальный фонд среди кафедр факультета информатики?
SELECT MAX(DEPARTMENT.Fund)
FROM DEPARTMENT, FACULTY
WHERE DEPARTMENT.FacNo = FACULTY.FacNo AND UPPER(FACULTY.Name) = 'INFORMATICS';
Выражения в агрегатной функции. Аргументы агрегатных функций могут содержать выражения над столбцами таблицы.
Премер. Какова максимальная величина Salary+Commission?
SELECT MAX(Salary + Commission) FROM TEACHER;
Пример. Какова разница между максимальной и минимальной ставками?
SELECT MAX(Salary) – MIN(Salary) FROM TEACHER;
DISTINCT в агрегатных функциях. Ключевое слово DISTINCT означает, что в расчет следут брать только уникальные значения столбца (выражения) аргумента.
Пример. Сколько номеров телеыонов в таблице TEACHER:
SELECT COUNT(DISTINCT Tel) AS Number_of_telephones
FROM TEACHER;
Пример. Сколько должностей в таблице TEACHER:
SELECT COUNT(DISTINCT Post) FROM TEACHER;
Множество агрегатных функций в списке select. Список Select может содержать множество агрегатных функций.
Example. Сколько профессоров в Вузе и какова их средняя ставка:
SELECT COUNT(*), SUM( Salary ) FROM TEACHER
WHERE UPPER(Post) = 'PROFESSOR';
Агрегатные функции с фразой GROUP BY. См. примеры фразы использования фразы GROUP BY.
3.2. Фразы GROUP BY и HAVING
GROUP BY и агрегатные функции в списке select.
Пример. Сколько кафедр в каждом из корпусов:
SELECT Building, COUNT(*) FROM DEPARTMENT
GROUP BY Building;
Example. Какова сумма зарлпты (Salary+Commission) по всем имеющимся должностям:
SELECT Post, SUM(Salary + Commission) FROM TEACHER
GROUP BY Post;
Группирование и фраза WHERE. Если запрос содержит фразы WHERE и GROUP BY, то фразаWHERE обрабатывается первой, а затем применяется группирование.
Пример. Для каждого корпуса подсчитать количество аудиторий вместимостью более 50:
SELECT Building, COUNT(*)
11
FROM ROOM
WHERE Seats > 50
GROUP BY Building;
Пример. Для корпусов 5, 7 и 12 подсчитать количество аудиторий вместимостью более 50:
SELECT Building, COUNT(*) FROM ROOM
WHERE UPPER(Building) IN ('5', '7', '12') AND Seats > 50 GROUP BY Building;
Группирование по многим столбцам. Можно группировать по многим столбцам. Пример. Для каждой недели и дня недели подсчитать количество лекций типа “lab”:
SELECT Day, Week, COUNT(*) FROM LECTURE
WHERE UPPER(Type) = 'LAB' GROUP BY Week, Day;
Группирование и соединение различных таблиц. Имеется возможность соединить две или более таблиці и зптем произвести группирование по соединенной таблице.
Пример. По каждому факультету выдать количество кафедр:
SELECT f.Name, COUNT(*)
FROM FACULTY f, DEPARTMENT d WHERE f.FacNo = d.FacNo GROUP BY f.Name;
Пример. По каждому факультету выдать количество профессоров:
SELECT |
f.Name, COUNT(*) |
|
FROM |
FACULTY f, DEPARTMENT |
d, TEACHER t |
WHERE |
f.FacNo = d.FacNo AND |
d.DepNo = t.DepNo AND UPPER(t.Post) = 'PROFESSOR' |
GROUP BY f.Name;
Пример. Для каждой кафедры каждого факультета подсчитать количество профессоров:
SELECT f.Name, d.Name, COUNT(*)
FROM |
FACULTY f, DEPARTMENT |
d, TEACHER t |
WHERE |
f.FacNo = d.FacNo AND |
d.DepNo = t.DepNo AND UPPER(t.Post) = 'PROFESSOR' |
GROUP BY f.Name, d.Name; |
|
|
Использование фразы HAVING. Она задает условие на группу. Фразы HAVING обычно содержат агрегатную функцию.
Example. Вывести корпуса, в которых суммарное количество мест в аудиториях меньше 1000:
SELECT Building
FROM ROOM
GROUP BY Building
HAVING SUM(Seats) < 1000;
3.3. Фраза ORDER BY
Она испольуется для упорядочения результатов запроса. Можно упорядочивать
по любому столбцу таблицы,
по выражению над столбцами,
по списку столбцов или выражений.
Упорядочение по столбцу из списка select.
Пример. Выдать назвыание факультета и его декана, упорядочив результат по факультетам:
SELECT Name, Dean FROM FACULTY ORDER BY Name;
Упорядочение по столбцу таблицы. Можно упорядочивать по столбцу таблицы, даже если он не присутствует в списке select. Эта возможность не поддерживается стандартом ANSI, но допустима в SQL
Oracle.
12
Пример. Выдать имена преподавателей и их ставки, упорядочив результат по должностям:
SELECT Name, Salary FROM TEACHER ORDER BY Post;
Упорядочение по списку столбцов. Используя список столбцов можно произвести многоуровневое упорядочение.
Пример. По каждой группе вывести ее номер, курс и количество студентов. Упорядочить результат по курсу и номеру группы:
SELECT Course, Num, Quantity FROM SGROUP
ORDER BY Course, Num;
Упорядочение по выражению над столбцами. Можно упорядочивать по выражению над столбцами.
Example. Вывести имя ставку и надбавку преподавателей. Упорядочить результат по выражению
Salary+Commission:
SELECT Name, Salary, Commission FROM TEACHER
ORDER BY Salary + Commission ASC;
Использование порядкового номера столбца в списке select. Можно использовать порядковый номер столбца в списке select для ссылки на него во фразе ORDER BY. Это может оказаться удобным, когда список select содержит выражения.
Пример. Вывести имя преподавателя и его зарплату (Salary+Commission). Упорядочить результат по выражению Salary+Commission в порядке убывания:
SELECT Name, Salary + Commission FROM TEACHER
ORDER BY 2 DESC;
Использование алиаса столбца из списка select. Вы можете воспользоваться алиасом столбца из списка select для ссылки на него во фразе ORDER BY.
Пример. Вывести имена преподавателей и даты их поступления на работу. Если дата не определена, то вывести строку “not defined”. Упорядочить результат по дате в убывающем порядке:
SELECT Name, NVL(TO_CHAR(hiredate,'yyyy-mm-dd'),'not defined') AS Teacher_hiredate FROM TEACHER
ORDER BY Teacher_hiredate DESC;
Соединение таблиц и упорядочение. Если вы соединяете таблицы, то можно упорядочивать по любому столбцу соединенной таблицы.
Пример. Вывести имна преподавателей и их зарплаты факультета инфоматики. Упорядочить результат по зарплате в убывающем порядке.
SELECT |
t.Name, Salary + Commission |
|
FROM |
FACULTY f, DEPARTMENT |
d, TEACHER t |
WHERE |
f.FacNo = d.FacNo AND |
d.DepNo = t.DepNo AND UPPER(f.Name) = 'INFORMATICS' |
ORDER BY 2 DESC;
Группирование и упорядочение. Для упорядочение групп необходимо удовлетворить ограничения, описанные в разделе “2.3. Фраза ORDER BY”.
Пример. Вывести количество студентов на каждом курсе. Расположить результат в порядке возрастания курса.
SELECT Course, SUM( Quantity )
FROM SGROUP
GROUP BY Course
ORDER BY Course ASC;
4. Варианты заданий
Далее приводится 18 вариантов заданий. Каждый вариант состоит из 7 запросов, которые относятся к следующим категориям (в порядке их следования):
13
1)Агрегатные функции на одной таблице
2)Агрегатные функции с учетом нескольких таблиц
3)NULL в агрегатных функциях, фраза DISTINCT, выражения в аргументе агрегатной ф-ции
4)GROUP BY (группирование по одному или нескольким столбцам)
5)Выражения в GROUP BY
6)Фраза HAVING (без вложенных запросов)
7)Фраза ORDER BY
ВНИМАНИЕ. В предлагаемых запросах используются константы (имена преподавателей, названия кафедр и факультетов, названия дисциплин), которые могут отсутствовать в вашей базе данных. ЗАМЕНЯЙТЕ ИХ НА ТЕ, КОТОРЫЕ ДЕЙСТВИТЕЛЬНО ИМЕЮТСЯ В ВАШЕЙ БАЗЕ ДАННЫХ!
14
4.1. Вариант 1
1) Сколько дисциплин приведено в таблице SUBJECT. Столбец результирующей таблицы должен иметь имя «К-во дисциплин»
2) Сколько дисциплин читается студентам на факультете 'компьютерные науки' |
|
3) Вывести дважды среднее количество студентов в группах факультета 'компьютерные науки'. |
|
В первом случае при подсчете среднего значения NULL игнорируются. Во втором случае |
NULL |
учитываются как значение 0. Почему эти значения могут отличаться? |
|
4) Для каждого факультета вывести его название и разницу между ее фондом и суммарными фондами финансирования всех его кафедр.
5)По каждой зарплате (salary+commission), выплачиваемой преподавателям факультета, деканом которого является Иванов, вывести эту зарплату, количество преподавателей с этой зарплатой и количество кафедр, на которых работают эти преподаватели. Соответствующие столбцы имеют названия: «Зарплата», «Кол-во преподавателей» и «Кол-во кафедр»
6)По каждому преподавателю факультета компьютерных наук вывести:
-его имя,
-должность и
-количество дисциплин, которые он преподает, при условии, что:
-он проводит занятия не более, чем в 3-х группах и
-он проводит занятия в не более, чем 2-х аудиториях
7) По каждой аудитории корпуса 6 вывести ее номер и названия кафедр, на которых проволятся занятия в этой аудитории студентам 3курса. Результат упорядочить по номеру аудитории в возрастающем порядке и по названию кафедры в убывающем порядке
4.2. Вариант 2
1) Вывести значение следующего выражения: суммарную зарплату (salary+commission) по всем преподавателям умножить на количество должностей и разделить на количество преподавателей. Столбец результирующей таблицы должен иметь имя «Выражение»
2)Сколько студентов и сколько групп на факультете 'компьютерные науки'
3)Вывести дважды среднее количество зарплаты (salary+commission) преподавателей факультета 'компьютерные науки'. В первом случае при подсчете среднего значения возможные значения NULL для salary и commission игнорируются. Во втором случае NULL учитываются как значение 0. Почему эти значения могут отличаться?
4) Для каждого преподавателя факультета 'компьютерные науки' вывести следующую информацию под столбцами с соответствующими именами
- имя |
- Преподаватель, |
- количество лекций, которые он имеет, и |
- Кол-во лекций |
- количество дисциплин, которые он читает. - Кол-во дисциплин
15
5) По каждой зарплате (salary+commission), выплачиваемой преподавателям кафедры ИПО, вывести эту зарплату, количество преподавателей с этой зарплатой и количество должностей, имеющих эту зарплату. Соответствующие столбцы имеют названия: «Зарплата», «Кол-во преподавателей» и «Кол-во должностей». Если ставка или надбавка не определены (имеют значение NULL) то считать, что они принимают значение 0.
6) По каждому преподавателю факультета компьютерных наук вывести:
-его имя,
-его зарплату (salary+commission),
-количество групп, в которых он проводит занятия, и
-количество аудиторий, в которых он проводит занятия, при условии, что:
-он проводит занятия не более, чем по 2 дисциплинам и
-у него не более, чем 4 занятий в расписании
7) Вывести названия дисциплин и номера аудиторий с их номерами корпусов, которые (дисциплины) читаются преподавателями-профессорами факультета 'компьютерные науки' студентам 3 курса. Результат упорядочить по названию дисциплине в возрастающем порядке и по номеру аудитории в убывающем порядке.
4.3. Вариант 3
1)Сколько дней в неделю проводятся занятия и каково максимальное количество пар указано в таблице LECTURE. Столбцы результирующей таблицы должны иметь имена «МАКС к-во пар» и «К-во дней»
2)Сколько кафедр и сколько преподавателей на факультете 'компьютерные науки' и какова средняя зарплата (salary+commission) преподавателей на этом факультете
3)Вывести дважды количество значений в столбце Tel таблицы TEACHER
В первом случае при подсчете количества значений возможные значения NULL для Tel игнорируются. Во втором случае NULL учитываются как значение ' ' (пустая строка). Почему эти значения могут отличаться?
4) Для каждого кафедры факультета 'компьютерные науки', расположенной в корпусе 6, вывести название кафедры, количество преподавателей на кафедре и количество групп на кафедре. При этом результирующие столбцы имеют следующие имена:
-Кафедра
-Кол-во преподавателей
-Кол-во групп
5) По каждой зарплате (salary+commission), выплачиваемой преподавателям кафедры, заведующей которой является Иванов, вывести следующую информацию в столбцах под соответствующими именами:
- зарплата этой группы преподавателей. Если она не определена, то вывести 0 |
Зарплата |
- к-во различных должностей, занимаемых этими преподавателями |
К-во должностей |
- к-во кафедр, на которых работают эти преподаватели |
К-во кафедр |
- к-во телефонов, которыми пользуются эти преподаватели |
К-во телефонов |
6) По каждой группе кафедры ИПО вывести:
-номер группы,
-его курс,
16
-количество преподавателей, которые проводят в ней занятия, и
-количество занятий, которые имеются у ней в расписании, при условии, что:
-в этой группе проводятся занятия не более, чем по 6-ти дисциплинам, и что
-в ней проводятся занятия в не более, чем в 5-ти аудиториях.
7) Вывести названия факультетов и дисциплин, которые читаются на этих факультетах преподавателямидоцентами, являющимися кураторами студентов 3-го курса. Упорядочить по названию факультета в убывающем порядк и по названию дисциплины в убывающем порядке
4.4. Вариант 4
1)Какой суммарный фонд финансирования всех факультетов. Столбец результирующей таблицы должен иметь имя «Фонд фак-тов»
2)Группам скольких кафедр проводит занятия преподаватель Иванов и сколько дисциплин этот преподаватель преподает (не зависимо от того, для студентов каких кафедр проводятся занятия)
3)Вывести дважды суммарную зарплату преподавателей факультета, деканом которого является Иванов В первом случае NULL игнорируется. Во втором случае NULL учитывается как значение 0. Почему эти значения могут отличаться?
4)Для каждого кафедры факультета 'компьютерные науки', имеющей фонд финансирования больше 125000, вывести название кафедры, количество групп на кафедре, количество дисциплин, которые читаются студентам кафедры, количество преподавателей, которые читают лекции студентам кафедры. При этом результирующие столбцы имеют следующие имена:
-Кафедра
-Кол-во групп
-Кол-во дисциплин
-Кол-во преподавателей
5) По каждому телефону, установленному у преподавателей, проводящих занятия в группах кафедры ИПО, вывести номер телефона и количество преподавателей, у которых этот телефон установлен. Если телефон принимает значение NULL, то вместо него использовать строку «Нет телефона». Столбцы результирующей таблицы принимают имена: «Телефон» и «К-во преподавателей».
6) По каждой группе, куратором которой является преподаватель кафедры ИПО, вывести:
-номер группы,
-имя куратора,
-количество дисциплин, которые читаются этой группе,
-количество аудиторий, в которых проводятся занятия в группе при условии, что:
-в этой группе проводят занятия не более 4-х преподавателей,
-в этой группе имеется менее 30 занятий в расписании
7) Вывести номера аудиторий с именами преподавателей, в которых (аудиториях) эти преподаватели проводят лабораторные занятия для студентов факультета 'компьютерные науки'. Результат упорядочить по названию факультетов по возрастанию и названию кафедр по убыванию.
17
4.5. Вариант 5
1)Чему равно следующее выражение: сложить суммарный фонд финансирования всех кафедр, разделенный на количество кафедр, с максимальным фондом, разделенным на минимальный фонд финансирования. Столбец результирующей таблицы должен иметь имя «Сложное выражение»
2)В скольких группах преподают преподаватели кафедры ИПО
3)Вывести дважды средний рейтинг всех групп факультета компьютерных наук. В первом случае NULL игнорируются. Во втором случае NULL учитывается как значение 0. Почему эти значения могут отличаться?
4)Для каждого кафедры факультета 'компьютерные науки', имеющей фонд финансирования в диапазоне 200000-500000 вывести название кафедры, количество групп на кафедре, общее количество студентов на кафедре, среднее количество студентов в группе, разницу между максимальным и минимальным рейтингом групп кафедры. При этом результирующие столбцы имеют следующие имена:
-Кафедра
-Кол-во групп
-Кол-во студентов
-Сред. к-во студентов в группе
-МАКС(рейтинг)-МИН(рейтинг)
5) По каждой группе преподавателей кафедры ИПО с диапазоном даты поступления на работу 01.01.200031.12.2007, фамилии которых начинаются на одну букву, вывести эту букву, количество преподавателей и суммарную зарплату (salary+commission) этих преподавателей. Соответствующие столбцы имеют названия: «Б», «Кол-во преподавателей» и «Суммарная зарплата»
6) По каждой аудитории, в которой проводят занятия преподаватели факультета компьютерных наук, вывести
-ее номер,
-корпус и
-количество групп, которым проводятся занятия в этой аудитории, при условии, что:
-в этой аудитории проводят занятия не более, чем 3 преподавателя, и что
-в ней проводятся занятия не более, чем по 4-м дисциплинам
7) Вывести названия кафедр, преподаватели которых преподают студентам кафедры ИПО. Результат упорядочить по иманам преплдавателей по убыванию.
4.6. Вариант 6
1) Каковы суммарные ставка, надбавка и зарплата (ставка+надбавка) всех преподавателей-доцентов. Столбцы результирующей таблицы должны иметь имена «Ставка доцентов», «Надбавка доцентов» и «Зарплата доцентов»
2) По всем преподавателям, являющимся кураторами групп кафедры ИПО, вывести указанные значения под соответствующими именами столбцов:
- строковая константа 'Кураторы кафедры ИПО' |
- Что выводится? |
- количество этих преподавателей |
- К-во преподавателей; |
- их суммарную зарплату (Salary+Commission) |
- Суммарная зарплата |
- их суммарную зарплату, разделенную на их количество |
- Средняя зарплата |
18
- разницу между их максимальной и минимальной зарплатой |
- Разность зарплат |
3)Вывести перечень дней недели, в которые имеются занятия в группах факультета компьютерныъ наук
4)Для каждой пары значений преподаватель-дисциплина, имеющих (преподавателей) зарплату (Salary+Commission) в диапазоне 1000-3000 и работающих на кафедре ИПО, вывести:
- имя преподавателя, |
- Преподаватель |
- должность преподавателя |
- Должность |
- название дисциплины, которую преподает этот преподаватель |
- Дисциплина |
- количество лекций, которое имеет этот преподаватель по этой дисциплине |
- Кол-во лекций |
- количество групп, которым читаются лекции этим преподавателей по этой дисциплине - Кол-во групп - количество аудиторий, в которых проводятся занятия этим преподавателем
по этой дисциплине - Кол-во аудиторий
5) По каждой группе преподавателей факультета компьютерных наук с диапазоном зарплат (salary+commission) 1000-3000 вывести следующую информацию под соответствующими названиями столбцов:
- название месяца, в котором были приняты на работу преподаватели |
- Месяц |
- количество принятых на работу преподавателей в этом месяце |
- К-во преподавателей |
- средняя зарплата (salary+commission) всех преподавателей, |
- Средняя зарплата |
принятых на работу в этом месяце |
|
- количество кафедр, на которых работают эти преподаватели |
- К-во кафедр |
6) По каждой аудитории из корпусов 1, 3, 4, 5, 6, в которых проводятся занятия групп кафедры ИПО, вывести:
-номер аудитории,
-количество мест в аудитории,
-количество преподавателей, которые проводят занятия в этой аудитории,
-количество дисциплин, которые читаются в этой аудитории,
при условии, что:
-в этой аудитории проводятся занятия не более, чем в 3-х группах, и
-в этой аудитории проводятся не более 5 занятий
7) Вывести имена преподавателей факультета 'компьютерные науки'. Результат упорядочить по первой букве в именах преподавателей.
4.7. Вариант 7
1)Какое количество групп и суммарное количество студентов и во всех группах третьего курса. Столбцы результирующей таблицы должны иметь имена: «К-во групп» и «К-во студентов»
2)По всем преподавателям, занимающим должности профессоров или доцентов или ассистентов, факультета 'компьютерные науки' вывести следующую информацию под соответствующими именами столбцов:
- строковая константа 'Инфо о фак-те компьютерных наук:' - Что выводится?
- количество таких преподавателей |
- Кол-во преподавателей |
- Количество читаемых ими дисциплин |
- Кол-во дисциплин |
- Количество групп, в которых они проводят занятия |
- Кол-во групп |
19
- Количество аудиторий, в которых они проводят занятия - Кол-во аудиторий
3) Вывести перечень должностей, которые имеют преподаватели факультета, деканом которого является Иванов
4) Для каждой пары значений группа-дисциплина, имеющих (групп) один из следующих рейтингов: 10-30, 45, 55-70 или NULL, вывести следующую информацию под соответствующими именами столбцов:
- номер группы |
-Группа, |
- курс группы |
-Курс, |
- рейтинг группы |
-Рейтинг, |
- дисциплина, которая читается группе |
-Дисциплина, |
- количество занятий, проводимых для этой группе по этой дисциплине |
-Кол-во лекций, |
- количество преподавателей, которые проводят занятия в этой группе |
|
по этой дисциплине |
– Кол-во преподаватаелей, |
- количество аудиторий |
- Кол-во аудиторий |
5) По каждой группе преподавателей с диапазоном зарплат (salary+commission) 0-3000 вывести следующую информацию под соответствующими названиями столбцов:
- название месяца, в котором были приняты на работу преподаватели |
Месяц |
- количество принятых на работу преподавателей в этом месяце |
К-во преподавателей |
- средняя зарплата (salary+commission) всех преподавателей, принятых |
Средн. зарплата |
на работу в этом месяце |
|
- разница максимальной и минимальной зарплатами среди всех |
МАКС(зарп.)-МИН(зарп.) |
преподавателей, принятых на работу в этом месяце.
При использовании во фразе WHERE полей salary и commission заменять значения NULL на 0
6)По каждой дисциплине, читаемой студентам кафедры, у которой заведующим является Иванов, вывести: - название дисциплины, - количество групп, которым эта дисциплина читается,
- количество преподавателей, которые эту дисциплину читают, при условии, что:
- эта дисциплина читается не более, чем в 4-х аудиториях, и что - по этой дисциплине проводятся не более, чем 5 занятий
7)Вывести имена преподавателей кафедры ИПО и дату поступления их на работу. Результат упрядочить по месяцу поступления на работу в убывающем порядке
4.8. Вариант 8
1)Какова минимальная и максимальная зарплаты (с учетом ставки и надбавки) среди всех преподавателейпрофессоров, принятых на работу в диапазоне дат 01.01.2000-31.12.2002. Столбцы результирующей таблицы должны иметь имена: «МИН зарплата» и «МАКС зарплата»
2)По дисциплине СУБД, которую читает преподаватель Иванов, вывести следующую информацию под соответствующими именами столбцов:
- количество занятий, которые имеются в расписании |
Кол-во занятий |
- Количество групп, в которых проводятся эти занятия |
Кол-во групп |
20
