Подчиненные запросы

Содержание

Слайд 2

SELECT Студент.Фамилия FROM Студент LEFT JOIN Оценки ON Студент.[код студента] =

SELECT Студент.Фамилия
FROM Студент LEFT JOIN Оценки ON Студент.[код студента] = Оценки.[Код

студента]
WHERE [Код_ дисциплины] IS NULL;

Или:
SELECT Студент.Фамилия
FROM Студент WHERE [код студента]
NOT IN (SELECT [код студента] FROM оценки)

Слайд 3

Подзапрос создаёт временную таблицу, содержимое которой извлекается и обрабатывается внешним оператором

Подзапрос создаёт временную таблицу, содержимое которой извлекается и обрабатывается внешним оператором

(обычно предикатом внешнего запроса в предложении WHERE или HAVING).
Текст подзапроса должен быть заключён в круглые скобки.
Слайд 4

Подзапрос может вернуть следующее число значений: · одно значение, · столбец

Подзапрос может вернуть следующее число значений:
· одно значение,
· столбец значений,


· таблицy значений (несколько столбцов):
Слайд 5

1. При возврате одного значения обычно используются операторы сравнения. Например, вывести

1. При возврате одного значения обычно используются операторы сравнения.
Например, вывести

данные об объектах недвижимости, цены которых не превышают средней цены объектов.
SELECT * FROM PROPERTY
WHERE Selling_price < =
(SELECT AVG(selling_price) FROM PROPERTY)
Слайд 6

SELECT [код студента] FROM оценки GROUP BY [код студента] HAVING AVG(оценка)>(SELECT AVG(оценка) FROM оценки)

SELECT [код студента]
FROM оценки
GROUP BY [код студента]
HAVING AVG(оценка)>(SELECT
AVG(оценка) FROM оценки)

Слайд 7

2. При возврате множества значений (одного столбца) используется проверка на принадлежность

2. При возврате множества значений (одного столбца) используется проверка на принадлежность

к множеству (IN), а также операторы ANY и ALL, которые используются совместно с операторами сравнения.
ANY(SOME) – условие верно, если хотя бы одно значение, которое вернул подзапрос, удовлетворяет заданному условию;
ALL – условие верно, если все значения, которые вернул подзапрос, удовлетворяют заданному условию.
Слайд 8

Например, следующий запрос вернёт сведения об объектах собственности, осмотренных покупателями. SELECT

Например, следующий запрос вернёт сведения об объектах собственности, осмотренных покупателями.
SELECT

* FROM PROPERTY
WHERE Property_No IN (SELECT Property_No FROM Viewing);
Слайд 9

Слайд 10

Или SELECT * FROM PROPERTY WHERE Property_No = ANY (SELECT Property_No FROM Viewing);

Или
SELECT * FROM PROPERTY
WHERE Property_No = ANY (SELECT Property_No FROM Viewing);

Слайд 11

Однако, оператор ANY может использовать другие операторы сравнения кроме равенства, и

Однако, оператор ANY может использовать другие операторы сравнения кроме равенства, и

таким образом делать сравнения которые являются выше возможностей IN.
Слайд 12

Следующий запрос возвращает фамилии тех сотрудников отделения 2, которые получают более

Следующий запрос возвращает фамилии тех сотрудников отделения 2, которые получают более

высокую заработную плату, чем какой-либо из сотрудников отделения 1.
SELECT Fname
FROM STAFF
WHERE Branch_No = 2 AND SALARY > ANY
(SELECT SALARY FROM STAFF Where Branch_no=1);
Слайд 13

FNAME Branch_no SALARY Батуркин 3 2500000,00 Чубаро 1 5060000,00 Коваленко 3

FNAME Branch_no SALARY
Батуркин 3 2500000,00
Чубаро 1 5060000,00
Коваленко 3 2500000,00
Логинов 1 2000000,00
Суворов 3 3800000,00
Ганущенко 2 1800000,00
Жарков 2 4200000,00
Сотникова 3 7000000,00
Янчиленко 2 1500000,00

FNAME
Жарков

Слайд 14

ALL: предикат является верным, если каждое значение выбранное подзапросом удовлетворяет условию в предикате внешнего запроса.

ALL:
предикат является верным, если каждое значение выбранное подзапросом удовлетворяет условию

в предикате внешнего запроса.
Слайд 15

Следующий запрос возвращает фамилии тех сотрудников отделения 2, которые получают более

Следующий запрос возвращает фамилии тех сотрудников отделения 2, которые получают более

высокую заработную плату, чем любой из сотрудников отделения 1.
1)
SELECT Fname
FROM STAFF
WHERE Branch_No = 2 AND SALARY > ALL
(SELECT SALARY FROM STAFF Where Branch_no=1);
Слайд 16

2) SELECT Fname FROM STAFF WHERE Branch_No = 2 AND SALARY

2)
SELECT Fname
FROM STAFF
WHERE Branch_No = 2 AND SALARY >
(SELECT MAX(SALARY)FROM

STAFF Where Branch_no=1);
Слайд 17

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

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

"равным для всех" результатом подзапроса только если все результаты идентичны.
Слайд 18

3. При возврате подзапросом таблицы (множество столбцов) можно проверить только факт

3. При возврате подзапросом таблицы (множество столбцов) можно проверить только факт

наличия данных с помощью оператора EXISTS (если подзапрос ничего не возвращает, то результат - ложь)
SELECT *
FROM T1
WHERE EXISTS (SELECT * FROM T2);
Слайд 19

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

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

которая всегда возвращает значение.
Слайд 20

В предложении HAVING также могут использоваться подзапросы. Например: вывести список отделений

В предложении HAVING также могут использоваться подзапросы.
Например: вывести список отделений

компании, в которых средняя заработная плата сотрудников превышает среднюю заработную плату всех сотрудников компании.
SELECT branch_no, avg(salary) from staff group by branch_no having avg(salary)>(select avg(salary)from staff )
Слайд 21

SELECT Staff_no, SALARY FROM STAFF WHERE SALARY BETWEEN (SELECT AVG(SALARY) FROM

SELECT Staff_no, SALARY
FROM STAFF
WHERE SALARY BETWEEN
(SELECT AVG(SALARY) FROM STAFF)
AND
(SELECT SALARY FROM

STAFF WHERE Position='директор')

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

Слайд 22

Связанные (соотнесенные) подзапросы Возможны случаи, когда подзапрос должен использовать данные из

Связанные (соотнесенные) подзапросы
Возможны случаи, когда подзапрос должен использовать данные из внешнего

запроса.
Пример. Вывести данные тех агентов из таблицы Staff, в ведении которых находится ровно два объекта.
Слайд 23

Слайд 24

Запрос SELECT * FROM STAFF WHERE 2 IN (SELECT COUNT(*) FROM

Запрос
SELECT *
FROM STAFF
WHERE 2 IN (SELECT COUNT(*) FROM Property GROUP

BY Staff_no)
вернет список всех агентов (Staff_no) , имеющихся в таблице Property, если хотя бы у одного из агентов имеется в ведении два объекта.
Слайд 25

SELECT * FROM STAFF WHERE 2 = (SELECT COUNT(*) FROM Property GROUP BY Staff_no)

SELECT *
FROM STAFF
WHERE 2 = (SELECT COUNT(*) FROM Property GROUP BY

Staff_no)
Слайд 26

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

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

подзапрос:
SELECT *
FROM Staff a WHERE 2 = (SELECT COUNT(*) FROM Property
WHERE staff_no=a.staff_no)
Слайд 27

Просматривается таблица Staff, из нее берется одна очередная запись и переписывается

Просматривается таблица Staff, из нее берется одна очередная запись и переписывается

в таблицу с именем а.
Для этой записи выполняется подзапрос – подсчитывается количество записей таблицы Property, приходящихся на агента с данным Staff_no. Далее проверяется, равно ли это количество 2 и, если это условие выполняется, то запись кандидат заносится в выходной набор. Затем берется следующая запись из таблицы Staff.
Слайд 28

a Cеменов … Property

a

Cеменов …
Property

Слайд 29

Этот же результат может быть получен при помощи более простого запроса:

Этот же результат может быть получен при помощи более простого запроса:
SELECT

Staff_no FROM Property
GROUP BY Staff_no
HAVING COUNT(*)=2
Слайд 30

SELECT FNAME, Branch_no SALARY FROM STAFF S WHERE SALARY > (SELECT

SELECT FNAME, Branch_no SALARY
FROM STAFF S
WHERE SALARY >
(SELECT AVG(SALARY) FROM STAFF


WHERE Staff.Branch_no=S.Branch_no)

Вывести список сотрудников, зарплата которых выше средней зарплаты сотрудников своего отделения

Слайд 31

FNAME Branch_no SALARY Батуркин 3 2500000,00 Чубаро 1 5060000,00 Коваленко 3

FNAME Branch_no SALARY
Батуркин 3 2500000,00
Чубаро 1 5060000,00
Коваленко 3 2500000,00
Логинов 1 2000000,00
Суворов 3 3800000,00
Жарков 2 4200000,00
Ганущенко 2 1800000,00
Сотникова 3 7000000,00
Янчиленко 2 1500000,00

S
FNAME Branch_no SALARY
Батуркин 3 2500000,00

Staff

Слайд 32

Пример связанного запроса: Вывести список продавцов, имеющих объекты собственности в Витебске

Пример связанного запроса:
Вывести список продавцов, имеющих объекты собственности в Витебске
SELECT *
FROM

Owner
WHERE ‘Витебск’ IN
(SELECT City FROM Property WHERE Property. Owner_no=
Owner.Owner_no)
Слайд 33

Примеры. Вывести список владельцев собственности, чьи объекты были осмотрены в определенный

Примеры.
Вывести список владельцев собственности, чьи объекты были осмотрены в определенный день:


SELECT OWNER.Owner_no, FName, LName
FROM OWNER INNER JOIN PROPERTY
ON PROPERTY.Owner_no=OWNER.Owner_no
WHERE PROPERTY.Property_no=(SELECT Property_no
FROM VIEWING
WHERE Date_View=’18.01.11’);
Слайд 34

Слайд 35

В таблице VIEWING будет найдена соответствующая дата и передана в предложение

 
В таблице VIEWING будет найдена соответствующая дата и передана в предложение

WHERE. После определения даты в основном запросе из таблицы PROPERTY будут отобраны записи, удовлетворяющие заданному условию.
(В данном примере предполагается, что подзапрос должен вернуть только одно значение).
Слайд 36

Использование оператора EXISTS Оператор EXISTS проверяет, возвращает ли подчиненный запрос хотя

Использование оператора EXISTS
Оператор EXISTS проверяет, возвращает ли подчиненный запрос хотя

бы одну строку. Для проверки противоположного значения используется предикат NOT EXISTS.
Слайд 37

Пример. Вывести данные об объектах собственности из таблицы PROPERTY только в

Пример. Вывести данные об объектах собственности из таблицы PROPERTY только в том

случае, если хотя бы один из них был осмотрен покупателями, и было получено согласие на приобретение:
SELECT *
FROM PROPERTY
WHERE EXISTS (SELECT Property_no FROM VIEWING
WHERE Comments=’согласен’);
Слайд 38

Property 2003-03-31 согласен 3000 4 2012-03-25 требует ремонта 3001 7 2012-03-25

Property

2003-03-31 согласен 3000 4
2012-03-25 требует ремонта 3001 7
2012-03-25 согласен 3002 1
2012-01-18

не согласен 3002 4
2012-01-17 согласен 3003 1
2012-01-19 согласен 3005 2

VIEWING

Слайд 39

Слайд 40

Вывести данные об объектах собственности из таблицы PROPERTY проданных покупателям

Вывести данные об объектах собственности из таблицы PROPERTY проданных покупателям

Слайд 41

SELECT * FROM PROPERTY WHERE EXISTS (SELECT Property_no FROM VIEWING WHERE Comments=‘согласен' AND property.property_no=viewing.property_no)

SELECT *
FROM PROPERTY
WHERE EXISTS (SELECT Property_no FROM VIEWING
WHERE Comments=‘согласен'

AND property.property_no=viewing.property_no)
Слайд 42

SELECT * FROM PROPERTY INNER JOIN VIEWING ON Property.Property_no= VIEWING.Property_no WHERE Comments=‘согласен'

SELECT *
FROM PROPERTY INNER JOIN VIEWING ON Property.Property_no=
VIEWING.Property_no
WHERE Comments=‘согласен'

Слайд 43

SELECT * FROM PROPERTY WHERE Property_no in (SELECT Property_no FROM VIEWING WHERE Comments=‘согласен')

SELECT *
FROM PROPERTY WHERE Property_no in (SELECT Property_no FROM VIEWING WHERE

Comments=‘согласен')
Слайд 44

SELECT * FROM PROPERTY WHERE Property_no = ANY(SELECT Property_no FROM VIEWING WHERE Comments='согласен')

SELECT *
FROM PROPERTY WHERE Property_no = ANY(SELECT Property_no FROM VIEWING WHERE

Comments='согласен')
Слайд 45

SELECT Btel_no FROM Branch WHERE EXISTS (SELECT Staff_no FROM Staff WHERE

SELECT Btel_no
FROM Branch
WHERE EXISTS
(SELECT Staff_no
FROM Staff
WHERE position=‘менеджер' AND Staff.Branch_No =

Branch.Branch_No )

Найти номера телефонов отделений, среди служащих которых имеются менеджеры.

Слайд 46

Слайд 47

Слайд 48

SELECT * FROM Branch WHERE (SELECT count(*) FROM Staff WHERE (position

SELECT *
FROM Branch
WHERE
(SELECT count(*)
FROM Staff
WHERE (position = ‘менеджер') AND

(Staff.Branch_No = Branch.Branch_No)) > 0

Запросы с предикатом
EXISTS можно переформулировать в виде запросов с предикатом сравнения

Слайд 49

Порождаемые таблицы

Порождаемые таблицы

Слайд 50

Найти максимальную из средних заработных плат отделений компании SELECT max(avg(SALARY) FROM STAFF GROUP BY branch_no)

Найти максимальную из средних заработных плат отделений компании

SELECT max(avg(SALARY) FROM STAFF

GROUP BY branch_no)
Слайд 51

Staff_no FName LName DOB Sex City Street House Flat Stel_no Date_Joined Position Salary Branch_no STAFF

Staff_no
FName
LName
DOB
Sex
City
Street
House
Flat
Stel_no
Date_Joined
Position
Salary
Branch_no

STAFF

Слайд 52

Branch_no Avgsal 1 3250000,00 2 2600000,00 3 7575000,00 4 1500000,00

Branch_no Avgsal
1 3250000,00
2 2600000,00
3 7575000,00
4 1500000,00

Слайд 53

SELECT max(avgsal) FROM (SELECT Branch_no, AVG(salary)AS avgsal FROM staff GROUP BY branch_no)…

SELECT max(avgsal)
FROM (SELECT Branch_no, AVG(salary)AS avgsal FROM staff GROUP BY

branch_no)…
Слайд 54

SELECT max(avgsal) FROM (SELECT Branch_no, AVG(salary)AS avgsal FROM staff GROUP BY branch_no) AS tbl

SELECT max(avgsal)
FROM (SELECT Branch_no, AVG(salary)AS avgsal FROM staff GROUP BY branch_no)

AS tbl
Слайд 55

SELECT max(avgsal) FROM (SELECT Branch_no, AVG(salary)FROM staff GROUP BY branch_no) AS tbl(br,avgsal)

SELECT max(avgsal)
 FROM (SELECT Branch_no, AVG(salary)FROM staff GROUP BY branch_no)
AS tbl(br,avgsal)

Слайд 56

Cсуществует возможность указывать в разделе FROM не только ссылки на таблицы,

Cсуществует возможность указывать в разделе FROM не только ссылки на таблицы,

но и запросы.
Результатом вычисления выражения запросов в SQL является таблица. Следовательно, в любой конструкции языка, где может присутствовать ссылка на таблицу SQL, допускается присутствие выражения запросов.
Слайд 57

Вывести список объектов собственности, которые не осматривались покупателями Property

Вывести список объектов собственности, которые не осматривались покупателями

Property

Слайд 58

2003-03-31 согласен 3000 4 2012-03-25 требует ремонта 3001 7 2012-03-25 согласен

2003-03-31 согласен 3000 4
2012-03-25 требует ремонта 3001 7
2012-03-25 согласен 3002 1
2012-01-18 не

согласен 3002 4
2012-01-17 согласен 3003 1
2012-01-19 согласен 3005 2
Слайд 59

1) SELECT Property_no FROM PROPERTY WHERE PROPERTY_No NOT IN (SELECT Property_no FROM VIEWING)

1)
SELECT Property_no
FROM PROPERTY
WHERE PROPERTY_No NOT IN (SELECT Property_no FROM

VIEWING)
Слайд 60

2) SELECT PROPERTY.Property_no FROM PROPERTY LEFT JOIN VIEWING ON PROPERTY. Property_no= VIEWING.Property_no WHERE VIEWING.Property_No IS NULL

2)
SELECT PROPERTY.Property_no
FROM PROPERTY LEFT JOIN VIEWING ON PROPERTY. Property_no= VIEWING.Property_no
WHERE

VIEWING.Property_No IS NULL
Слайд 61

3) SELECT Property_no FROM PROPERTY WHERE NOT EXISTS (SELECT PROPERTY_no FROM VIEWING)

3)
SELECT Property_no
FROM PROPERTY
WHERE NOT EXISTS (SELECT PROPERTY_no FROM VIEWING)

Слайд 62

3) SELECT Property_no FROM PROPERTY WHERE NOT EXISTS (SELECT PROPERTY_no FROM VIEWING WHERE VIEWING.Property_no=PROPERTY.Property_no)

3)
SELECT Property_no
FROM PROPERTY
WHERE NOT EXISTS (SELECT PROPERTY_no FROM VIEWING WHERE VIEWING.Property_no=PROPERTY.Property_no)

Слайд 63

Вывести список объектов, цена которых выше средней.

Вывести список объектов, цена которых выше средней.

Слайд 64

Слайд 65

Слайд 66

SELECT PROPERTY_no FROM PROPERTY WHERE selling_Price>(SELECT AVG(selling_price)FROM PROPERTY)

SELECT PROPERTY_no
FROM PROPERTY
WHERE selling_Price>(SELECT AVG(selling_price)FROM PROPERTY)

Слайд 67

Вывести список объектов, цена которых выше средней в своем отделении. SELECT

Вывести список объектов, цена которых выше средней в своем отделении.
SELECT PROPERTY_no


FROM PROPERTY a
WHERE selling_Price>(SELECT AVG(selling_price)FROM PROPERTY WHERE PROPERTY.Branch_no= a.Branch_no)
Слайд 68

В каком городе продаётся самая дешёвая квартира

В каком городе продаётся самая дешёвая квартира

Слайд 69

SELECT City, MIN(selling_price) FROM property GROUP BY City

SELECT City,
MIN(selling_price)
FROM property
GROUP BY City

Слайд 70

Витебск 15000,00 Новопол 2000,00 Полоцк 2000,00

Витебск 15000,00
Новопол 2000,00
Полоцк 2000,00

Слайд 71

SELECT City FROM property WHERE selling_price = (SELECT MIN(selling_price) FROM PROPERTY)

SELECT City
FROM property WHERE selling_price
=
(SELECT MIN(selling_price) FROM PROPERTY)

Слайд 72

В каких городах средняя цена квартиры не превышает 40000

В каких городах средняя цена квартиры не превышает 40000

Слайд 73

Слайд 74

SELECT City, FROM PROPERTY GROUP BY CITY HAVING AVG(selling_price)

SELECT City,
FROM PROPERTY
GROUP BY CITY
HAVING AVG(selling_price) <40000

Слайд 75

Без группировки SELECT City FROM PROPERTY a WHERE (SELECT AVG(selling_price) FROM PROPERTY WHERE PROPERTY.City = a.CITY)

Без группировки
SELECT City
FROM PROPERTY a
WHERE
(SELECT AVG(selling_price) FROM PROPERTY WHERE

PROPERTY.City = a.CITY)<40000
Слайд 76

Найти номера отделений, в которых средний размер зарплаты равен максимальному размеру зарплаты сотрудников какого-либо другого отделения.

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

зарплаты сотрудников какого-либо другого отделения.
Слайд 77

SELECT Branch_no, AVG(SALARY) FROM STAFF a GROUP BY Branch_no HAVING AVG(SALARY)

SELECT Branch_no, AVG(SALARY)
FROM STAFF a
GROUP BY Branch_no
HAVING AVG(SALARY) =
(SELECT MAX(SALARY)FROM

STAFF
WHERE a.branch_no<> STAFF.branch_no)
Слайд 78

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

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

тех отделов, в которых средний размер зарплаты не меньше среднего размера зарплаты сотрудников во всей компании
Слайд 79

SELECT Branch_no, min(SALARY), max(SALARY) FROM STAFF GROUP BY Branch_no HAVING AVG(SALARY) >(SELECT AVG(SALARY) FROM STAFF)

SELECT Branch_no, min(SALARY),
max(SALARY)
FROM STAFF
GROUP BY Branch_no
HAVING AVG(SALARY) >(SELECT AVG(SALARY) FROM STAFF)

Слайд 80

Во всех отделах найти фамилии и число служащих, у которых в

Во всех отделах найти фамилии и число служащих, у которых в

данном отделе имеются однофамильцы и фамилии которых совпадают с фамилиями руководителей их отделов.
Слайд 81

Staff_no FName LName DOB Sex City Street House Flat Stel_no Date_Joined Position Salary Branch_no STAFF

Staff_no
FName
LName
DOB
Sex
City
Street
House
Flat
Stel_no
Date_Joined
Position
Salary
Branch_no

STAFF

Слайд 82

SELECT Branch_no, FName, COUNT(*) FROM STAFF GROUP BY Branch_no,FName HAVING COUNT(*)

SELECT Branch_no, FName, COUNT(*)
FROM STAFF
GROUP BY Branch_no,FName
HAVING COUNT(*) > 1

AND FNAME LIKE(SELECT FNAME FROM STAFF a
WHERE Position=‘директор‘ AND STAff.Branch_no=a.Branch_no)
Слайд 83

Найти самую дешевую квартиру

Найти самую дешевую квартиру

Слайд 84

SELECT * FROM PROPERTY WHERE selling_price =(SELECT MIN(selling_price)FROM PROPERTY)

SELECT *
FROM PROPERTY
WHERE selling_price =(SELECT MIN(selling_price)FROM PROPERTY)

Слайд 85

Найти номер телефона отделения, продающего самую дешёвую квартиру

Найти номер телефона отделения, продающего самую дешёвую квартиру

Слайд 86

SELECT Btel_no FROM PROPERTY INNER JOIN BRANCH ON PROPERTY.BRANCH_no=BRANCH. BRANCH_no WHERE selling_price =(SELECT MIN(selling_price)FROM PROPERTY)

SELECT Btel_no
FROM PROPERTY INNER JOIN BRANCH ON PROPERTY.BRANCH_no=BRANCH. BRANCH_no
WHERE

selling_price =(SELECT MIN(selling_price)FROM PROPERTY)
Слайд 87

SELECT Btel_no FROM Branch WHERE Branch_no IN(SELECT branch_no FROM PROPERTY WHERE

SELECT Btel_no
FROM Branch
WHERE Branch_no IN(SELECT
branch_no FROM PROPERTY

WHERE Property_no IN(SELECT
PROPERTY_no FROM PROPERTY
WHERE selling_price=(SELECT
MIN(selling_price)FROM
PROPERTY)))
Слайд 88

Создание таблицы из набора результатов При помощи оператора SELECT INTO можно

Создание таблицы из набора результатов
При помощи оператора SELECT INTO можно поместить

набор результатов запроса в новую таблицу. Кроме того, этот оператор позволяет создавать временные таблицы. Запросы к временной таблице иногда оказываются проще тех, которые пришлось бы выполнять, обращаясь к нескольким таблицам или базам данных. Оператор SELECT INTO позволяет создать локальную или глобальную временную таблицу.
Например, создать таблицу, содержащую объекты собственности, находящиеся в городе Полоцке.
SELECT *
INTO ##PROPERTY_POLOCK
FROM PROPERTY
WHERE City=’Полоцк’
Слайд 89

Найти максимальную из средних заработных плат отделений компании

Найти максимальную из средних заработных плат отделений компании