Максимальную зарплату найдите подзапросом MAX, связав сотрудника с отделом. Для средней зарплаты сгруппируйте сотрудников по отделу и используйте HAVING.
SQL‑запросы для поиска сотрудника с максимальной зарплатой и выбора отделов с высокой средней оплатой
Максимальную зарплату найдите подзапросом MAX, связав сотрудника с отделом. Для средней зарплаты сгруппируйте сотрудников по отделу и используйте HAVING.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В базе данных задана следующая схема:
// Table Departments
create table D (
Id int primary key,
Name nvarchar(100)
)
// Table Employees
create table E (
Id int primary key,
DepartmentId int foreign key references Departments(Id),
Name nvarchar(100),
Salary float
)
Требуется выполнить два запроса:
- Вывести имя сотрудника, получающего наибольшую зарплату в компании, вместе с названием его отдела.
- Сформировать список отделов, в которых средняя заработная плата превышает 1000 $.
Оба запроса должны использовать только стандартные возможности SQL (JOIN, агрегатные функции, ORDER BY, LIMIT/TOP и т.п.).
Ответ
Максимальную зарплату найдите подзапросом MAX, связав сотрудника с отделом. Для средней зарплаты сгруппируйте сотрудников по отделу и используйте HAVING.
SELECT e.Name, d.Name AS Department
FROM E e JOIN D d ON d.Id = e.DepartmentId
WHERE e.Salary = (SELECT MAX(Salary) FROM E);
SELECT d.Id, d.Name, AVG(e.Salary) AS AverageSalary
FROM D d JOIN E e ON e.DepartmentId = d.Id
GROUP BY d.Id, d.Name
HAVING AVG(e.Salary) > 1000;
Первый запрос возвращает всех сотрудников с максимальной зарплатой, включая равные значения. В DDL необходимо заменить ссылку Departments(Id) на D(Id), а комментарии // — на SQL-комментарии --. Для денежных сумм предпочтительнее DECIMAL с согласованной точностью, а не приближённый float.