
2 / кр2
.docxМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
Кафедра 41
ПРЕПОДАВАТЕЛЬ
Доцент, канд. техн. наук |
|
|
|
Е. Л. Турнецкая |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
Контрольная работа №2
Знакомство с СУБД POSTGRESQL.
по курсу: Базы данных
СТУДЕНТКА ГР. № |
Z0411 |
|
25.01.24 |
|
М. В. Карелина |
|
|
номер группы |
|
подпись, дата |
|
инициалы, фамилия |
Номер студенческого билета: 2020/3477
Санкт-Петербург
2024
Цель работы: познакомиться с СУБД PostgreSQL и языком запросов SQL.
Порядок выполнения работы:
1. Создайте базу данных, схему, таблицы и заполните их данными в соответствии с методическими указаниями.
2. Выполните запросы к таблицам, исходя из варианта, выданного вам преподавателем (Таблица 1).
3. Напишите отчёт о выполненной работе.
Вариант 7
- Найти количество сотрудников, в должности которых фигурирует слово «Manager».
- Найти разницу между зарплатой начальников и средней зарплатой их
подчиненных.
Ознакомимся с материалами по установке СУБД PostgreSQL, установим СУБД PostgreSQL в соответствие с инструкциями в методических материалах.
Необходимо открыть DBeaver и установить соединение с СУБД PostgreSQL. Для этого нужно ввести пароль, выбранный на этапе установки СУБД PostgreSQL.
Была создана база данных students (Рис 1, 2).
Рисунок 1 – Создание новой базы данных
Рисунок 2 – Выбор имени и кодировки БД
После создания базы данных необходимо установить соединение к ней (Рис 3).
Рисунок 3 - Кофигурация соединения postgres
Нужно создать схему «hr» в базе данных при помощи следующей команды:
CREATE SCHEMA hr;
Для того чтобы таблицы создавались в данной схеме, необходимо для базы данных students указать путь к данной схеме (поскольку схем может быть несколько, postgres нужно знать, в какой именно схеме создавать таблицы):
ALTER DATABASE students SET search_path = hr;
Посмотрим, под каким пользователем мы работаем при помощи запроса (Рис. 4):
SELECT current_user;
Рисунок 1 - Пользователь postgres
Видно, что мы работаем под пользователем postgres, который имеет все возможные права.
Создадим таблицу Jobs, которая будет содержать идентификаторы профессий, их названия, минимальную и максимальную зарплату.
CREATE TABLE jobs (
job_id varchar(10) PRIMARY KEY,
job_title varchar(35) NOT NULL,
min_salary integer,
max_salary integer);
Теперь, когда таблица создана, заполним её данными:
INSERT INTO jobs
VALUES ('AD_PRES', 'President', 20080, 40000),
('AD_VP', 'Administration Vice President', 15000, 30000),
('AD_ASST', 'Administration Assistant', 3000, 6000),
('FI_MGR', 'Finance Manager', 8200, 16000),
('FI_ACCOUNT', 'Accountant', 4200, 9000),
('SA_MAN', 'Sales Manager', 10000, 20080),
('PU_MAN', 'Purchasing Manager', 8000, 15000),
('PU_CLERK', 'Purchasing Clerk', 2500, 5500),
('ST_MAN', 'Stock Manager', 5500, 8500),
('ST_CLERK', 'Stock Clerk', 2008, 5000),
('IT_PROG', 'Programmer', 4000, 10000),
('MK_MAN', 'Marketing Manager', 9000, 15000),
('HR_REP', 'Human Resources Representative', 4000, 9000);
Создадим таблицу Departments с информацией об отделах и уникальных идентификаторах начальников этих отделов.
CREATE TABLE departments (
department_id integer PRIMARY KEY,
department_name varchar(30) NOT NULL,
manager_id integer
);
Добавим в таблицу Departments данные при помощи скрипта, представленного ниже.
INSERT INTO departments VALUES
(10, 'Administration', 51),
(20, 'Marketing', 52),
(30, 'Purchasing', 15),
(40, 'Human Resources', 53),
(50, 'Shipping', 22),
(60, 'IT', 4),
(80, 'Sales', 46),
(90, 'Executive', 1),
(100, 'Finance', 9);
Создадим таблицу Employees. В ней будет храниться информация о сотрудниках (уникальный идентификатор, имя, фамилия, идентификатор должности, зарплата, идентификатор начальника, идентификатор отдела).
В целях поддержания целостности данных таблицу Employees необходимо связать с таблицами Jobs и Departments, добавив внешние ключи (оператор «references»).
CREATE TABLE employees (
employee_id serial PRIMARY KEY,
first_name varchar(20) NOT NULL,
last_name varchar(25) NOT NULL,
job_id varchar(10) NOT NULL REFERENCES jobs (job_id),
salary integer,
manager_id integer,
department_id integer NOT NULL REFERENCES departments (department_id)
);
Добавим в таблицу Employees записи при помощи скрипта ниже.
INSERT INTO employees (first_name, last_name, job_id, salary, manager_id, department_id)
VALUES
('Steven', 'King', 'AD_PRES', 24000, NULL, 90),
('Neena', 'Kochhar', 'AD_VP', 17000, 1, 90),
('Lex', 'De Haan', 'AD_VP', 17000, 1, 90),
('Alexander', 'Hunold', 'IT_PROG', 9000, 3, 60),
('Bruce', 'Ernst', 'IT_PROG', 6000, 4, 60),
('David', 'Austin', 'IT_PROG', 4800, 4, 60),
('Valli', 'Pataballa', 'IT_PROG', 4800, 4, 60),
('Diana', 'Lorentz', 'IT_PROG', 4200, 4, 60),
('Nancy', 'Greenberg', 'FI_MGR', 12008, 2, 100),
('Daniel', 'Faviet', 'FI_ACCOUNT', 9000, 9, 100),
('John', 'Chen', 'FI_ACCOUNT', 8200, 9, 100),
('Ismael', 'Sciarra', 'FI_ACCOUNT', 7700, 9, 100),
('Jose Manuel', 'Urman', 'FI_ACCOUNT', 7800, 9, 100),
('Luis', 'Popp', 'FI_ACCOUNT', 6900, 9, 100),
('Den', 'Raphaely', 'PU_MAN', 11000, 1, 30),
('Alexander', 'Khoo', 'PU_CLERK', 3100, 15, 30),
('Shelli', 'Baida', 'PU_CLERK', 2900, 15, 30),
('Sigal', 'Tobias', 'PU_CLERK', 2800, 15, 30),
('Guy', 'Himuro', 'PU_CLERK', 2600, 15, 30),
('Karen', 'Colmenares', 'PU_CLERK', 2500, 15, 30),
('Matthew', 'Weiss', 'ST_MAN', 8000, 1, 50),
('Adam', 'Fripp', 'ST_MAN', 8200, 1, 50),
('Payam', 'Kaufling', 'ST_MAN', 7900, 1, 50),
('Shanta', 'Vollman', 'ST_MAN', 6500, 1, 50),
('Kevin', 'Mourgos', 'ST_MAN', 5800, 1, 50),
('Julia', 'Nayer', 'ST_CLERK', 3200, 21, 50),
('Irene', 'Mikkilineni', 'ST_CLERK', 2700, 21, 50),
('James', 'Landry', 'ST_CLERK', 2400, 21, 50),
('Steven', 'Markle', 'ST_CLERK', 2200, 21, 50),
('Laura', 'Bissot', 'ST_CLERK', 3300, 22, 50),
('Mozhe', 'Atkinson', 'ST_CLERK', 2800, 22, 50),
('James', 'Marlow', 'ST_CLERK', 2500, 22, 50),
('TJ', 'Olson', 'ST_CLERK', 2100, 22, 50),
('Jason', 'Mallin', 'ST_CLERK', 3300, 23, 50),
('Michael', 'Rogers', 'ST_CLERK', 2900, 23, 50),
('Ki', 'Gee', 'ST_CLERK', 2400, 23, 50),
('Hazel', 'Philtanker', 'ST_CLERK', 2200, 23, 50),
('Renske', 'Ladwig', 'ST_CLERK', 3600, 24, 50),
('Stephen', 'Stiles', 'ST_CLERK', 3200, 24, 50),
('John', 'Seo', 'ST_CLERK', 2700, 24, 50),
('Joshua', 'Patel', 'ST_CLERK', 2500, 24, 50),
('Trenna', 'Rajs', 'ST_CLERK', 3500, 25, 50),
('Curtis', 'Davies', 'ST_CLERK', 3100, 25, 50),
('Randall', 'Matos', 'ST_CLERK', 2600, 25, 50),
('Peter', 'Vargas', 'ST_CLERK', 2500, 25, 50),
('John', 'Russell', 'SA_MAN', 14000, 1, 80),
('Karen', 'Partners', 'SA_MAN', 13500, 1, 80),
('Alberto', 'Errazuriz', 'SA_MAN', 12000, 1, 80),
('Gerald', 'Cambrault', 'SA_MAN', 11000, 1, 80),
('Eleni', 'Zlotkey', 'SA_MAN', 10500, 1, 80),
('Jennifer', 'Whalen', 'AD_ASST', 4400, 2, 10),
('Michael', 'Hartstein', 'MK_MAN', 13000, 1, 20),
('Susan', 'Mavris', 'HR_REP', 6500, 2, 40);
Данные в таблицу employees добавлены, теперь необходимо добавить внешний ключ таблице departments при помощи скрипта, представленного ниже.
ALTER TABLE departments
ADD CONSTRAINT mgr_emp_fkey FOREIGN KEY (manager_id) REFERENCES employees (employee_id);
Теперь, когда таблицы созданы, схему данных можно просмотреть, выбрав пункт «Просмотреть объект «Таблицы»», кликнув правой кнопкой мыши на объект «Таблицы» в левом меню, и далее выбрав «View Dia». Результаты создания и заполнения таблиц приставлены на рисунках 5-8. Полученная схема данных представлена на Рис. 9.
Рисунок 2 – Создание таблицы jobs
Рисунок 6 – Заполненные данные таблицы jobs
Рисунок 7 – Заполненные данные таблицы departaments
Рисунок 8 – Заполненные данные таблицы employees
Рисунок 9 - Схема данных
Выполнение запросов по вариантам:
C помощью SQL-запросов найдём количество сотрудников, в должности которых фигурирует слово «Manager». Результат представлен на рисунке 10.
Рисунок 10 – Результат выполнения запроса
Необходимо найти разницу между зарплатой начальников и средней зарплатой их подчиненных. Результат представлен на рисунке 11.
Рисунок 11 – Результат выполнения запроса
Бонусное задание. Необходимо найти количество менеджеров, менеджеров отделов и остальных сотрудников.
Скрипт:
select
'dManagers' as EMP
, count(distinct d.manager_id) as CNT
from departments d
union
select
'eManagers' as EMP
,count(distinct e.manager_id) as CNT
from employees e
where e.manager_id not in (select distinct d.manager_id from departments d)
union
select
'Managerss' as EMP
, count(e.employee_id) as CNT
from employees e
where e.employee_id not in
(select distinct d.manager_id id from departments d where d.manager_id is not null
union
select distinct e.manager_id id from employees e where e.manager_id is not null)
order by emp asc
SQL оператор UNION используется для объединения результирующих наборов из 2 или более операторов SELECT. Он удаляет повторяющиеся строки между различными запросами SELECT.
SQL оператор DISTINCT используется для удаления дубликатов из результирующего набора оператора SELECT.
Результат на Рис. 12.
Рисунок 12 - Результат третьего запроса
Вывод
В ходе данной лабораторной работы приобрели навыки работы с БД в менеджере СУБД DBeaver, а также конкретно с СУБД PostgreSQL. Была создана БД, схема данных в ней и таблицы, таблицы были заполнены данными, и мы выполнили сложные запросы на выборку данных согласно варианту.