Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 / кр2

.docx
Скачиваний:
1
Добавлен:
16.05.2025
Размер:
479.71 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

Кафедра 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. Была создана БД, схема данных в ней и таблицы, таблицы были заполнены данными, и мы выполнили сложные запросы на выборку данных согласно варианту.

Соседние файлы в папке 2