-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsem3.sql
256 lines (199 loc) · 10.4 KB
/
sem3.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
-- Создание таблицы сотрудников employees
-- Эта таблица хранит данные о сотрудниках:
-- идентификатор,
-- имя,
-- должность,
-- отдел,
-- зарплату и идентификатор руководителя.
CREATE TABLE IF NOT EXISTS employees (
employee_id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
position VARCHAR(50) NOT NULL,
department VARCHAR(50) NOT NULL,
salary NUMERIC(10, 2) NOT NULL,
manager_id INT REFERENCES employees(employee_id)
);
-- Пример данных
INSERT INTO employees (name, position, department, salary, manager_id)
VALUES
('Alice Johnson', 'Manager', 'Sales', 85000, NULL),
('Bob Smith', 'Sales Associate', 'Sales', 50000, 1),
('Carol Lee', 'Sales Associate', 'Sales', 48000, 1),
('David Brown', 'Sales Intern', 'Sales', 30000, 2),
('Eve Davis', 'Developer', 'IT', 75000, NULL),
('Frank Miller', 'Intern', 'IT', 35000, 5);
SELECT * FROM employees LIMIT 10;
CREATE TABLE IF NOT EXISTS sales(
sale_id SERIAL PRIMARY KEY,
employee_id INT REFERENCES employees(employee_id),
product_id INT NOT NULL,
quantity INT NOT NULL,
sale_date DATE NOT NULL
);
-- Пример данных
INSERT INTO sales (employee_id, product_id, quantity, sale_date)
VALUES
(2, 1, 20, '2024-10-15'),
(2, 2, 15, '2024-10-16'),
(3, 1, 10, '2024-10-17'),
(3, 3, 5, '2024-10-20'),
(4, 2, 8, '2024-10-21'),
(2, 1, 12, '2024-11-01');
SELECT * FROM sales LIMIT 10;
CREATE TABLE IF NOT EXISTS products (
product_id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
price NUMERIC(10, 2) NOT NULL
);
-- Пример данных
INSERT INTO products (name, price)
VALUES
('Product A', 150.00),
('Product B', 200.00),
('Product C', 100.00);
SELECT * FROM products LIMIT 10;
-- Временная таблица
CREATE TEMP TABLE sales_temp AS
SELECT * FROM sales;
SELECT * from sales_temp LIMIT 10;
DROP TABLE sales_temp;
-- Задание 1. Придумайте временную таблицу с использованием группировки данных
-- Продажи товаров за последний месяц
CREATE TEMP TABLE current_month_sales AS
SELECT product_id, SUM(quantity) AS total_sales
FROM sales
WHERE date_part('month', sale_date) = date_part('month', CURRENT_DATE)
GROUP BY product_id;
-- Проверим данные
SELECT * FROM current_month_sales LIMIT 10;
DROP TABLE current_month_sales;
-- Views
CREATE VIEW sales_view AS
SELECT * FROM sales;
DROP VIEW sales_view;
-- Common Table Expressions
-- CTE для иерархического запроса сотрудников
-- Запрос для отображения иерархии сотрудников: менеджер и его подчиненные.
WITH employee_hierarchy AS (
SELECT e1.name AS manager, e2.name AS employee
FROM employees e1
JOIN employees e2 ON e1.employee_id = e2.manager_id
)
SELECT * FROM employee_hierarchy LIMIT 10;
-- DROP TABLE employee_hierarchy;
-- Задание 2: CTE для вычисления средней зарплаты по отделам
-- Решение 1
WITH department_avg_salary AS (
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
)
SELECT * FROM department_avg_salary;
-- ИНДЕКСЫ
EXPLAIN ANALYZE
SELECT * FROM employees WHERE department = 'Sales';
-- Индекс для ускорения запросов по полю department
-- Индекс поможет быстрее выполнять запросы, которые фильтруют по отделам.
CREATE INDEX idx_department ON employees(department);
-- Пример запроса с использованием индекса
EXPLAIN ANALYZE
SELECT * FROM employees WHERE department = 'Sales';
-- Удаление индекса
DROP INDEX idx_department;
INSERT INTO employees (name, position, department, salary, manager_id)
VALUES
('Alice Johnson', 'Manager', 'Sales', 85000, NULL),
('Bob Smith', 'Sales Associate', 'Sales', 50000, 1),
('Carol Lee', 'Sales Associate', 'Sales', 48000, 1),
('David Brown', 'Sales Intern', 'Sales', 30000, 2),
('Eve Davis', 'Developer', 'IT', 75000, NULL),
('Alice Johnson', 'Manager', 'Sales', 85000, NULL),
('Bob Smith', 'Sales Associate', 'Sales', 50000, 1),
('Carol Lee', 'Sales Associate', 'Sales', 48000, 1),
('David Brown', 'Sales Intern', 'Sales', 30000, 2),
('Eve Davis', 'Developer', 'IT', 75000, NULL),
('Alice Johnson', 'Manager', 'Sales', 85000, NULL),
('Bob Smith', 'Sales Associate', 'Sales', 50000, 1),
('Carol Lee', 'Sales Associate', 'Sales', 48000, 1),
('David Brown', 'Sales Intern', 'Sales', 30000, 2),
('Eve Davis', 'Developer', 'IT', 75000, NULL),
('Alice Johnson', 'Manager', 'Sales', 85000, NULL),
('Bob Smith', 'Sales Associate', 'Sales', 50000, 1),
('Carol Lee', 'Sales Associate', 'Sales', 48000, 1),
('David Brown', 'Sales Intern', 'Sales', 30000, 2),
('Eve Davis', 'Developer', 'IT', 75000, NULL),
('Alice Johnson', 'Manager', 'Sales', 85000, NULL),
('Bob Smith', 'Sales Associate', 'Sales', 50000, 1),
('Carol Lee', 'Sales Associate', 'Sales', 48000, 1),
('David Brown', 'Sales Intern', 'Sales', 30000, 2),
('Eve Davis', 'Developer', 'IT', 75000, NULL),
('Alice Johnson', 'Manager', 'Sales', 85000, NULL),
('Bob Smith', 'Sales Associate', 'Sales', 50000, 1),
('Carol Lee', 'Sales Associate', 'Sales', 48000, 1),
('David Brown', 'Sales Intern', 'Sales', 30000, 2),
('Eve Davis', 'Developer', 'IT', 75000, NULL),
('Alice Johnson', 'Manager', 'Sales', 85000, NULL),
('Bob Smith', 'Sales Associate', 'Sales', 50000, 1),
('Carol Lee', 'Sales Associate', 'Sales', 48000, 1),
('David Brown', 'Sales Intern', 'Sales', 30000, 2),
('Eve Davis', 'Developer', 'IT', 75000, NULL),
('Alice Johnson', 'Manager', 'Sales', 85000, NULL),
('Bob Smith', 'Sales Associate', 'Sales', 50000, 1),
('Carol Lee', 'Sales Associate', 'Sales', 48000, 1),
('David Brown', 'Sales Intern', 'Sales', 30000, 2),
('Eve Davis', 'Developer', 'IT', 75000, NULL),
('Alice Johnson', 'Manager', 'Sales', 85000, NULL),
('Bob Smith', 'Sales Associate', 'Sales', 50000, 1),
('Carol Lee', 'Sales Associate', 'Sales', 48000, 1),
('David Brown', 'Sales Intern', 'Sales', 30000, 2),
('Eve Davis', 'Developer', 'IT', 75000, NULL),
('Alice Johnson', 'Manager', 'Sales', 85000, NULL),
('Bob Smith', 'Sales Associate', 'Sales', 50000, 1),
('Carol Lee', 'Sales Associate', 'Sales', 48000, 1),
('David Brown', 'Sales Intern', 'Sales', 30000, 2),
('Eve Davis', 'Developer', 'IT', 75000, NULL),
('Alice Johnson', 'Manager', 'Sales', 85000, NULL),
('Bob Smith', 'Sales Associate', 'Sales', 50000, 1),
('Carol Lee', 'Sales Associate', 'Sales', 48000, 1),
('David Brown', 'Sales Intern', 'Sales', 30000, 2),
('Eve Davis', 'Developer', 'IT', 75000, NULL),
('Alice Johnson', 'Manager', 'Sales', 85000, NULL),
('Bob Smith', 'Sales Associate', 'Sales', 50000, 1),
('Carol Lee', 'Sales Associate', 'Sales', 48000, 1),
('David Brown', 'Sales Intern', 'Sales', 30000, 2),
('Eve Davis', 'Developer', 'IT', 75000, NULL),
('Frank Miller', 'Intern', 'IT', 35000, 5);
EXPLAIN ANALYZE
SELECT * FROM employees WHERE department = 'Sales';
-- Индекс для ускорения запросов по полю department
-- Индекс поможет быстрее выполнять запросы, которые фильтруют по отделам.
CREATE INDEX idx_department ON employees(department);
-- Пример запроса с использованием индекса
EXPLAIN ANALYZE
SELECT * FROM employees WHERE department = 'Sales';
-- Удаление индекса
DROP INDEX idx_department;
-- Трассировка запросов
EXPLAIN ANALYZE
SELECT product_id, SUM(quantity) AS total_sales
FROM sales
WHERE date_part('month', sale_date) = date_part('month', CURRENT_DATE)
GROUP BY product_id
ORDER BY total_sales DESC
LIMIT 10;
-- Задание 3:
-- Индекс для sales по полю sale_date
-- Сделать запрос продаж за выбранный период
CREATE INDEX idx_sale_date ON sales(sale_date);
-- Пример запроса для проверки индекса
SELECT * FROM sales WHERE sale_date BETWEEN '2024-11-01' AND '2024-11-30' LIMIT 10;
-- Домашнее задание №3
-- Создайте временную таблицу high_sales_products, которая будет содержать продукты, проданные в количестве более 10 единиц за последние 7 дней.
-- Выведите данные из таблицы high_sales_products.
-- Создайте CTE employee_sales_stats, который посчитает общее количество продаж и среднее количество продаж для каждого сотрудника за последние 30 дней.
-- Напишите запрос, который выводит сотрудников с количеством продаж выше среднего по компании.
-- Используя CTE, создайте иерархическую структуру, показывающую всех сотрудников, которые подчиняются конкретному менеджеру.
-- Напишите запрос с CTE, который выведет топ-3 продукта по количеству продаж за текущий месяц и за прошлый месяц. В результатах должно быть указано, к какому месяцу относится каждая запись.
-- Создайте индекс для таблицы sales по полю employee_id и sale_date, чтобы ускорить запросы, которые фильтруют данные по сотрудникам и датам.
-- Проверьте, как наличие индекса влияет на производительность следующего запроса, используя EXPLAIN ANALYZE.
-- Используя EXPLAIN, проанализируйте запрос, который находит общее количество проданных единиц каждого продукта.