select e.employee_id,e.last_name
from employees e
where (e.department_id) in (select m.department_id from employees m where m.last_name like lower('%u%'))
4.Создайте запрос для вывода фамилии, номера отдела и должности каждого служащего, идентификатор местоположения отдела которого равен 1700.
select distinct e.last_name,e.department_id,e.job_id from employees e,departments d where d.location_id = 1700
5.Получите список фамилий и окладов всех служащих, подчинённых Кингу.
select last_name,salary, from employees where manager_id = (select employee_id from employees where manager_id is null)
6 .Получите номер отдела, фамилию и должность для каждого служащего, работающего в администрации (department_name = ‘Executive’).
select e.department_id,e.last_name,e.job_id from employees e,departments d where d.department_name like 'Executive'
7.Измените lab6_3.sql для вывода номеров, фамилий и окладов всех служащих, которые работают в одном отделе с любым служащим с буквой «u» в фамилии и оклады которых превышают средний. Сохраните новый запрос в файле lab6_7.sql. Выполните его.
select e.employee_id,e.last_name,salary
from employees e
where (e.department_id) in (select m.department_id from employees m where m.last_name like lower('%u%'))
group by e.employee_id,e.last_name,salary
having (select avg(salary) from employees)< salary
8 .Покажите номер отдела с наивысшей средней заработной платой и наименьший оклад работающегов нём сотрудника.
select department_id,min(e.salary) from employees e group by department_id having (max(select avg(m.salary) from employees m )) > ( avg(e.salary)) //доделать
9 .Выведите номера , наименования и местоположения отделов, в которых не работают торговые представители (job_id = ‘SA_REP’).
select distinct d.department_id,d.department_name,d.manager_id,d.location_id from departments d
where (d.department_id) in (select m.department_id from employees m where m.job_id not like 'SA_REP')
Лабораторная работа 8
Создание запросов, в которых используются операторы SET.
Альтернативные методы соединения.
Используя оператор SET, выведите номера отделов (department_id), в которых нет служащих с идентификатором должности (job_id) ST_CLERK.
select department_id from employees e
where not exists (select job_id from employees where job_id=e.job_id and job_id = 'ST_CLERK')
Используя оператор SET, выведите идентификаторы и наименования стран, в которых не располагаются отделы компании.
select distinct COUNTRY_ID, COUNTRY_NAME FROM COUNTRIES WHERE COUNTRY_ID IN (SELECT COUNTRY_ID FROM COUNTRIES MINUS SELECT COUNTRY_ID FROM LOCATIONS WHERE LOCATION_ID IN (SELECT LOCATION_ID FROM DEPARTMENTS))
Используя оператор SET, выведите список должностей отделов 10, 50 и 20 в таком же порядке отделов. Выведите столбцы job_id и department_id.
select job_id,department_id from
(select 1 as id,job_id,department_id from employees where department_id=10
union
select 2 as id,job_id,department_id from employees where department_id=50
union
select 3 as id,job_id,department_id from employees where department_id=20)
Выведите номер сотрудника и идентификатор его должности, если его текущая должность совпадает с той, которую он уже занимал, работая в компании.
select e.employee_id,e.job_id from job_history j,employees e where e.job_id=j.job_id and e.employee_id=j.employee_id
union
select j.employee_id,j.job_id from job_history j,employees e where e.job_id=j.job_id and e.employee_id=j.employee_id
Напишите составной запрос, который выводит следующее:
Номера и отделы всех сотрудников из таблицы EMPLOYEES, независимо от того, относятся ли они к какому-то отделу или нет;
Номера и наименования всех отделов из таблицы DEPARTMENTS, независимо от того, есть ли в них сотрудники или нет.
select employee_id,department_id,NULL,NULL from employees
union
select NULL as department_id,NULL as department_name,department_id,department_name from departments
Лабораторная работа 9
Создание многостолбцовых подзапросов
Написание связанных подзапросов
Использование оператора EXIST
Использование скалярных подзапросов
Использование предложения WITH
Создайте запрос для вывода фамилии, номера отдела и оклада всех служащих, чей номер отдела и оклад совпадают с номером отдела и окладом любого служащего, зарабатывающего комиссионные.
select last_name,department_id,salary from employees e
where exists (select * from employees d where e.department_id=d.department_id and e.salary=d.salary and e.commission_pct is not null)
Выведите фамилию, название отдела и оклад всех служащих, чей оклад и комиссионные совпадают с окладом и комиссионными любого служащего, работающего в отделе, местоположение которого (Location_ID).
select last_name,department_name,salary
from employees e,departments d where (salary ,commission_pct) in (select e.salary, e.commission_pct from departments d,employees er where e.department_id = d.department_id and location_id = 2500)
С оздайте запрос для вывода фамилии, даты найма и оклада всех служащих, которые получают такой же оклад и такие же комиссионные, как Kochhar. Не выводите данные о сотруднике Kochhar.
select e.last_name,e.hire_date,e.salary from employees e where (e.hire_date,e.salary) in
(select h.hire_date,h.salary from employees h where exists
(select d.last_name from employees d where last_name = 'Kochhar' and h.salary=d.salary) and last_name <> 'Kochhar')
Выведите фамилию, должность и оклад всех служащих, оклад которых превышает оклад каждого клерка торгового менеджера (JOB_ID = ‘SA_MAN’). Отсортируйте результаты по убыванию окладов.
Выведите номера, фамилии и отделы служащих, живущих в городах, названия которых начинаются с буквы Т.
4)select last_name,job_id,salary from employees where salary >(select min(salary) from employees where job_id ='SA_MAN' )and job_id <> 'SA_MAN'
5) select employee_id,last_name,department_id from employees e where exists (select department_id from departments where location_id in(select location_id from locations where city like 'T%'))
Н апишите запрос для нахождения всех сотрудников, которые зарабатывают больше среднего оклада по их отделу. Выведите фамилию, оклад, номер отдела и средний оклад по отделу. Отсортируйте результаты по средней зарплате. Используйте псевдонимы для выбираемых столбцов.
select e.last_name ename,e.salary ,e.department_id deptno,(select avg(f.salary) from employees f where f.department_id = e.department_id ) dept_avg from employees e
where (select avg(f.salary) from employees f where f.department_id = e.department_id ) < e.salary order by 4
Найдите всех сотрудников, не являющихся руководителями. Выполните это с помощью оператора NOT EXIST.
select e.last_name from employees e where not exists ( select m.last_name from employees m where m.manager_id = e.employee_id )
Может ли это же быть сделано с помощью оператора NOT IN? нет
Выведите фамилии сотрудников, зарабатывающих меньше среднего оклада по их отделу.
select e.last_name from employees e where salary in(select salary from employees where salary < ( select avg(m.salary) from employees m where m.department_id = e.department_id ))
Выведите фамилии сотрудников, у которых есть коллеги по отделу, которые были приняты на работу позже, но имеют более высокий оклад.
select e.last_name from employees e where exists ( select m.last_name from employees m where m.hire_date >e.hire_date and m.salary > e.salary and m.department_id=e.department_id )
Выведите номера, фамилии и наименования отделов всех сотрудников. Используйте скалярный подзапрос в команде SELECT для вывода наименований отделов.
select e.employee_id,e.last_name,(select d.department_name from departments d where d.department_id=e.department_id) department from employees e
Напишите запрос для вывода наименования отделов и фондов заработной платы отделов, размер которых больше 1/8 от общего фонда заработной платы всей компании. Используйте предложение WITH для создания запроса. Назовите запрос SUMMARY. WITH summary AS (
SELECT department_id,sum(salary) as summaryq
FROM employees e
group by department_id
having sum(salary)>(select sum(salary) from employees)/8)
SELECT department_name,summaryq from summary,departments d
Where summary.department_id=d.department_id
Лабораторная работа 10
Отличие иерархических запросов от неиерархических
Обход дерева
Получение отчёта с отступом с помощью псевдостолбца LEVEL
Отсечение структур дерева
Сортировка выходных данных
Напишите отчёт, в котором отражена структура отдела, которым руководит Mourgos. Выведите фамилии, оклады и номер отдела сотрудников.
select last_name,salary,department_id from employees
start with last_name = 'Mourgos'
connect by prior employee_id=manager_id
Создайте отчёт, который показывает иерархию менеджеров, которым подчиняется сотрудник Lorentz. Выведите сначала менеджера, перед которым непосредственно отчитывается Lorentz.
select last_name from employees where last_name <> 'Lorentz'
start with last_name = 'Lorentz'
connect by prior manager_id=employee_id
Создайте отчёт с отступом, в котором отражается иерархия управления, начиная с сотрудника по фамилии Kochhar. Выведите фамилии, номера менеджеров и номера отделов сотрудников. Назовите столбцы как показано в примере выходных результатов.
select rpad('_',(level-1)*2,'_')||last_name name,manager_id mgr,department_id deptno from employees
start with last_name = 'Kochhar'
connect by prior employee_id=manager_id
order by level
Создайте отчёт, отражающий иерархию управления компанией. Начните с сотрудника самого высокого уровня и исключите из выходных данных всех служащих с идентификатором должности IT_PROG, а также сотрудника De Haan и всех, кто перед ним отчитывается.
select last_name name,employee_id ,manager_id from employees
start with manager_id is null
connect by prior employee_id=manager_id
order by level