
Управление данными УД / Управление данными_ИСТ-11-12-15 / ИСТ-15 / 4-Основы SQL 2 / Зыбин SQL-2
.docxСанкт-Петербургский Государственный Университет Телекоммуникаций
имени профессора М. А. Бонч – Бруевича.
Кафедра: Безопасности Информационных Систем (БИС)
Дисциплина: Управление Данными (УД)
Отчет к лабораторной работе №4
Тема: «Основы языка SQL»
Выполнил:
студент группы ИСТ-15
Зыбин С. Ю.
Санкт-Петербург
2014
Цель работы: составить SQL запросы к исходным данным с таблиц hr.
Ход работы:
1) Напишите запрос для вывода самого высокого, самого низкого и среднего оклада по всем служащим, а также суммы всех окладов. Назовите столбцы Maximum, Minimum, Averageи Sum. Округлите суммы до ближайшего целого значения.
SELECT MAX(salary) Maximum, MIN(salary) Minimum, ROUND(AVG(salary)) Average, SUM(salary) Sum
FROM employees;
2) Напишите запрос для вывода должности и количества служащих, занимающих каждую должность
SELECT COUNT(employees.job_id) ID, job_title TITLE
FROM employees INNER JOIN jobs
ON employees.job_id = jobs.job_id
GROUP BY job_title;
3) Получите количество служащих, имеющих подчинённых, без их перечисления. Назовите столбец NumberofManagers.
SELECT COUNT(distinct(manager_id)) as "Number of Managers"
FROM employees
WHEREmanager_id is not null;
4) Напишите запрос для вывода разности между самым высоким и самым низким окладами. Назовите столбец DIFFERENCE
SELECT (MAX(salary) - MIN(salary)) DIFFERENCE
FROM employees;
5) Напишите запрос для вывода номера каждого менеджера, имеющего подчинённых, и заработную плату самого низкооплачиваемого из его подчинённых. Исключите менеджеров для которых неизвестны их менеджеры. Исключите все группы, где минимальный оклад составляет менее $6000.
SELECT manager_id, MIN(salary)
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary) > 6000;
6) Напишите запрос для вывода фамилии, должности, номера отдела и названия отдела всех служащих, работающих в городе Toronto.
SELECT Employees.last_name, Employees.job_id, Employees.department_id, Departments.department_name
FROM employees
INNER JOIN departments
ON employees.department_id=departments.department_id
Where departments.location_id = (SELECT location_id from locations where locations.city = 'Toronto');
7) Выведите фамилии и зарплаты служащих вместе с фамилиями и зарплатами их начальников.
SELECT sl.last_name AS LAST_NAME_SL, sl.salary AS SALARY_SL, na.last_name AS LAST_NAME_NA, na.salary AS SALARY_NA
FROM employees sl JOIN employees na
ON sl.manager_id=na.manager_id;
8) Создайте запрос для вывода фамилий и дат найма всех служащих, нанятых после Davies.
SELECT e.last_name, e.hire_date
FROM employees e JOIN employees Davies
ON (Davies.last_name='Davies')
WHERE Davies.hire_date<e.hire_date;
9) По всем служащим, нанятым раньше своих менеджеров, выведите фамилии и даты найма самих служащих, а также фамилии и даты найма их менеджеров. Назовите столбцы Employee, EmpHired, Managerи ManagerHired.
SELECT m.last_name, m.hire_date, n.last_name, n.hire_date
FROM employees m, employees n
WHERE m.manager_id = n.manager_id
AND m.hire_date < n.hire_date;
10) Выведите номера, наименования и местоположение всех отделов, а также количество работающих в них сотрудников. Обеспечьте вывод отделов, в которых нет сотрудников.
SELECT emp.department_id, dep.department_name, dep.location_id, count(emp.employee_id)
FROM employees emp join departments dep
ON (emp.department_id(+)=dep.department_id)
GROUP BY emp.department_id, dep.department_name, dep.location_id;
11) Напишите запрос для вывода фамилий, названия отдела и города, в котором он находится, для всех служащих, зарабатывающих комиссионные.
SELECT e.last_name, d.department_name, l.city
FROM employees e, departments d, locations l
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id
AND e.commission_pct IS NOT NULL;
12) Создайте запрос для вывода фамилии и даты найма каждого служащего, работающего в одном отделе с Zlotkey. Исключите Zlotkey из выходных данных.
SELECT last_name, hire_date
FROM employees
WHERE department_id = (select department_id from employees where last_name = 'Zlotkey')
AND not last_name = 'Zlotkey'
13) Создайте запрос для вывода номеров и фамилий всех служащих, оклад которых выше среднего. Отсортируйте данные в порядке увеличения окладов.
SELECT last_name, employee_id
FROM employees
WHERE salary > (select avg(salary) from employees)
ORDER BY salary;
14) Получите список фамилий и окладов всех служащих, подчинённых Кингу.
SELECT e.last_name, e.salary
FROM employees e, employees n
WHERE e.manager_id = n.employee_id
AND n.last_name = 'King';
15) Покажите номер отдела с наивысшей средней заработной платой и наименьший оклад работающего в нём сотрудника.
SELECT department_id, min(salary), round(avg(salary))
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (SELECT MAX(AVG(salary))
FROM employees GROUP BY department_id );
16) Выведите номера, наименования и местоположения отделов, в которых не работают торговые представители (job_id = ‘SA_REP’).
SELECT distinct e.department_id, d.department_name, l.street_address, l.city
FROM employees e, departments d, locations l
WHERE e.job_id != 'SA_REP' AND e.department_id = d.department_id AND d.location_id = l.location_id;
17) Выведите идентификаторы и наименования стран, в которых не располагаются отделы компании.
SELECT country_id, country_name
FROM countries
WHERE country_id not in (SELECT distinct locations.country_id as country
FROM locations
JOIN departments
ON locations.location_id = departments.location_id );
Вывод: в данной лабораторной работе были изучены и применены основные запросы SLQ на примере таблиц в СУБД Oracle. Полученные практические навыки являются полезными при работе с уже существующей базой данных, так как позволяют легко и быстро получить из неё необходимую информацию.