diff --git a/3 sem/Lab#7/lab7.sql b/3 sem/Lab#7/lab7.sql
new file mode 100644
index 0000000..c16ec45
--- /dev/null
+++ b/3 sem/Lab#7/lab7.sql
@@ -0,0 +1,174 @@
+-- Лабораторная работа №7 || Антипенко, Дробышевский || Вариант 4 --
+
+-- Задание 1
+-- • Создайте две таблицы: people и people_log. Первая таблица должна
+-- содержать поля идентификатор (id), имя (first_name), фамилия
+-- (last_name), дата рождения (birthday), текущее состояние счёта
+-- (amount). Поле id – это первичный ключ. Поле amount – это
+-- действительное число. Вторая таблица должна содержать поля:
+-- идентификатор человека (person_id) дата операции (operation_date),
+-- сумма (sum). Поле person_id должно быть ограничено, как внешний
+-- ключ, ссылающийся на поле id таблицы people. Поле operation_date
+-- должно позволить сохранять дату и время. Поле sum – это
+-- действительное число. Заполните таблицы people и people_log
+-- несколькими записями (не менее 5 на таблицу).
+
+CREATE TABLE people (
+ id SERIAL PRIMARY KEY,
+ first_name VARCHAR(50),
+ last_name VARCHAR(50),
+ birthday DATE,
+ amount DECIMAL(10, 2)
+);
+
+CREATE TABLE people_log (
+ id SERIAL PRIMARY KEY,
+ person_id INTEGER REFERENCES people(id),
+ operation_date TIMESTAMP,
+ sum DECIMAL(10, 2)
+);
+
+INSERT INTO people (first_name, last_name, birthday, amount)
+VALUES
+('Иван', 'Иванов', '1985-05-15', 1000.50),
+('Петр', 'Петров', '1990-10-20', 750.25),
+('Мария', 'Сидорова', '1978-12-03', 3000.75),
+('Елена', 'Козлова', '1989-08-27', 200.00),
+('Алексей', 'Смирнов', '1980-04-18', 1500.00);
+
+INSERT INTO people_log (person_id, operation_date, sum)
+VALUES
+(1, '2023-09-20 10:15:00', 250.00),
+(3, '2023-10-01 15:30:00', 800.50),
+(2, '2023-11-05 08:45:00', 100.25),
+(4, '2023-11-25 12:00:00', 50.00),
+(5, '2023-12-02 18:20:00', 300.00);
+
+SELECT * FROM people;
+SELECT * FROM people_log;
+
+
+-- Задание 2
+-- • Напишите процедуру или функцию statement_of_acount, которая на
+-- основе двух параметров: даты начала периода и даты окончания
+-- периода печатала бы на экран данные (operation_date и sum) трёх самых
+-- крупных операций с положительной суммой, трёх самых крупных
+-- операций с отрицательной суммой и данные об общем числе операций
+-- и среднем значении суммы.
+
+CREATE OR REPLACE FUNCTION statement_of_account(start_date DATE, end_date DATE) RETURNS VOID AS $$
+DECLARE
+ pos_counter INTEGER := 0;
+ neg_counter INTEGER := 0;
+ total_sum NUMERIC := 0;
+ total_count INTEGER := 0;
+ const CONSTANT INTEGER := 3;
+ avg_amount NUMERIC := 0;
+ operation RECORD;
+BEGIN
+ FOR operation IN (
+ SELECT operation_date, sum
+ FROM people_log
+ WHERE operation_date BETWEEN start_date AND end_date
+ ORDER BY sum
+ ) LOOP
+ IF operation.sum > 0 THEN
+ pos_counter := pos_counter + 1;
+ IF pos_counter <= const THEN
+ RAISE INFO 'Positive: %, Sum: %', operation.operation_date, operation.sum;
+ END IF;
+ ELSE
+ neg_counter := neg_counter + 1;
+ IF neg_counter <= const THEN
+ RAISE INFO 'Negative: %, Sum: %', operation.operation_date, operation.sum;
+ END IF;
+ END IF;
+
+ total_sum := total_sum + operation.sum;
+ total_count := total_count + 1;
+ END LOOP;
+
+ IF total_count > 0 THEN
+ avg_amount := total_sum / total_count;
+ END IF;
+
+ RAISE INFO 'Total number of operations: %', total_count;
+ RAISE INFO 'Average amount of transactions: %', avg_amount;
+END
+$$ LANGUAGE plpgsql;
+
+
+
+-- Задание 3
+-- • Напишите процедуру или функцию account_operation, которая на
+-- основе двух параметров: идентификатора человека и суммы вносит
+-- изменения в таблицы people и people_log. В таблице people у человека с
+-- указанным в качестве параметра идентификатором состояние счёта
+-- должно измениться на указанную в качестве параметра сумму. В
+-- таблицу people_log должна быть добавлена запись с указанным в
+-- качестве параметра идентификатором человека, текущей датой и
+-- временем и указанной в качестве параметра суммой.
+
+
+
+CREATE OR REPLACE PROCEDURE account_operation(new_id integer, add_sum numeric) AS $$
+DECLARE
+m integer;
+BEGIN
+select into m count(operation_date) from people_log where to_char(operation_date,'DD')= to_char(now(),'DD');
+if m>=3 then
+
+ UPDATE people
+ SET amount = amount + add_sum
+ WHERE id = new_id;
+ INSERT INTO people_log (person_id, operation_date, sum) VALUES (new_id, CURRENT_TIMESTAMP(0), add_sum);
+ELSE
+raise info 'Too many operations'
+END $$ LANGUAGE plpgsql;
+
+CALL account_operation(5, 1000000);
+
+SELECT * FROM people;
+SELECT * FROM people_log;
+
+
+CREATE OR REPLACE FUNCTION statement_of_account(start_date DATE, end_date DATE) RETURNS VOID AS $$
+DECLARE
+ pos_counter INTEGER := 0;
+ neg_counter INTEGER := 0;
+ total_sum NUMERIC := 0;
+ total_count INTEGER := 0;
+ const CONSTANT INTEGER := 3;
+ avg_amount NUMERIC := 0;
+ operation RECORD;
+BEGIN
+ FOR operation IN (
+ SELECT operation_date, sum
+ FROM people_log
+ WHERE operation_date BETWEEN start_date AND end_date
+ ORDER BY sum
+ ) LOOP
+ IF operation.sum > 0 THEN
+ pos_counter := pos_counter + 1;
+ IF pos_counter <= const THEN
+ RAISE INFO 'Positive: %, Sum: %', operation.operation_date, operation.sum;
+ END IF;
+ ELSE
+ neg_counter := neg_counter + 1;
+ IF neg_counter <= const THEN
+ RAISE INFO 'Negative: %, Sum: %', operation.operation_date, operation.sum;
+ END IF;
+ END IF;
+
+ total_sum := total_sum + operation.sum;
+ total_count := total_count + 1;
+ END LOOP;
+
+ IF total_count > 0 THEN
+ avg_amount := total_sum / total_count;
+ END IF;
+
+ RAISE INFO 'Total number of operations: %', total_count;
+ RAISE INFO 'Average amount of transactions: %', avg_amount;
+END
+$$ LANGUAGE plpgsql;
diff --git a/3 sem/Lab#7/lab7_aa.sql b/3 sem/Lab#7/lab7_aa.sql
new file mode 100644
index 0000000..56fe44c
--- /dev/null
+++ b/3 sem/Lab#7/lab7_aa.sql
@@ -0,0 +1,99 @@
+DROP TABLE people_log IF EXISTS;
+DROP TABLE people IF EXISTS;
+
+
+--1--
+CREATE TABLE people (
+ id SERIAL PRIMARY KEY,
+ first_name VARCHAR(64),
+ last_name VARCHAR(64),
+ birthday DATE,
+ amount NUMERIC(10,2)
+);
+
+CREATE TABLE people_log (
+ person_id INTEGER REFERENCES people(id),
+ operation_date TIMESTAMP,
+ sum NUMERIC(10,2)
+);
+
+INSERT INTO people (first_name, last_name, birthday, amount)
+VALUES ('Andrey', 'Ad', '2004-03-09', 1000.00),
+ ('Sanal', 'Bat', '2004-12-15', 2000.00),
+ ('Alex', 'Yak', '2004-08-10', 3000.00),
+ ('Dima', 'Klev', '2004-04-25', 4000.00),
+ ('David', 'Dav', '2001-11-30', 5000.00),
+ ('Reno', 'G', '2004-08-28', 6000.00),
+ ('Ilya', 'Zim', '2005-01-06', 7000.00),
+ ('Sema', 'Akh', '2005-12-01', 8000.00);
+
+
+INSERT INTO people_log ( person_id, operation_date, sum)
+VALUES
+(1, '2022-01-05 17:15:00', 100.00),
+(2, '2022-01-06 17:30:00', 300.00),
+(3, '2022-01-07 17:45:00', 300.00),
+(4, '2022-01-08 18:00:00', 400.00),
+(5, '2022-01-09 18:15:00', 500.00),
+(6, '2022-01-10 17:15:00', -100.00),
+(7, '2022-01-12 17:15:00', -400.00),
+(8, '2022-01-29 17:15:00', -200.00);
+
+
+
+SELECT * FROM people;
+SELECT * FROM people_log;
+
+
+--2--
+
+CREATE OR REPLACE PROCEDURE statement_of_acount(start_date DATE, end_date DATE) AS $$
+DECLARE
+ pos_sum RECORD;
+ neg_sum RECORD;
+ total_count INTEGER;
+ avg_amount NUMERIC;
+BEGIN
+ FOR pos_sum IN (
+ SELECT operation_date, sum
+ FROM people_log
+ WHERE operation_date BETWEEN start_date AND end_date AND sum > 0
+ ORDER BY sum DESC
+ LIMIT 3
+ ) LOOP
+ RAISE INFO 'Положительная операция: %, Сумма: %', pos_sum.operation_date, pos_sum.sum;
+ END LOOP;
+
+ FOR neg_sum IN (
+ SELECT operation_date, sum
+ FROM people_log
+ WHERE operation_date BETWEEN start_date AND end_date AND sum < 0
+ ORDER BY sum ASC
+ LIMIT 3
+ ) LOOP
+ RAISE INFO 'Отрицательная операция: %, Сумма: %', neg_sum.operation_date, neg_sum.sum;
+ END LOOP;
+
+ SELECT COUNT(*) INTO total_count
+ FROM people_log
+ WHERE operation_date BETWEEN start_date AND end_date;
+
+ SELECT AVG(sum) INTO avg_amount
+ FROM people_log
+ WHERE operation_date BETWEEN start_date AND end_date;
+
+ RAISE INFO 'Общее количество операций: %', total_count;
+ RAISE INFO 'Средняя сумма операций: %', avg_amount;
+
+END $$ LANGUAGE plpgsql;
+CALL statement_of_acount('2022-01-01', '2022-11-12');
+
+--3--
+CREATE OR REPLACE PROCEDURE account_operation(new_id integer, summa numeric) AS $$
+DECLARE
+BEGIN
+ UPDATE people SET amount = amount + summa WHERE id = new_id;
+ INSERT INTO people_log (person_id, operation_date, sum) VALUES (new_id, CURRENT_TIMESTAMP(0), summa);
+END $$ LANGUAGE plpgsql;
+
+CALL account_operation(1, 100);
\ No newline at end of file
diff --git a/Lab/Lab#1/lab1.sql b/3 sem/Lab/Lab#1/lab1.sql
similarity index 100%
rename from Lab/Lab#1/lab1.sql
rename to 3 sem/Lab/Lab#1/lab1.sql
diff --git a/Lab/Lab#2/BDLab2Corrected.pdf b/3 sem/Lab/Lab#2/BDLab2Corrected.pdf
similarity index 100%
rename from Lab/Lab#2/BDLab2Corrected.pdf
rename to 3 sem/Lab/Lab#2/BDLab2Corrected.pdf
diff --git a/Lab/Lab#2/inserts.sql b/3 sem/Lab/Lab#2/inserts.sql
similarity index 100%
rename from Lab/Lab#2/inserts.sql
rename to 3 sem/Lab/Lab#2/inserts.sql
diff --git a/Lab/Lab#2/var1.sql b/3 sem/Lab/Lab#2/var1.sql
similarity index 100%
rename from Lab/Lab#2/var1.sql
rename to 3 sem/Lab/Lab#2/var1.sql
diff --git a/Lab/Lab#2/var2.sql b/3 sem/Lab/Lab#2/var2.sql
similarity index 100%
rename from Lab/Lab#2/var2.sql
rename to 3 sem/Lab/Lab#2/var2.sql
diff --git a/Lab/Lab#3/BDLab3Corrected(2)(1).pdf b/3 sem/Lab/Lab#3/BDLab3Corrected(2)(1).pdf
similarity index 100%
rename from Lab/Lab#3/BDLab3Corrected(2)(1).pdf
rename to 3 sem/Lab/Lab#3/BDLab3Corrected(2)(1).pdf
diff --git a/Lab/Lab#3/lab3.sql b/3 sem/Lab/Lab#3/lab3.sql
similarity index 100%
rename from Lab/Lab#3/lab3.sql
rename to 3 sem/Lab/Lab#3/lab3.sql
diff --git a/Lab/Lab#4/BDLab4Corrected(1).pdf b/3 sem/Lab/Lab#4/BDLab4Corrected(1).pdf
similarity index 100%
rename from Lab/Lab#4/BDLab4Corrected(1).pdf
rename to 3 sem/Lab/Lab#4/BDLab4Corrected(1).pdf
diff --git a/Lab/Lab#4/lab4.sql b/3 sem/Lab/Lab#4/lab4.sql
similarity index 100%
rename from Lab/Lab#4/lab4.sql
rename to 3 sem/Lab/Lab#4/lab4.sql
diff --git a/Lab/Lab#5/lab5.sql b/3 sem/Lab/Lab#5/lab5.sql
similarity index 55%
rename from Lab/Lab#5/lab5.sql
rename to 3 sem/Lab/Lab#5/lab5.sql
index c7af218..7cc9500 100644
--- a/Lab/Lab#5/lab5.sql
+++ b/3 sem/Lab/Lab#5/lab5.sql
@@ -1,6 +1,6 @@
SELECT *
FROM bd_employees
-WHERE last_name ~ '^[a-zA-Z]+-[a-zA-Z]+$';
+WHERE last_name ~ '^[a-zA-Z]+[-[a-zA-Z]]{0,}';
SELECT *
FROM bd_employees
@@ -18,11 +18,17 @@ SELECT last_name,
FROM bd_employees;
UPDATE staff
-SET department = '60'
-WHERE id = (
- SELECT manager_id
- FROM employees
- WHERE first_name LIKE 'Neena' AND last_name LIKE 'Kochhar');
+SET department = (SELECT department_name FROM departments WHERE department_id = 60)
+WHERE department in (
+ SELECT department_name
+ FROM departments
+ WHERE department_id in (
+ SELECT department_id
+ FROM employees
+ WHERE manager_id = (
+ SELECT employee_id
+ FROM employees
+ WHERE first_name = 'Neena' AND last_name= 'Kochhar')));
SELECT *
FROM bd_employees
@@ -30,7 +36,7 @@ WHERE LENGTH(REGEXP_REPLACE(first_name, '[^aeiouAEIOU]', '', 'g')) <= 3;
WITH tmp AS (
SELECT chr(i+96), i FROM generate_series(1,26) i)
-SELECT e.last_name, sum(t.i) AS name_sum
-FROM bd_employees e
+SELECT e.last_name sum(t.i) AS name_sum
+FROM db_employees e
JOIN tmp t ON t.chr = ANY(string_to_array(LOWER(e.last_name), NULL))
-GROUP BY e.last_name;
+GROUP BY e.last_name;
\ No newline at end of file
diff --git a/3 sem/Lab/Lab#6/bd6_inserts.sql b/3 sem/Lab/Lab#6/bd6_inserts.sql
new file mode 100644
index 0000000..686d5ad
--- /dev/null
+++ b/3 sem/Lab/Lab#6/bd6_inserts.sql
@@ -0,0 +1,47 @@
+DROP TABLE IF EXISTS bd6_departments;
+DROP TABLE IF EXISTS bd6_employees;
+
+
+CREATE TABLE bd6_departments(
+ id integer PRIMARY KEY,
+ name varchar(64),
+ postal_code varchar(6),
+ street varchar(64),
+ building varchar(16),
+ city varchar(32)
+);
+
+INSERT INTO bd6_departments
+VALUES(10, 'Administration', '109658', 'Leningradskoe shosse', '1', 'Moscow'),
+(20, 'Marketing', '107701', 'Lenina', '22a', 'Volgograd'),
+(30, 'Purchasing', '109901', 'Mikluho-Maklaya', '8', 'Bryansk'),
+(40, 'Human Resources', '10967', '5-ya parkovaya', '16', 'Moscow'),
+(50, 'Shipping', '109659', '38 Bakinskih komissarov', '77', 'Moscow'),
+(60, 'IT', '109902', 'Pervomajskaya', '33', 'Kirov');
+
+CREATE TABLE bd6_employees(
+ id integer PRIMARY KEY,
+ last_name varchar(64) NOT NULL,
+ first_name varchar(64) NOT NULL,
+ phone_number varchar(18),
+ email varchar(32),
+ department_id integer NOT NULL,
+ manager_id integer,
+ salary_in_euro numeric(8, 2) DEFAULT 0 NOT NULL,
+ UNIQUE(last_name, first_name, department_id)
+);
+
+
+INSERT INTO bd6_employees VALUES(1, 'Radygin', 'Victor', '8-(495)-567-7788', 'vr@e.mail.mephi.ru', 10, NULL, 8000),
+(2, 'Kuprijanov', 'Dmitrij', '8-(495)-567-7794', 'kd@e.mail.mephi.ru', 60, 1, 6534.33),
+(3, 'Ivanov-Skladovskij', 'Ivan', '8-(495)-567-7799', 'ii1@mail.mephi.ru', 20, 1, 4404.14),
+(4, 'Petrov', 'Petr', '8-(495)-567-7794', 'petrovpetr@m.gmail.ru', 60, 2, 3456.43),
+(5, 'kozlov', 'Konstantin', '8-(495)-567-7794', 'kkozlov@mephi.ru', 60, 2, 2300),
+(6, 'Abramov', 'Abram', '8-(495)-567-7794', 'abramova@k75.mephi.ru', 60, 2, 2200.11),
+(7, 'IvanovпїЅ-SkladovskпїЅya-Petrova', 'Ivanka', '8-(495)-567-7794', 'ii2@mail.mephi.ru', 60, 4, 3756.33),
+(8, 'Petrov', 'Ivan', '8-(495)-567-7799', 'petrovivan@m.gmail.ru', 20, 3, 4850),
+(9, 'kozlov', 'Ivan', '8-(495)-567-7799', 'ikozlov@mephi.ru', 20, 3, 3460),
+(10, 'Abramov', 'Moisej', '8-(495)-567-7794', 'abramovm@k75.mephi.ru', 60, 4, 2345),
+(11, 'Petrov', 'Alex', '8-(495)-567-7799', 'petroval@m.gmail.ru', 20, 3, 2465),
+(12, 'kozlov', 'Maxim', '8-(495)-567-7799', 'mkozlov@mephi.ru', 20, 3, 2788),
+(13, 'Abramov', 'Isyaslav', '8-(495)-567-7738', 'abramovi@k75.mephi.ru', 30, 1, 6500);
\ No newline at end of file
diff --git a/3 sem/Lab/Lab#6/insert.sql b/3 sem/Lab/Lab#6/insert.sql
new file mode 100644
index 0000000..350d918
--- /dev/null
+++ b/3 sem/Lab/Lab#6/insert.sql
@@ -0,0 +1,163 @@
+DROP TABLE IF EXISTS bd6_employees;
+
+CREATE TABLE bd6_departments(
+ id integer PRIMARY KEY,
+ name varchar(64),
+ postal_code varchar(6),
+ street varchar(64),
+ building varchar(16),
+ city varchar(32)
+);
+CREATE TABLE
+ bd6_employees (
+ id integer PRIMARY KEY,
+ last_name varchar(64) NOT NULL,
+ first_name varchar(64) NOT NULL,
+ phone_number varchar(18),
+ email varchar(32),
+ department_id integer REFERENCES bd6_departments (id) NOT NULL,
+ manager_id integer REFERENCES bd6_employees (id),
+ salary_in_euro numeric(8, 2) DEFAULT 0 NOT NULL,
+ UNIQUE (last_name, first_name, department_id)
+ );
+
+INSERT INTO bd6_departments
+VALUES(10, 'Administration', '109658', 'Leningradskoe shosse', '1', 'Moscow'),
+(20, 'Marketing', '107701', 'Lenina', '22a', 'Volgograd'),
+(30, 'Purchasing', '109901', 'Mikluho-Maklaya', '8', 'Bryansk'),
+(40, 'Human Resources', '10967', '5-ya parkovaya', '16', 'Moscow'),
+(50, 'Shipping', '109659', '38 Bakinskih komissarov', '77', 'Moscow'),
+(60, 'IT', '109902', 'Pervomajskaya', '33', 'Kirov');
+INSERT INTO
+ bd6_employees
+VALUES
+ (
+ 1,
+ 'Radygin',
+ 'Victor',
+ '8-(495)-567-7788',
+ 'vr@e.mail.mephi.ru',
+ 10,
+ NULL,
+ 8000
+ ),
+ (
+ 2,
+ 'Kuprijanov',
+ 'Dmitrij',
+ '8-(495)-567-7794',
+ 'kd@e.mail.mephi.ru',
+ 60,
+ 1,
+ 6534.33
+ ),
+ (
+ 3,
+ 'Ivanov-Skladovskij',
+ 'Ivan',
+ '8-(495)-567-7799',
+ 'ii1@mail.mephi.ru',
+ 20,
+ 1,
+ 4404.14
+ ),
+ (
+ 4,
+ 'Petrov',
+ 'Petr',
+ '8-(495)-567-7794',
+ 'petrovpetr@m.gmail.ru',
+ 60,
+ 2,
+ 3456.43
+ ),
+ (
+ 5,
+ 'kozlov',
+ 'Konstantin',
+ '8-(495)-567-7794',
+ 'kkozlov@mephi.ru',
+ 60,
+ 2,
+ 2300
+ ),
+ (
+ 6,
+ 'Abramov',
+ 'Abram',
+ '8-(495)-567-7794',
+ 'abramova@k75.mephi.ru',
+ 60,
+ 2,
+ 2200.11
+ ),
+ (
+ 7,
+ 'IvanovпїЅ-SkladovskпїЅya-Petrova',
+ 'Ivanka',
+ '8-(495)-567-7794',
+ 'ii2@mail.mephi.ru',
+ 60,
+ 4,
+ 3756.33
+ ),
+ (
+ 8,
+ 'Petrov',
+ 'Ivan',
+ '8-(495)-567-7799',
+ 'petrovivan@m.gmail.ru',
+ 20,
+ 3,
+ 4850
+ ),
+ (
+ 9,
+ 'kozlov',
+ 'Ivan',
+ '8-(495)-567-7799',
+ 'ikozlov@mephi.ru',
+ 20,
+ 3,
+ 3460
+ ),
+ (
+ 10,
+ 'Abramov',
+ 'Moisej',
+ '8-(495)-567-7794',
+ 'abramovm@k75.mephi.ru',
+ 60,
+ 4,
+ 2345
+ ),
+ (
+ 11,
+ 'Petrov',
+ 'Alex',
+ '8-(495)-567-7799',
+ 'petroval@m.gmail.ru',
+ 20,
+ 3,
+ 2465
+ ),
+ (
+ 12,
+ 'kozlov',
+ 'Maxim',
+ '8-(495)-567-7799',
+ 'mkozlov@mephi.ru',
+ 20,
+ 3,
+ 2788
+ ),
+ (
+ 13,
+ 'Abramov',
+ 'Isyaslav',
+ '8-(495)-567-7738',
+ 'abramovi@k75.mephi.ru',
+ 30,
+ 1,
+ 6500
+ );
\ No newline at end of file
diff --git a/3 sem/Lab/Lab#6/lab6.sql b/3 sem/Lab/Lab#6/lab6.sql
new file mode 100644
index 0000000..86a98ee
--- /dev/null
+++ b/3 sem/Lab/Lab#6/lab6.sql
@@ -0,0 +1,49 @@
+CREATE OR REPLACE PROCEDURE update_salary() AS $$
+DECLARE
+ emp_record bd6_employees%ROWTYPE;
+ counter integer := 0;
+ min_salary bd6_employees.salary_in_euro%TYPE;
+ max_salary bd6_employees.salary_in_euro%TYPE;
+BEGIN
+ -- SELECT MIN(salary_in_euro), MAX(salary_in_euro) INTO min_salary, max_salary FROM bd6_employees;
+
+ FOR emp_record IN
+ SELECT * FROM (SELECT * FROM bd6_employees ORDER BY salary_in_euro LIMIT 3) AS min_salaries
+ LOOP
+ DELETE FROM bd6_employees WHERE id = emp_record.id;
+ counter := counter + 1;
+ END LOOP;
+ FOR emp_record IN
+ SELECT * FROM (SELECT * FROM bd6_employees ORDER BY salary_in_euro DESC LIMIT 3) AS max_salaries
+ LOOP
+ UPDATE bd6_employees SET salary_in_euro = salary_in_euro + min_salary WHERE id = emp_record.id;
+ counter := counter + 1;
+ END LOOP;
+
+ RAISE NOTICE 'Successfully updated % bd6_employees.', counter;
+END $$ LANGUAGE plpgsql;
+CALL update_salary();
+
+CREATE OR REPLACE PROCEDURE update_and_delete_salaries() AS $$
+BEGIN
+ -- Увеличение заработной платы
+ WITH lowest_salaries AS (
+ SELECT id, salary_in_euro
+ FROM bd6_employees
+ ORDER BY salary_in_euro
+ LIMIT 10
+ ), highest_salary AS (
+ SELECT max(salary_in_euro) AS max_salary
+ FROM bd6_employees
+ )
+ UPDATE bd6_employees e
+ SET salary_in_euro = e.salary_in_euro + ls.salary_in_euro - (SELECT max_salary FROM highest_salary)
+ FROM lowest_salaries ls
+ WHERE e.id = ls.id;
+
+ -- Удаление сотрудников
+ DELETE FROM bd6_employees WHERE id IN (SELECT id FROM lowest_salaries);
+
+ RAISE NOTICE 'Salaries updated and lowest paid bd6_employees deleted.';
+END;
+$$ LANGUAGE plpgsql;
diff --git a/3 sem/Lab/Lab#6/lab6_done.sql b/3 sem/Lab/Lab#6/lab6_done.sql
new file mode 100644
index 0000000..a31f9c1
--- /dev/null
+++ b/3 sem/Lab/Lab#6/lab6_done.sql
@@ -0,0 +1,450 @@
+/* Вариант 1 || Работа 6 || Антипенко, Дробышевский */
+
+
+-- Task 1 --
+/* a) Напишите запрос, используя конструкцию WITH, выбирающий
+рекурсивно сотрудника с идентификатором 1 и все его подчинённых,
+как прямых, так и подчинённых более низкого ранга*.
+b) Напишите программу на языке PL/SQL, печатающую на экран фамилию
+и имя сотрудника с идентификатором 1 и всех его подчинённых, как
+прямых, так и подчинённых более низкого ранга. */
+
+-- Пункт а)
+WITH RECURSIVE tmp AS (
+
+ SELECT id, first_name, last_name, manager_id, 1 AS level
+ FROM bd6_employees
+ WHERE id = 1
+ UNION all
+ SELECT e.id, e.first_name, e.last_name, e.manager_id, t.level + 1
+ FROM bd6_employees e
+ JOIN tmp t ON e.manager_id = t.id
+)
+SELECT *
+FROM tmp
+;
+
+-- Пункт б)
+CREATE OR REPLACE PROCEDURE depa(integer) AS $$
+DECLARE
+ d_attrs RECORD;
+ i integer;
+ l integer;
+BEGIN
+FOR d_attrs IN
+ (
+ SELECT id,last_name, first_name, manager_id
+ FROM bd6_employees
+ ORDER BY manager_id
+ )
+ LOOP
+ IF d_attrs.manager_id=$1 THEN
+ RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
+ l:= d_attrs.id;
+ CALL depa(l);
+ END IF;
+ END LOOP;
+END $$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE PROCEDURE dep(integer) AS $$
+DECLARE
+ d_attrs RECORD;
+ BEGIN
+ FOR d_attrs IN
+ (
+ SELECT
+ id,
+ last_name,
+ first_name,
+ manager_id
+ FROM bd6_employees
+ ORDER BY manager_id
+ )
+
+ LOOP
+ IF d_attrs.id=$1 THEN
+ RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
+ END IF;
+ END LOOP;
+CALL depa($1);
+END $$ LANGUAGE plpgsql;
+CALL dep(1);
+
+-- Task 2 --
+/* Напишите программу на языке PL/SQL, выбирающую строки из таблицы
+employees в порядке возрастания заработной платы (salary) и печатающие на
+экран следующие данные: фамилия, имя, модифицированная заработная
+плата. Модифицированная заработная плата получается следующим
+образом: у первого по порядку сотрудника она округляется до сотен в
+меньшую сторону, а у всех последующих сотрудников она сначала
+увеличивается на остаток от округления, полученный от предыдущего
+сотрудника, а затем округляется до сотен в меньшую сторону. */
+
+UPDATE bd6_employees SET salary_in_euro = 299 WHERE id = 3;
+
+CREATE OR REPLACE PROCEDURE print_employees() AS $$
+DECLARE
+current_salary INTEGER;
+m_salary INTEGER;
+mod_salary INTEGER := 0;
+employee_rec RECORD;
+BEGIN
+FOR employee_rec IN
+ (
+ SELECT last_name, first_name, salary_in_euro
+ FROM bd6_employees
+ ORDER BY salary_in_euro
+ )
+
+LOOP
+ current_salary := employee_rec.salary_in_euro;
+
+ m_salary := ((current_salary + mod_salary) / 100) * 100;
+
+RAISE NOTICE 'Employee: % % || Modified Salary: %', employee_rec.last_name, employee_rec.first_name, m_salary;
+mod_salary := mod(current_salary + mod_salary,100);
+END LOOP;
+END $$ LANGUAGE plpgsql;
+
+CALL print_employees();
+SELECT *
+FROM bd6_employees
+ORDER BY salary_in_euro;
+
+
+-- Task 3 --
+/* Напишите программу на языке PL/SQL, удаляющую 10 сотрудников с
+самой маленькой заработной платой. При этом их заработная плата должна
+добавиться 10 сотрудникам с самой большой заработной платой. Причём
+самая маленькая заработная плата должна добавиться к человеку с самой
+большой заработной платой. 2-я с конца заработная плата должна добавиться
+к человеку со второй по размеру заработной платой и т.д. */
+
+CREATE OR REPLACE FUNCTION rearrange_salaries() RETURNS VOID AS $$
+DECLARE
+ salaries RECORD;
+ small NUMERIC[];
+ larg NUMERIC[];
+ const CONSTANT INTEGER = 3;
+BEGIN
+ FOR salaries IN
+ SELECT id, salary_in_euro
+ FROM bd6_employees
+ ORDER BY salary_in_euro
+ LIMIT const
+ LOOP
+ small = array_append(small, (SELECT salary_in_euro FROM bd6_employees WHERE id = salaries.id));
+ DELETE FROM bd6_employees
+ WHERE id = salaries.id;
+ END LOOP;
+
+ FOR salaries IN
+ SELECT id, salary_in_euro
+ FROM bd6_employees
+ ORDER BY salary_in_euro DESC
+ LIMIT const
+ LOOP
+ larg = array_append(larg, (SELECT id FROM bd6_employees WHERE id = salaries.id));
+ END LOOP;
+
+ FOR i IN 1..const
+ LOOP
+ UPDATE bd6_employees
+ SET salary_in_euro = salary_in_euro + small[i]
+ WHERE id = larg[i];
+ END LOOP;
+END;
+$$ LANGUAGE plpgsql;
+SELECT rearrange_salaries();
+
+-- Task 4 --
+/* Создайте таблицу spiral с 5 полями f1, f2, f3, f4, f5 – целые числа.
+Напишите программу на языке PL/SQL, заполняющую данную таблицу 1000
+строк по следующему принципу:
+1 2 3 4 5
+10 9 8 7 6
+11 12 13 14 15
+20 19 18 17 16
+21 22 23 24 25 */
+
+CREATE OR REPLACE PROCEDURE f() AS $$
+DECLARE d_attrs RECORD;
+BEGIN
+
+FOR d_attrs IN WITH RECURSIVE tmp AS (
+ SELECT 1+i*5 AS f1, 2+i*5 AS f2, 3+i*5 AS f3, 4+i*5 AS f4,5+i*5 AS f5
+ FROM generate_series(0,199) i)
+
+SELECT * FROM tmp
+LOOP
+case
+when ( mod(d_attrs.f1,2)!=0)
+then RAISE INFO ' % % % % %', d_attrs.f1, d_attrs.f2, d_attrs.f3, d_attrs.f4, d_attrs.f5;
+when ( mod(d_attrs.f1,2)=0)
+then RAISE INFO ' % % % % %', d_attrs.f5, d_attrs.f4, d_attrs.f3, d_attrs.f2, d_attrs.f1;
+end case;
+END LOOP;
+END $$ LANGUAGE plpgsql;
+call f();
+
+-- Task 7 from lab4 --
+
+
+CREATE table staff(
+ id integer primary key,
+ name varchar(64) NOT NULL,
+ department varchar(64) NOT NULL
+);
+
+CREATE SEQUENCE staff_id_seq
+ START WITH 12
+ CYCLE
+ INCREMENT BY 8
+ CACHE 100;
+
+
+INSERT INTO staff VALUES
+ (nextval('staff_id_seq'), 'Ivan Makarenko', 'Director');
+
+INSERT INTO staff
+ (SELECT nextval('staff_id_seq'), last_name, department_name
+ FROM employees e JOIN departments d ON e.department_id = d.department_id);
+
+UPDATE staff SET department = 'Innovations department'
+ WHERE id < 40;
+
+DELETE FROM staff
+ WHERE name ILIKE('%K%');
+
+CREATE VIEW dep_staff_counts AS
+SELECT department, COUNT(*) AS ecount
+FROM staff
+GROUP BY department;
+
+SELECT * FROM dep_staff_counts;
+
+
+
+
+
+-- CREATE OR REPLACE PROCEDURE department_names(integer) AS $$
+-- DECLARE
+-- d_attrs RECORD;
+-- i INTEGER;
+-- l INTEGER;
+-- BEGIN
+-- FOR d_attrs IN
+-- (
+-- SELECT id,last_name, first_name, manager_id
+-- FROM bd6_employees order by manager_id
+-- )
+-- LOOP
+-- IF d_attrs.manager_id=$1 THEN
+-- RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
+-- l:= d_attrs.id;
+-- CALL department_names(l);
+-- END IF;
+-- END LOOP;
+-- END $$ LANGUAGE plpgsql;
+
+
+-- CREATE OR REPLACE PROCEDURE department_names2(integer) AS $$
+-- DECLARE d_attrs RECORD;
+-- BEGIN
+-- FOR d_attrs IN
+-- (
+-- SELECT id,last_name, first_name, manager_id
+-- FROM bd6_employees
+-- order by manager_id
+-- )
+
+-- LOOP
+-- if d_attrs.id=$1 then
+-- RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
+-- end if;
+-- END LOOP;
+-- CALL department_names($1);
+-- END $$ LANGUAGE plpgsql;
+-- CALL department_names2(4);
+
+
+/* Вариант 1 || Работа 6 || Антипенко, Дробышевский */
+
+
+-- Task 1 --
+-- Пункт а)
+WITH RECURSIVE tmp AS (
+
+ SELECT id, first_name, last_name, manager_id, 1 AS level
+ FROM bd6_employees
+ WHERE id = 1
+ UNION all
+ SELECT e.id, e.first_name, e.last_name, e.manager_id, t.level + 1
+ FROM bd6_employees e
+ JOIN tmp t ON e.manager_id = t.id
+)
+SELECT *
+FROM tmp
+;
+
+-- Пункт б)
+CREATE OR REPLACE PROCEDURE depa(integer) AS $$
+DECLARE
+ d_attrs RECORD;
+ i integer;
+ l integer;
+BEGIN
+FOR d_attrs IN
+ (
+ SELECT id,last_name, first_name, manager_id
+ FROM bd6_employees
+ ORDER BY manager_id
+ )
+ LOOP
+ IF d_attrs.manager_id=$1 THEN
+ RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
+ l:= d_attrs.id;
+ CALL depa(l);
+ END IF;
+ END LOOP;
+END $$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE PROCEDURE dep(integer) AS $$
+DECLARE
+ d_attrs RECORD;
+ BEGIN
+ FOR d_attrs IN
+ (
+ SELECT
+ id,
+ last_name,
+ first_name,
+ manager_id
+ FROM bd6_employees
+ ORDER BY manager_id
+ )
+
+ LOOP
+ IF d_attrs.id=$1 THEN
+ RAISE INFO ' % % % % ', d_attrs.first_name, d_attrs.last_name, d_attrs.id, d_attrs.manager_id;
+ END IF;
+ END LOOP;
+CALL depa($1);
+END $$ LANGUAGE plpgsql;
+CALL dep(1);
+
+-- Task 2 --
+
+UPDATE bd6_employees SET salary_in_euro = 299 WHERE id = 3;
+
+CREATE OR REPLACE PROCEDURE print_employees() AS $$
+DECLARE
+current_salary INTEGER;
+m_salary INTEGER;
+mod_salary INTEGER := 0;
+employee_rec RECORD;
+i INTEGER = 0;
+cnt INTEGER;
+BEGIN
+SELECT COUNT(*) INTO cnt FROM bd6_employees;
+FOR employee_rec IN
+ (
+ SELECT last_name, first_name, salary_in_euro
+ FROM bd6_employees
+ ORDER BY salary_in_euro
+ )
+LOOP
+
+ current_salary := employee_rec.salary_in_euro;
+
+ IF cnt - 1 = i THEN
+ m_salary := ((current_salary) / 100) * 100 + mod_salary;
+ ELSE
+ m_salary := ((current_salary) / 100) * 100;
+ END IF;
+
+RAISE NOTICE 'Employee: % % || Modified Salary: %', employee_rec.last_name, employee_rec.first_name, m_salary;
+
+mod_salary := mod_salary + mod(current_salary, 100);
+i := i+1;
+
+END LOOP;
+
+END $$ LANGUAGE plpgsql;
+
+CALL print_employees();
+SELECT *
+FROM bd6_employees
+ORDER BY salary_in_euro;
+
+
+-- Task 3 --
+CREATE OR REPLACE FUNCTION rearrange_salaries() RETURNS VOID AS $$
+DECLARE
+ salaries RECORD;
+ small NUMERIC[];
+ larg NUMERIC[];
+ const CONSTANT INTEGER = 10;
+BEGIN
+ FOR salaries IN
+ SELECT id, salary_in_euro
+ FROM bd6_employees
+ ORDER BY salary_in_euro
+ LIMIT const
+ LOOP
+ small = array_append(small, (SELECT salary_in_euro FROM bd6_employees WHERE id = salaries.id));
+ UPDATE bd6_employees SET manager_id = NULL WHERE manager_id = salaries.id;
+ DELETE FROM bd6_employees
+ WHERE id = salaries.id;
+ END LOOP;
+
+ FOR salaries IN
+ SELECT id, salary_in_euro
+ FROM bd6_employees
+ ORDER BY salary_in_euro DESC
+ LIMIT const
+ LOOP
+ larg = array_append(larg, (SELECT id FROM bd6_employees WHERE id = salaries.id));
+ END LOOP;
+
+ FOR i IN 1..const
+ LOOP
+ UPDATE bd6_employees
+ SET salary_in_euro = salary_in_euro + small[i]
+ WHERE id = larg[i];
+ END LOOP;
+END;
+$$ LANGUAGE plpgsql;
+SELECT rearrange_salaries();
+
+-- Task 4 --
+
+CREATE OR REPLACE PROCEDURE f() AS $$
+DECLARE d_attrs RECORD;
+BEGIN
+
+FOR d_attrs IN WITH RECURSIVE tmp AS (
+ SELECT 1+i*5 AS f1, 2+i*5 AS f2, 3+i*5 AS f3, 4+i*5 AS f4,5+i*5 AS f5
+ FROM generate_series(0,199) i)
+
+SELECT * FROM tmp
+LOOP
+case
+when ( mod(d_attrs.f1,2)!=0)
+then RAISE INFO ' % % % % %', d_attrs.f1, d_attrs.f2, d_attrs.f3, d_attrs.f4, d_attrs.f5;
+when ( mod(d_attrs.f1,2)=0)
+then RAISE INFO ' % % % % %', d_attrs.f5, d_attrs.f4, d_attrs.f3, d_attrs.f2, d_attrs.f1;
+end case;
+END LOOP;
+END $$ LANGUAGE plpgsql;
+call f();
+
+-- Task 7 from lab4 --
+DROP VIEW IF EXISTS dep_staff_counts;
+
+CREATE VIEW dep_staff_counts AS
+SELECT department, COUNT(*) AS ecount
+FROM staff
+GROUP BY department;
+
+SELECT * FROM dep_staff_counts;
diff --git a/3 sem/Lab/Lab#6/test3.sql b/3 sem/Lab/Lab#6/test3.sql
new file mode 100644
index 0000000..78bdae3
--- /dev/null
+++ b/3 sem/Lab/Lab#6/test3.sql
@@ -0,0 +1,72 @@
+CREATE OR REPLACE FUNCTION rearrange_salaries() RETURNS VOID AS $$
+DECLARE
+ salaries RECORD;
+ small NUMERIC[];
+ larg NUMERIC[];
+ const CONSTANT INTEGER = 10;
+BEGIN
+ FOR salaries IN
+ SELECT id, salary_in_euro
+ FROM bd6_employees
+ ORDER BY salary_in_euro
+ LIMIT const
+ LOOP
+ small = array_append(small, (SELECT salary_in_euro FROM bd6_employees WHERE id = salaries.id));
+ DELETE FROM bd6_employees
+ WHERE id = salaries.id;
+ END LOOP;
+
+ FOR salaries IN
+ SELECT id, salary_in_euro
+ FROM bd6_employees
+ ORDER BY salary_in_euro DESC
+ LIMIT const
+ LOOP
+ larg = array_append(larg, (SELECT id FROM bd6_employees WHERE id = salaries.id));
+ END LOOP;
+
+ FOR i IN 1..const
+ LOOP
+ UPDATE bd6_employees
+ SET salary_in_euro = salary_in_euro + small[i]
+ WHERE id = larg[i];
+ END LOOP;
+END;
+$$ LANGUAGE plpgsql;
+SELECT rearrange_salaries();
+
+
+
+
+CREATE OR REPLACE FUNCTION update_salaries() RETURNS VOID AS $$
+DECLARE
+ max_salary_employee_id INTEGER;
+ min_salaries numeric[];
+ max_salaries numeric[];
+ i INTEGER;
+ const CONSTANT INTEGER = 10;
+BEGIN
+ -- Получаем заработные платы последних 10 человек с самой маленькой заработной платой
+ SELECT array_agg(id) FROM bd6_employees
+ ORDER BY salary_in_euro ASC
+ LIMIT const INTO min_salaries;
+
+ -- Получаем заработные платы 10 первых человек с самой большой заработной платой
+ SELECT array_agg(id) FROM bd6_employees
+ ORDER BY salary_in_euro DESC
+ LIMIT const INTO max_salaries;
+
+ -- Добавляем заработные платы
+ FOR i IN 1..const LOOP
+ UPDATE bd6_employees
+ SET salary_in_euro = salary_in_euro + min_salaries[i]
+ WHERE id = max_salaries[i];
+ END LOOP;
+
+ -- Удаляем 10 человек с наименьшей заработной платой
+ DELETE FROM bd6_employees
+ WHERE id IN (SELECT unnest(min_salaries));
+
+ RAISE NOTICE 'Заработные платы обновлены и % человек удалены', const;
+END;
+$$ LANGUAGE plpgsql;
\ No newline at end of file
diff --git a/3 sem/Practice/27_11.sql b/3 sem/Practice/27_11.sql
new file mode 100644
index 0000000..6634436
--- /dev/null
+++ b/3 sem/Practice/27_11.sql
@@ -0,0 +1,104 @@
+-- Task 1 --
+
+CREATE OR REPLACE PROCEDURE molodec() AS $$
+DECLARE
+ name1 varchar := 'Julia';
+ name2 varchar := 'Пустотааа';
+BEGIN
+ RAISE INFO ' %, %, вы молодцы! ', name1, name2;
+
+END $$ LANGUAGE plpgsql;
+CALL molodec();
+
+-- Task 2 --
+
+CREATE OR REPLACE PROCEDURE fiiiizika() AS $$
+DECLARE
+ velocity_kmh NUMERIC := 60;
+ time_seconds NUMERIC := 30;
+ velocity_ms NUMERIC;
+ distance_m NUMERIC;
+ train_length_m NUMERIC;
+BEGIN
+
+ velocity_ms := velocity_kmh * 1000 / 3600;
+
+ distance_m := velocity_ms * time_seconds;
+ train_length_m := distance_m;
+
+ RAISE INFO ' % ', TRUNC(train_length_m);
+END;
+$$ LANGUAGE plpgsql;
+CALL fiiiizika();
+
+
+
+-- Task 3 --
+
+CREATE OR REPLACE PROCEDURE show_city_streets() AS $$
+DECLARE
+ city_record RECORD;
+BEGIN
+ FOR city_record IN SELECT city, street_address FROM locations
+ LOOP
+ RAISE NOTICE 'В городе % есть улица %',
+ city_record.city, city_record.street_address;
+ END LOOP;
+END;
+$$ LANGUAGE plpgsql;
+
+CALL show_city_streets();
+
+
+-- Task 4 --
+
+CREATE OR REPLACE PROCEDURE factorial(n INTEGER) AS $$
+DECLARE
+ result INTEGER := 1;
+ i INTEGER := 1;
+BEGIN
+ WHILE i <= n LOOP
+ result := result * i;
+ i := i + 1;
+ END LOOP;
+ RAISE INFO ' % ', result;
+END;
+$$ LANGUAGE plpgsql;
+
+CALL factorial(10);
+
+-- Task 5 --
+
+CREATE OR REPLACE FUNCTION get_employees_and_managers_names()
+RETURNS TABLE (employee_name TEXT, manager_name TEXT) AS $$
+BEGIN
+ RETURN QUERY
+ SELECT e.first_name || ' ' || e.last_name AS employee_name,
+ COALESCE(m.first_name || ' ' || m.last_name, 'No manager') AS manager_name
+ FROM employees e
+ LEFT JOIN employees m ON e.manager_id = m.employee_id;
+END;
+$$ LANGUAGE plpgsql;
+
+SELECT get_employees_and_managers_names();
+
+-- Task 6 --
+
+CREATE OR REPLACE FUNCTION binary_to_decimal(binary_num VARCHAR)
+RETURNS NUMERIC AS $$
+DECLARE
+ decimal_num NUMERIC := 0;
+ power NUMERIC := 0;
+ bit NUMERIC;
+BEGIN
+ FOR i IN REVERSE 1..LENGTH(binary_num) LOOP
+ bit := CAST(SUBSTRING(binary_num FROM i FOR 1) AS NUMERIC);
+ decimal_num := decimal_num + (bit * (2 ^ power));
+ power := power + 1;
+ END LOOP;
+ RETURN decimal_num;
+END;
+$$ LANGUAGE plpgsql;
+
+SELECT binary_to_decimal('101');
+
diff --git a/Practice/SR/sr2.sql b/3 sem/Practice/SR/sr2.sql
similarity index 100%
rename from Practice/SR/sr2.sql
rename to 3 sem/Practice/SR/sr2.sql
diff --git a/Practice/SR/var1.sql b/3 sem/Practice/SR/var1.sql
similarity index 100%
rename from Practice/SR/var1.sql
rename to 3 sem/Practice/SR/var1.sql
diff --git a/Practice/prac1.sql b/3 sem/Practice/prac1.sql
similarity index 100%
rename from Practice/prac1.sql
rename to 3 sem/Practice/prac1.sql
diff --git a/Practice/prac2.sql b/3 sem/Practice/prac2.sql
similarity index 100%
rename from Practice/prac2.sql
rename to 3 sem/Practice/prac2.sql
diff --git a/3 sem/inserts.sql b/3 sem/inserts.sql
new file mode 100644
index 0000000..d86a8a9
--- /dev/null
+++ b/3 sem/inserts.sql
@@ -0,0 +1,307 @@
+SET DateStyle TO German;
+
+DROP TABLE IF EXISTS JOB_HISTORY;
+DROP TABLE IF EXISTS DEPARTMENTS CASCADE;
+DROP TABLE IF EXISTS EMPLOYEES;
+DROP TABLE IF EXISTS JOBS;
+DROP TABLE IF EXISTS LOCATIONS;
+DROP TABLE IF EXISTS COUNTRIES;
+DROP TABLE IF EXISTS REGIONS;
+
+CREATE TABLE REGIONS
+(
+ region_id integer PRIMARY KEY,
+ region_name varchar(64) NOT NULL UNIQUE
+);
+
+INSERT INTO regions
+VALUES(1, 'Europe '),
+(2, 'Americas '),
+(3, 'Asia '),
+(4, 'Middle East and Africa ');
+-- DELETE FROM COUNTRIES;
+
+CREATE TABLE COUNTRIES
+(
+ country_id varchar(2) PRIMARY KEY,
+ country_name varchar(64) NOT NULL UNIQUE,
+ region_id integer REFERENCES REGIONS(region_id) NOT NULL
+);
+
+INSERT INTO COUNTRIES VALUES
+('AR', 'Argentina', 2),
+('AU', 'Australia', 3),
+('BE', 'Belgium', 1),
+('BR', 'Brazil', 2),
+('CA', 'Canada', 2),
+('CH', 'Switzerland', 1),
+('CN', 'China', 3),
+('DE', 'Germany', 1),
+('DK', 'Denmark', 1),
+('EG', 'Egypt', 4),
+('FR', 'France', 1),
+('IL', 'Israel', 4),
+('IN', 'India', 3),
+('IT', 'Italy', 1),
+('JP', 'Japan', 3),
+('KW', 'Kuwait', 4),
+('ML', 'Malaysia', 3),
+('MX', 'Mexico', 2),
+('NG', 'Nigeria', 4),
+('NL', 'Netherlands', 1),
+('SG', 'Singapore', 3),
+('UK', 'United Kingdom', 1),
+('US', 'United States of America', 2),
+('ZM', 'Zambia', 4),
+('ZW', 'Zimbabwe', 4);
+-- DELETE FROM LOCATIONS;
+
+CREATE TABLE LOCATIONS
+(
+ location_id integer PRIMARY KEY,
+ street_address varchar(64) NOT NULL,
+ postal_code varchar(16),
+ city varchar(64),
+ state_province varchar(64),
+ country_id varchar(2) REFERENCES COUNTRIES(country_id) NOT NULL
+);
+
+INSERT INTO LOCATIONS VALUES
+(1000, '1297 Via Cola di Rie', '989', 'Roma', '', 'IT'),
+(1100, '93091 Calle della Testa', '10934', 'Venice', '', 'IT'),
+(1200, '2017 Shinjuku-ku', '1689', 'Tokyo', 'Tokyo Prefecture', 'JP'),
+(1300, '9450 Kamiya-cho', '6823', 'Hiroshima', '', 'JP'),
+(1400, '2014 Jabberwocky Rd', '26192', 'Southlake', 'Texas', 'US'),
+(1500, '2011 Interiors Blvd', '99236', 'South San Francisco', 'California', 'US'),
+(1600, '2007 Zagora St', '50090', 'South Brunswick', 'New Jersey', 'US'),
+(1700, '2004 Charade Rd', '98199', 'Seattle', 'Washington', 'US'),
+(1800, '147 Spadina Ave', 'M5V 2L7', 'Toronto', 'Ontario', 'CA'),
+(1900, '6092 Boxwood St', 'YSW 9T2', 'Whitehorse', 'Yukon', 'CA'),
+(2000, '40-5-12 Laogianggen', '190518', 'Beijing', '', 'CN'),
+(2100, '1298 Vileparle (E)', '490231', 'Bombay', 'Maharashtra', 'IN'),
+(2200, '12-98 Victoria Street', '2901', 'Sydney', 'New South Wales', 'AU'),
+(2300, '198 Clementi North', '540198', 'Singapore', '', 'SG'),
+(2400, '8204 Arthur St', '', 'London', '', 'UK'),
+(2500, 'Magdalen Centre, The Oxford Science Park', 'OX9 9ZB', 'Oxford', 'Oxford', 'UK'),
+(2600, '9702 Chester Road', '9629850293', 'Stretford', 'Manchester', 'UK'),
+(2700, 'Schwanthalerstr. 7031', '80925', 'Munich', 'Bavaria', 'DE'),
+(2800, 'Rua Frei Caneca 1360 ', '01307-002', 'Sao Paulo', 'Sao Paulo', 'BR'),
+(2900, '20 Rue des Corps-Saints', '1730', 'Geneva', 'Geneve', 'CH'),
+(3000, 'Murtenstrasse 921', '3095', 'Bern', 'BE', 'CH'),
+(3100, 'Pieter Breughelstraat 837', '3029SK', 'Utrecht', 'Utrecht', 'NL');
+-- DELETE FROM JOBS;
+
+CREATE TABLE JOBS(
+ job_id varchar(16) PRIMARY KEY,
+ job_title varchar(64) NOT NULL UNIQUE,
+ min_salary numeric(8, 2) NOT NULL,
+ max_salary numeric(8, 2) NOT NULL
+);
+
+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),
+('AC_MGR', 'Accounting Manager', 8200, 16000),
+('AC_ACCOUNT', 'Public Accountant', 4200, 9000),
+('SA_MAN', 'Sales Manager', 10000, 20080),
+('SA_REP', 'Sales Representative', 6000, 12008),
+('PU_MAN', 'Purchasing Manager', 8000, 15000),
+('PU_CLERK', 'Purchasing Clerk', 2500, 5500),
+('ST_MAN', 'Stock Manager', 5500, 8500),
+('ST_CLERK', 'Stock Clerk', 2008, 5000),
+('SH_CLERK', 'Shipping Clerk', 2500, 5500),
+('IT_PROG', 'Programmer', 4000, 10000),
+('MK_MAN', 'Marketing Manager', 9000, 15000),
+('MK_REP', 'Marketing Representative', 4000, 9000),
+('HR_REP', 'Human Resources Representative', 4000, 9000),
+('PR_REP', 'Public Relations Representative', 4500, 10500);
+-- DELETE FROM DEPARTMENTS;
+
+CREATE TABLE EMPLOYEES
+(
+ employee_id integer PRIMARY KEY,
+ first_name varchar(64) NOT NULL,
+ last_name varchar(64) NOT NULL,
+ email varchar(64) NOT NULL UNIQUE,
+ phone_integer varchar(64) NOT NULL,
+ hire_date timestamp NOT NULL,
+ job_id varchar(16) REFERENCES JOBS(job_id),
+ salary numeric(8, 2) NOT NULL,
+ commission_pct numeric(5, 2),
+ manager_id integer REFERENCES EMPLOYEES(employee_id),
+ department_id integer
+);
+
+-- DELETE FROM EMPLOYEES;
+INSERT INTO employees VALUES(100, 'Steven', 'King', 'SKING', '515.123.4567', '17.06.2003', 'AD_PRES', 24000, NULL, NULL, 90);
+INSERT INTO employees VALUES(101, 'Neena', 'Kochhar', 'NKOCHHAR', '515.123.4568', '21.09.2005', 'AD_VP', 17000, NULL, 100, 90);
+INSERT INTO employees VALUES(102, 'Lex', 'De Haan', 'LDEHAAN', '515.123.4569', '13.01.2001', 'AD_VP', 17000, NULL, 100, 90);
+INSERT INTO employees VALUES(103, 'Alexander', 'Hunold', 'AHUNOLD', '590.423.4567', '03.01.2006', 'IT_PROG', 9000, NULL, 102, 60);
+INSERT INTO employees VALUES(104, 'Bruce', 'Ernst', 'BERNST', '590.423.4568', '21.05.2007', 'IT_PROG', 6000, NULL, 103, 60);
+INSERT INTO employees VALUES(105, 'David', 'Austin', 'DAUSTIN', '590.423.4569', '25.06.2005', 'IT_PROG', 4800, NULL, 103, 60);
+INSERT INTO employees VALUES(106, 'Valli', 'Pataballa', 'VPATABAL', '590.423.4560', '05.02.2006', 'IT_PROG', 4800, NULL, 103, 60);
+INSERT INTO employees VALUES(107, 'Diana', 'Lorentz', 'DLORENTZ', '590.423.5567', '07.02.2007', 'IT_PROG', 4200, NULL, 103, 60);
+INSERT INTO employees VALUES(108, 'Nancy', 'Greenberg', 'NGREENBE', '515.124.4569', '17.08.2002', 'FI_MGR', 12008, NULL, 101, 100);
+INSERT INTO employees VALUES(109, 'Daniel', 'Faviet', 'DFAVIET', '515.124.4169', '16.08.2002', 'FI_ACCOUNT', 9000, NULL, 108, 100);
+INSERT INTO employees VALUES(110, 'John', 'Chen', 'JCHEN', '515.124.4269', '28.09.2005', 'FI_ACCOUNT', 8200, NULL, 108, 100);
+INSERT INTO employees VALUES(111, 'Ismael', 'Sciarra', 'ISCIARRA', '515.124.4369', '30.09.2005', 'FI_ACCOUNT', 7700, NULL, 108, 100);
+INSERT INTO employees VALUES(112, 'Jose Manuel', 'Urman', 'JMURMAN', '515.124.4469', '07.03.2006', 'FI_ACCOUNT', 7800, NULL, 108, 100);
+INSERT INTO employees VALUES(113, 'Luis', 'Popp', 'LPOPP', '515.124.4567', '07.12.2007', 'FI_ACCOUNT', 6900, NULL, 108, 100);
+INSERT INTO employees VALUES(114, 'Den', 'Raphaely', 'DRAPHEAL', '515.127.4561', '07.12.2002', 'PU_MAN', 11000, NULL, 100, 30);
+INSERT INTO employees VALUES(115, 'Alexander', 'Khoo', 'AKHOO', '515.127.4562', '18.05.2003', 'PU_CLERK', 3100, NULL, 114, 30);
+INSERT INTO employees VALUES(116, 'Shelli', 'Baida', 'SBAIDA', '515.127.4563', '24.12.2005', 'PU_CLERK', 2900, NULL, 114, 30);
+INSERT INTO employees VALUES(117, 'Sigal', 'Tobias', 'STOBIAS', '515.127.4564', '24.07.2005', 'PU_CLERK', 2800, NULL, 114, 30);
+INSERT INTO employees VALUES(118, 'Guy', 'Himuro', 'GHIMURO', '515.127.4565', '15.11.2006', 'PU_CLERK', 2600, NULL, 114, 30);
+INSERT INTO employees VALUES(119, 'Karen', 'Colmenares', 'KCOLMENA', '515.127.4566', '10.08.2007', 'PU_CLERK', 2500, NULL, 114, 30);
+INSERT INTO employees VALUES(120, 'Matthew', 'Weiss', 'MWEISS', '650.123.1234', '18.07.2004', 'ST_MAN', 8000, NULL, 100, 50);
+INSERT INTO employees VALUES(121, 'Adam', 'Fripp', 'AFRIPP', '650.123.2234', '10.04.2005', 'ST_MAN', 8200, NULL, 100, 50);
+INSERT INTO employees VALUES(122, 'Payam', 'Kaufling', 'PKAUFLIN', '650.123.3234', '01.05.2003', 'ST_MAN', 7900, NULL, 100, 50);
+INSERT INTO employees VALUES(123, 'Shanta', 'Vollman', 'SVOLLMAN', '650.123.4234', '10.10.2005', 'ST_MAN', 6500, NULL, 100, 50);
+INSERT INTO employees VALUES(124, 'Kevin', 'Mourgos', 'KMOURGOS', '650.123.5234', '16.11.2007', 'ST_MAN', 5800, NULL, 100, 50);
+INSERT INTO employees VALUES(125, 'Julia', 'Nayer', 'JNAYER', '650.124.1214', '16.07.2005', 'ST_CLERK', 3200, NULL, 120, 50);
+INSERT INTO employees VALUES(126, 'Irene', 'Mikkilineni', 'IMIKKILI', '650.124.1224', '28.09.2006', 'ST_CLERK', 2700, NULL, 120, 50);
+INSERT INTO employees VALUES(127, 'James', 'Landry', 'JLANDRY', '650.124.1334', '14.01.2007', 'ST_CLERK', 2400, NULL, 120, 50);
+INSERT INTO employees VALUES(128, 'Steven', 'Markle', 'SMARKLE', '650.124.1434', '08.03.2008', 'ST_CLERK', 2200, NULL, 120, 50);
+INSERT INTO employees VALUES(129, 'Laura', 'Bissot', 'LBISSOT', '650.124.5234', '20.08.2005', 'ST_CLERK', 3300, NULL, 121, 50);
+INSERT INTO employees VALUES(130, 'Mozhe', 'Atkinson', 'MATKINSO', '650.124.6234', '30.10.2005', 'ST_CLERK', 2800, NULL, 121, 50);
+INSERT INTO employees VALUES(131, 'James', 'Marlow', 'JAMRLOW', '650.124.7234', '16.02.2005', 'ST_CLERK', 2500, NULL, 121, 50);
+INSERT INTO employees VALUES(132, 'TJ', 'Olson', 'TJOLSON', '650.124.8234', '10.04.2007', 'ST_CLERK', 2100, NULL, 121, 50);
+INSERT INTO employees VALUES(133, 'Jason', 'Mallin', 'JMALLIN', '650.127.1934', '14.06.2004', 'ST_CLERK', 3300, NULL, 122, 50);
+INSERT INTO employees VALUES(134, 'Michael', 'Rogers', 'MROGERS', '650.127.1834', '26.08.2006', 'ST_CLERK', 2900, NULL, 122, 50);
+INSERT INTO employees VALUES(135, 'Ki', 'Gee', 'KGEE', '650.127.1734', '12.12.2007', 'ST_CLERK', 2400, NULL, 122, 50);
+INSERT INTO employees VALUES(136, 'Hazel', 'Philtanker', 'HPHILTAN', '650.127.1634', '06.02.2008', 'ST_CLERK', 2200, NULL, 122, 50);
+INSERT INTO employees VALUES(137, 'Renske', 'Ladwig', 'RLADWIG', '650.121.1234', '14.07.2003', 'ST_CLERK', 3600, NULL, 123, 50);
+INSERT INTO employees VALUES(138, 'Stephen', 'Stiles', 'SSTILES', '650.121.2034', '26.10.2005', 'ST_CLERK', 3200, NULL, 123, 50);
+INSERT INTO employees VALUES(139, 'John', 'Seo', 'JSEO', '650.121.2019', '12.02.2006', 'ST_CLERK', 2700, NULL, 123, 50);
+INSERT INTO employees VALUES(140, 'Joshua', 'Patel', 'JPATEL', '650.121.1834', '06.04.2006', 'ST_CLERK', 2500, NULL, 123, 50);
+INSERT INTO employees VALUES(141, 'Trenna', 'Rajs', 'TRAJS', '650.121.8009', '17.10.2003', 'ST_CLERK', 3500, NULL, 124, 50);
+INSERT INTO employees VALUES(142, 'Curtis', 'Davies', 'CDAVIES', '650.121.2994', '29.01.2005', 'ST_CLERK', 3100, NULL, 124, 50);
+INSERT INTO employees VALUES(143, 'Randall', 'Matos', 'RMATOS', '650.121.2874', '15.03.2006', 'ST_CLERK', 2600, NULL, 124, 50);
+INSERT INTO employees VALUES(144, 'Peter', 'Vargas', 'PVARGAS', '650.121.2004', '09.07.2006', 'ST_CLERK', 2500, NULL, 124, 50);
+INSERT INTO employees VALUES(145, 'John', 'Russell', 'JRUSSEL', '011.44.1344.429268', '01.10.2004', 'SA_MAN', 14000, '0.4', 100, 80);
+INSERT INTO employees VALUES(146, 'Karen', 'Partners', 'KPARTNER', '011.44.1344.467268', '05.01.2005', 'SA_MAN', 13500, '0.3', 100, 80);
+INSERT INTO employees VALUES(147, 'Alberto', 'Errazuriz', 'AERRAZUR', '011.44.1344.429278', '10.03.2005', 'SA_MAN', 12000, '0.3', 100, 80);
+INSERT INTO employees VALUES(148, 'Gerald', 'Cambrault', 'GCAMBRAU', '011.44.1344.619268', '15.10.2007', 'SA_MAN', 11000, '0.3', 100, 80);
+INSERT INTO employees VALUES(149, 'Eleni', 'Zlotkey', 'EZLOTKEY', '011.44.1344.429018', '29.01.2008', 'SA_MAN', 10500, '0.2', 100, 80);
+INSERT INTO employees VALUES(150, 'Peter', 'Tucker', 'PTUCKER', '011.44.1344.129268', '30.01.2005', 'SA_REP', 10000, '0.3', 145, 80);
+INSERT INTO employees VALUES(151, 'David', 'Bernstein', 'DBERNSTE', '011.44.1344.345268', '24.03.2005', 'SA_REP', 9500, '0.25', 145, 80);
+INSERT INTO employees VALUES(152, 'Peter', 'Hall', 'PHALL', '011.44.1344.478968', '20.08.2005', 'SA_REP', 9000, '0.25', 145, 80);
+INSERT INTO employees VALUES(153, 'Christopher', 'Olsen', 'COLSEN', '011.44.1344.498718', '30.03.2006', 'SA_REP', 8000, '0.2', 145, 80);
+INSERT INTO employees VALUES(154, 'Nanette', 'Cambrault', 'NCAMBRAU', '011.44.1344.987668', '09.12.2006', 'SA_REP', 7500, '0.2', 145, 80);
+INSERT INTO employees VALUES(155, 'Oliver', 'Tuvault', 'OTUVAULT', '011.44.1344.486508', '23.11.2007', 'SA_REP', 7000, '0.15', 145, 80);
+INSERT INTO employees VALUES(156, 'Janette', 'King', 'JKING', '011.44.1345.429268', '30.01.2004', 'SA_REP', 10000, '0.35', 146, 80);
+INSERT INTO employees VALUES(157, 'Patrick', 'Sully', 'PSULLY', '011.44.1345.929268', '04.03.2004', 'SA_REP', 9500, '0.35', 146, 80);
+INSERT INTO employees VALUES(158, 'Allan', 'McEwen', 'AMCEWEN', '011.44.1345.829268', '01.08.2004', 'SA_REP', 9000, '0.35', 146, 80);
+INSERT INTO employees VALUES(159, 'Lindsey', 'Smith', 'LSMITH', '011.44.1345.729268', '10.03.2005', 'SA_REP', 8000, '0.3', 146, 80);
+INSERT INTO employees VALUES(160, 'Louise', 'Doran', 'LDORAN', '011.44.1345.629268', '15.12.2005', 'SA_REP', 7500, '0.3', 146, 80);
+INSERT INTO employees VALUES(161, 'Sarath', 'Sewall', 'SSEWALL', '011.44.1345.529268', '03.11.2006', 'SA_REP', 7000, '0.25', 146, 80);
+INSERT INTO employees VALUES(162, 'Clara', 'Vishney', 'CVISHNEY', '011.44.1346.129268', '11.11.2005', 'SA_REP', 10500, '0.25', 147, 80);
+INSERT INTO employees VALUES(163, 'Danielle', 'Greene', 'DGREENE', '011.44.1346.229268', '19.03.2007', 'SA_REP', 9500, '0.15', 147, 80);
+INSERT INTO employees VALUES(164, 'Mattea', 'Marvins', 'MMARVINS', '011.44.1346.329268', '24.01.2008', 'SA_REP', 7200, '0.1', 147, 80);
+INSERT INTO employees VALUES(165, 'David', 'Lee', 'DLEE', '011.44.1346.529268', '23.02.2008', 'SA_REP', 6800, '0.1', 147, 80);
+INSERT INTO employees VALUES(166, 'Sundar', 'Ande', 'SANDE', '011.44.1346.629268', '24.03.2008', 'SA_REP', 6400, '0.1', 147, 80);
+INSERT INTO employees VALUES(167, 'Amit', 'Banda', 'ABANDA', '011.44.1346.729268', '21.04.2008', 'SA_REP', 6200, '0.1', 147, 80);
+INSERT INTO employees VALUES(168, 'Lisa', 'Ozer', 'LOZER', '011.44.1343.929268', '11.03.2005', 'SA_REP', 11500, '0.25', 148, 80);
+INSERT INTO employees VALUES(169, 'Harrison', 'Bloom', 'HBLOOM', '011.44.1343.829268', '23.03.2006', 'SA_REP', 10000, '0.2', 148, 80);
+INSERT INTO employees VALUES(170, 'Tayler', 'Fox', 'TFOX', '011.44.1343.729268', '24.01.2006', 'SA_REP', 9600, '0.2', 148, 80);
+INSERT INTO employees VALUES(171, 'William', 'Smith', 'WSMITH', '011.44.1343.629268', '23.02.2007', 'SA_REP', 7400, '0.15', 148, 80);
+INSERT INTO employees VALUES(172, 'Elizabeth', 'Bates', 'EBATES', '011.44.1343.529268', '24.03.2007', 'SA_REP', 7300, '0.15', 148, 80);
+INSERT INTO employees VALUES(173, 'Sundita', 'Kumar', 'SKUMAR', '011.44.1343.329268', '21.04.2008', 'SA_REP', 6100, '0.1', 148, 80);
+INSERT INTO employees VALUES(174, 'Ellen', 'Abel', 'EABEL', '011.44.1644.429267', '11.05.2004', 'SA_REP', 11000, '0.3', 149, 80);
+INSERT INTO employees VALUES(175, 'Alyssa', 'Hutton', 'AHUTTON', '011.44.1644.429266', '19.03.2005', 'SA_REP', 8800, '0.25', 149, 80);
+INSERT INTO employees VALUES(176, 'Jonathon', 'Taylor', 'JTAYLOR', '011.44.1644.429265', '24.03.2006', 'SA_REP', 8600, '0.2', 149, 80);
+INSERT INTO employees VALUES(177, 'Jack', 'Livingston', 'JLIVINGS', '011.44.1644.429264', '23.04.2006', 'SA_REP', 8400, '0.2', 149, 80);
+INSERT INTO employees VALUES(178, 'Kimberely', 'Grant', 'KGRANT', '011.44.1644.429263', '24.05.2007', 'SA_REP', 7000, '0.15', 149, NULL);
+INSERT INTO employees VALUES(179, 'Charles', 'Johnson', 'CJOHNSON', '011.44.1644.429262', '04.01.2008', 'SA_REP', 6200, '0.1', 149, 80);
+INSERT INTO employees VALUES(180, 'Winston', 'Taylor', 'WTAYLOR', '650.507.9876', '24.01.2006', 'SH_CLERK', 3200, NULL, 120, 50);
+INSERT INTO employees VALUES(181, 'Jean', 'Fleaur', 'JFLEAUR', '650.507.9877', '23.02.2006', 'SH_CLERK', 3100, NULL, 120, 50);
+INSERT INTO employees VALUES(182, 'Martha', 'Sullivan', 'MSULLIVA', '650.507.9878', '21.06.2007', 'SH_CLERK', 2500, NULL, 120, 50);
+INSERT INTO employees VALUES(183, 'Girard', 'Geoni', 'GGEONI', '650.507.9879', '03.02.2008', 'SH_CLERK', 2800, NULL, 120, 50);
+INSERT INTO employees VALUES(184, 'Nandita', 'Sarchand', 'NSARCHAN', '650.509.1876', '27.01.2004', 'SH_CLERK', 4200, NULL, 121, 50);
+INSERT INTO employees VALUES(185, 'Alexis', 'Bull', 'ABULL', '650.509.2876', '20.02.2005', 'SH_CLERK', 4100, NULL, 121, 50);
+INSERT INTO employees VALUES(186, 'Julia', 'Dellinger', 'JDELLING', '650.509.3876', '24.06.2006', 'SH_CLERK', 3400, NULL, 121, 50);
+INSERT INTO employees VALUES(187, 'Anthony', 'Cabrio', 'ACABRIO', '650.509.4876', '07.02.2007', 'SH_CLERK', 3000, NULL, 121, 50);
+INSERT INTO employees VALUES(188, 'Kelly', 'Chung', 'KCHUNG', '650.505.1876', '14.06.2005', 'SH_CLERK', 3800, NULL, 122, 50);
+INSERT INTO employees VALUES(189, 'Jennifer', 'Dilly', 'JDILLY', '650.505.2876', '13.08.2005', 'SH_CLERK', 3600, NULL, 122, 50);
+INSERT INTO employees VALUES(190, 'Timothy', 'Gates', 'TGATES', '650.505.3876', '11.07.2006', 'SH_CLERK', 2900, NULL, 122, 50);
+INSERT INTO employees VALUES(191, 'Randall', 'Perkins', 'RPERKINS', '650.505.4876', '19.12.2007', 'SH_CLERK', 2500, NULL, 122, 50);
+INSERT INTO employees VALUES(192, 'Sarah', 'Bell', 'SBELL', '650.501.1876', '04.02.2004', 'SH_CLERK', 4000, NULL, 123, 50);
+INSERT INTO employees VALUES(193, 'Britney', 'Everett', 'BEVERETT', '650.501.2876', '03.03.2005', 'SH_CLERK', 3900, NULL, 123, 50);
+INSERT INTO employees VALUES(194, 'Samuel', 'McCain', 'SMCCAIN', '650.501.3876', '01.07.2006', 'SH_CLERK', 3200, NULL, 123, 50);
+INSERT INTO employees VALUES(195, 'Vance', 'Jones', 'VJONES', '650.501.4876', '17.03.2007', 'SH_CLERK', 2800, NULL, 123, 50);
+INSERT INTO employees VALUES(196, 'Alana', 'Walsh', 'AWALSH', '650.507.9811', '24.04.2006', 'SH_CLERK', 3100, NULL, 124, 50);
+INSERT INTO employees VALUES(197, 'Kevin', 'Feeney', 'KFEENEY', '650.507.9822', '23.05.2006', 'SH_CLERK', 3000, NULL, 124, 50);
+INSERT INTO employees VALUES(198, 'Donald', 'OConnell', 'DOCONNEL', '650.507.9833', '21.06.2007', 'SH_CLERK', 2600, NULL, 124, 50);
+INSERT INTO employees VALUES(199, 'Douglas', 'Grant', 'DGRANT', '650.507.9844', '13.01.2008', 'SH_CLERK', 2600, NULL, 124, 50);
+INSERT INTO employees VALUES(200, 'Jennifer', 'Whalen', 'JWHALEN', '515.123.4444', '17.09.2003', 'AD_ASST', 4400, NULL, 101, 10);
+INSERT INTO employees VALUES(201, 'Michael', 'Hartstein', 'MHARTSTE', '515.123.5555', '17.02.2004', 'MK_MAN', 13000, NULL, 100, 20);
+INSERT INTO employees VALUES(202, 'Pat', 'Fay', 'PFAY', '603.123.6666', '17.08.2005', 'MK_REP', 6000, NULL, 201, 20);
+INSERT INTO employees VALUES(203, 'Susan', 'Mavris', 'SMAVRIS', '515.123.7777', '07.06.2002', 'HR_REP', 6500, NULL, 101, 40);
+INSERT INTO employees VALUES(204, 'Hermann', 'Baer', 'HBAER', '515.123.8888', '07.06.2002', 'PR_REP', 10000, NULL, 101, 70);
+INSERT INTO employees VALUES(205, 'Shelley', 'Higgins', 'SHIGGINS', '515.123.8080', '07.06.2002', 'AC_MGR', 12008, NULL, 101, 110);
+INSERT INTO employees VALUES(206, 'William', 'Gietz', 'WGIETZ', '515.123.8181', '07.06.2002', 'AC_ACCOUNT', 8300, NULL, 205, 110);
+
+CREATE TABLE DEPARTMENTS
+(
+ department_id integer PRIMARY KEY,
+ department_name varchar(64) NOT NULL UNIQUE,
+ manager_id integer REFERENCES EMPLOYEES(employee_id),
+ location_id integer REFERENCES LOCATIONS(location_id)
+);
+
+INSERT INTO departments VALUES
+(10, 'Administration', 200, 1700),
+(20, 'Marketing', 201, 1800),
+(30, 'Purchasing', 114, 1700),
+(40, 'Human Resources', 203, 2400),
+(50, 'Shipping', 121, 1500),
+(60, 'IT', 103, 1400),
+(70, 'Public Relations', 204, 2700),
+(80, 'Sales', 145, 2500),
+(90, 'Executive', 100, 1700),
+(100, 'Finance', 108, 1700),
+(110, 'Accounting', 205, 1700),
+(120, 'Treasury', NULL, 1700),
+(130, 'Corporate Tax', NULL, 1700),
+(140, 'Control And Credit', NULL, 1700),
+(150, 'Shareholder Services', NULL, 1700),
+(160, 'Benefits', NULL, 1700),
+(170, 'Manufacturing', NULL, 1700),
+(180, 'Construction', NULL, 1700),
+(190, 'Contracting', NULL, 1700),
+(200, 'Operations', NULL, 1700),
+(210, 'IT Support', NULL, 1700),
+(220, 'NOC', NULL, 1700),
+(230, 'IT Helpdesk', NULL, 1700),
+(240, 'Government Sales', NULL, 1700),
+(250, 'Retail Sales', NULL, 1700),
+(260, 'Recruiting', NULL, 1700),
+(270, 'Payroll', NULL, 1700);
+
+ALTER TABLE EMPLOYEES ADD CONSTRAINT DE FOREIGN KEY(department_id)
+ REFERENCES DEPARTMENTS(department_id);
+
+CREATE TABLE JOB_HISTORY
+(
+ employee_id integer REFERENCES EMPLOYEES(employee_id),
+ start_date timestamp,
+ PRIMARY KEY(employee_id, start_date),
+ end_date timestamp,
+ job_id varchar(16) REFERENCES JOBS(job_id) NOT NULL,
+ department_id integer REFERENCES DEPARTMENTS(department_id) NOT NULL
+);
+
+INSERT INTO job_history VALUES
+(102, '13.01.2001', '24.07.2006', 'IT_PROG', 60),
+(101, '21.09.1997', '27.10.2001', 'AC_ACCOUNT', 110),
+(101, '28.10.2001', '15.03.2005', 'AC_MGR', 110),
+(201, '17.02.2004', '19.12.2007', 'MK_REP', 20),
+(114, '24.03.2006', '31.12.2007', 'ST_CLERK', 50),
+(122, '01.01.2007', '31.12.2007', 'ST_CLERK', 50),
+(200, '17.09.1995', '17.06.2001', 'AD_ASST', 90),
+(176, '24.03.2006', '31.12.2006', 'SA_REP', 80),
+(176, '01.01.2007', '31.12.2007', 'SA_MAN', 80),
+(200, '01.07.2002', '31.12.2006', 'AC_ACCOUNT', 90);
diff --git a/BD_4s/task 1.sql b/BD_4s/task 1.sql
new file mode 100644
index 0000000..a1a388e
--- /dev/null
+++ b/BD_4s/task 1.sql
@@ -0,0 +1,72 @@
+--2
+SELECT *
+FROM bd_departments
+WHERE LENGTH(street) = POWER(SQRT(75 + LENGTH(street)), 2) / 4;
+
+INSERT INTO bd_departments VALUES
+(35,'meow', 407596, 'aaaaaaaaaaaaaaaaaaaaaaaaa', 2, 'MSK');
+--4
+CREATE TABLE employees_backup AS
+SELECT *,
+ CASE
+ WHEN random() < 0.5 THEN 'Active'
+ ELSE 'Inactive'
+ END AS employee_status
+FROM bd_employees;
+SELECT * FROM employees_backup;
+--5
+SELECT e.employee_id, e.first_name, e.last_name, e.manager_id
+FROM employees e
+JOIN employees m ON e.manager_id = m.employee_id
+WHERE LENGTH(m.last_name) > 6;
+
+--3--
+
+DO $$
+DECLARE
+BEGIN
+ RAISE NOTICE 'Шахматная доска:';
+ CALL chess('z9', 'C');
+
+
+ RAISE NOTICE 'Размещение фигуры А на клетке A5:';
+ CALL chess('a5', ' A ');
+
+
+ RAISE NOTICE 'Размещение фигуры У на клетке H4:';
+ CALL chess('h4', ' Y ');
+
+
+END $$;
+
+
+
+CREATE OR REPLACE PROCEDURE chess(pos varchar, bukva char) AS $$
+DECLARE
+ board text;
+ queen_col integer;
+ queen_row integer;
+BEGIN
+ queen_col := ascii(substring(pos from 1 for 1)) - 96;
+ queen_row := substring(pos from 2)::integer;
+
+ FOR i IN 1..8 LOOP
+ board := '';
+
+ FOR j IN 1..8 LOOP
+ IF i = queen_row AND j = queen_col THEN
+ board := board || bukva;
+ ELSE
+ IF (i + j) % 2 = 0 THEN
+ board := board || ' б ';
+ ELSE
+ board := board || ' ч ';
+ END IF;
+ END IF;
+ END LOOP;
+
+ RAISE NOTICE '%', board;
+ END LOOP;
+END
+$$ LANGUAGE plpgsql;
+SELECT chess('c3');
\ No newline at end of file
diff --git a/BD_4s/task3.sql b/BD_4s/task3.sql
new file mode 100644
index 0000000..5e057e4
--- /dev/null
+++ b/BD_4s/task3.sql
@@ -0,0 +1,32 @@
+DO $$
+DECLARE
+ board CHAR(8)[][] := ARRAY[
+ ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
+ ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б'],
+ ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
+ ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б'],
+ ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
+ ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б'],
+ ARRAY['б', 'ч', 'б', 'ч', 'б', 'ч', 'б', 'ч'],
+ ARRAY['ч', 'б', 'ч', 'б', 'ч', 'б', 'ч', 'б']
+ ];
+
+BEGIN
+ RAISE NOTICE 'Шахматная доска:';
+ FOR i IN REVERSE 1..8 LOOP
+ RAISE NOTICE '%', board[i];
+ END LOOP;
+
+ RAISE NOTICE 'Размещение фигуры А на клетке A5:';
+ board[8 - 5 + 1][ASCII('A') - 64] := 'A';
+ FOR i IN REVERSE 1..8 LOOP
+ RAISE NOTICE '%', board[i];
+ END LOOP;
+
+ RAISE NOTICE 'Размещение фигуры У на клетке H4:';
+ board[8 - ч + 1][ASCII('H') - 64] := 'У';
+ FOR i IN REVERSE 1..8 LOOP
+ RAISE NOTICE '%', board[i];
+ END LOOP;
+
+END $$;
diff --git a/BD_4s/task_from_lection.sql b/BD_4s/task_from_lection.sql
new file mode 100644
index 0000000..59e3c80
--- /dev/null
+++ b/BD_4s/task_from_lection.sql
@@ -0,0 +1,25 @@
+
+INSERT INTO A VALUES
+(1,2),
+(2,3);
+
+INSERT INTO B VALUES
+(1,1),
+(2,3);
+
+INSERT INTO C VALUES
+(1,2,1,1),
+(1,2,2,2),
+(2,3,1,1),
+(1,2,4,5);
+
+
+SELECT a.F1, a.F2 FROM a,b,c
+WHERE a.F1 = c.F1 AND a.F2 = c.F2 AND b.F3 = c.F3 AND b.F4 = c.F4
+GROUP BY a.F1, a.F2 HAVING COUNT (a.F1) = (SELECT COUNT(F3) FROM b);
+
+SELECT F1, F2 FROM C
+ WHERE F3 IN (SELECT F3 FROM B) AND F4 IN (SELECT F4 FROM B)
+ GROUP BY F1, F2 HAVING COUNT(*) = (
+ SELECT COUNT(*) FROM b
+ );
\ No newline at end of file
diff --git a/Lab/Lab#6/lab6.sql b/Lab/Lab#6/lab6.sql
deleted file mode 100644
index 4f7e5b7..0000000
--- a/Lab/Lab#6/lab6.sql
+++ /dev/null
@@ -1,97 +0,0 @@
-/* Вариант 1 || Работа 6 || Антипенко, Дробышевский */
-
-
--- Task 1 --
-/* a) Напишите запрос, используя конструкцию WITH, выбирающий
-рекурсивно сотрудника с идентификатором 1 и все его подчинённых,
-как прямых, так и подчинённых более низкого ранга*.
-b) Напишите программу на языке PL/SQL, печатающую на экран фамилию
-и имя сотрудника с идентификатором 1 и всех его подчинённых, как
-прямых, так и подчинённых более низкого ранга. */
-
-CREATE OR REPLACE PROCEDURE department_names() AS
-DECLARE d_attrs RECORD;
-BEGIN
-
-FOR d_attrs IN WITH RECURSIVE tmp AS (
- SELECT id, first_name, last_name, manager_id, 1 AS level
- FROM bd6_employees
- WHERE manager_id = 1 or id = 1
- UNION ALL
- SELECT e.id, e.first_name, e.last_name, e.manager_id, t.level + 1
- FROM bd6_employees e JOIN tmp t ON e.manager_id = t.id )
-
-SELECT * FROM tmp
-LOOP
- RAISE INFO ' % % ', d_attrs.first_name, d_attrs.last_name;
-END LOOP;
-END LANGUAGE plpgsql;
-CALL department_names();
-
-
--- Task 2 --
-/* Напишите программу на языке PL/SQL, выбирающую строки из таблицы
-employees в порядке возрастания заработной платы (salary) и печатающие на
-экран следующие данные: фамилия, имя, модифицированная заработная
-плата. Модифицированная заработная плата получается следующим
-образом: у первого по порядку сотрудника она округляется до сотен в
-меньшую сторону, а у всех последующих сотрудников она сначала
-увеличивается на остаток от округления, полученный от предыдущего
-сотрудника, а затем округляется до сотен в меньшую сторону. */
-
-CREATE OR REPLACE FUNCTION print_employees() RETURNS VOID AS $$
-DECLARE
-current_salary INTEGER;
-m_salary INTEGER;
-mod_salary INTEGER := 0;
-employee_rec RECORD;
-BEGIN
-FOR employee_rec IN (SELECT last_name, first_name, salary_in_euro FROM bd6_employees ORDER BY salary_in_euro) LOOP
-current_salary := employee_rec.salary_in_euro;
-
-IF mod_salary=0 THEN
-m_salary := (current_salary / 100) * 100;
- ELSE
-m_salary := ((current_salary + mod_salary) / 100) * 100;
-END IF;
-
-RAISE NOTICE 'Employee: % %, Modified Salary: %', employee_rec.last_name, employee_rec.first_name, m_salary;
-mod_salary := current_salary - m_salary;
-END LOOP;
-END $$ LANGUAGE plpgsql;
-
-SELECT print_employees();
-
--- Task 3 --
-/* Напишите программу на языке PL/SQL, удаляющую 10 сотрудников с
-самой маленькой заработной платой. При этом их заработная плата должна
-добавиться 10 сотрудникам с самой большой заработной платой. Причём
-самая маленькая заработная плата должна добавиться к человеку с самой
-большой заработной платой. 2-я с конца заработная плата должна добавиться
-к человеку со второй по размеру заработной платой и т.д. */
-
--- Task 4 --
-/* Создайте таблицу spiral с 5 полями f1, f2, f3, f4, f5 – целые числа.
-Напишите программу на языке PL/SQL, заполняющую данную таблицу 1000
-строк по следующему принципу:
-1 2 3 4 5
-10 9 8 7 6
-11 12 13 14 15
-20 19 18 17 16
-21 22 23 24 25 */
-
-CREATE OR REPLACE PROCEDURE f() AS $$
-DECLARE d_attrs RECORD;
-BEGIN
-
-FOR d_attrs IN WITH RECURSIVE tmp AS (
- SELECT i AS f1, i2 AS f2, i3 AS f3,i4 AS f4,i5 AS f5
- FROM generate_series(1,200) i)
-
-SELECT * FROM tmp
-LOOP
-RAISE INFO ' % % % % %',
-d_attrs.f1, d_attrs.f2, d_attrs.f3, d_attrs.f4, d_attrs.f5;
-END LOOP;
-END $$ LANGUAGE plpgsql;
-call f();
diff --git a/Lab`s/insert.sql b/Lab`s/insert.sql
new file mode 100644
index 0000000..25423de
--- /dev/null
+++ b/Lab`s/insert.sql
@@ -0,0 +1,19 @@
+-- Воспользуемся транзакцией
+
+BEGIN;
+
+INSERT INTO Cathegory(cath_name, root_id) VALUES
+('Breakfast', NULL),
+('Lunch', NULL),
+('Dinner', NULL),
+(),
+(),
+();
+
+INSERT INTO Dish VALUES
+(),
+(),
+(),
+(),
+(),
+();
\ No newline at end of file
diff --git a/Lab`s/lab`s_code.sql b/Lab`s/lab`s_code.sql
new file mode 100644
index 0000000..ee87ec3
--- /dev/null
+++ b/Lab`s/lab`s_code.sql
@@ -0,0 +1,209 @@
+-- This script was generated by the ERD tool in pgAdmin 4.
+-- Please log an issue at https://redmine.postgresql.org/projects/pgadmin4/issues/new if you find any bugs, including reproduction steps.
+BEGIN;
+
+DROP TABLE IF EXISTS public."Tech_Dish";
+DROP TABLE IF EXISTS public."Source";
+DROP TABLE IF EXISTS public."Link";
+DROP TABLE IF EXISTS public."Dish";
+DROP TABLE IF EXISTS public."Cathegory";
+
+DROP TABLE IF EXISTS public."Tech";
+
+DROP TABLE IF EXISTS public."Conversion";
+DROP TABLE IF EXISTS public."Alternative Name";
+DROP TABLE IF EXISTS public."Ingredients";
+DROP TABLE IF EXISTS public."Methods";
+
+
+CREATE TABLE IF NOT EXISTS public."Cathegory"
+(
+ cath_id serial,
+ cath_name character varying(20) NOT NULL,
+ root_id integer,
+ PRIMARY KEY (cath_id),
+ CONSTRAINT "Name" UNIQUE (cath_name)
+);
+
+
+
+CREATE TABLE IF NOT EXISTS public."Dish"
+(
+ dish_id serial,
+ cath_id integer NOT NULL,
+ name character varying(20) NOT NULL,
+ cook_time interval NOT NULL,
+ manual text NOT NULL,
+ PRIMARY KEY (dish_id),
+ CONSTRAINT "Name Dish" UNIQUE (name)
+);
+
+
+
+CREATE TABLE IF NOT EXISTS public."Link"
+(
+ dish_id integer,
+ ingr_id integer,
+ method_id integer NOT NULL,
+ amount numeric(10) NOT NULL,
+ PRIMARY KEY (dish_id, ingr_id)
+);
+
+
+
+CREATE TABLE IF NOT EXISTS public."Ingredients"
+(
+ ingr_id serial,
+ ingr_name character varying(20) NOT NULL,
+ ingr_descr text NOT NULL,
+ PRIMARY KEY (ingr_id),
+ CONSTRAINT "Inrg Name" UNIQUE (ingr_name)
+);
+
+
+
+CREATE TABLE IF NOT EXISTS public."Conversion"
+(
+ ingr_id integer,
+ method1_id integer,
+ method2_id integer,
+ transit numeric NOT NULL,
+ PRIMARY KEY (ingr_id, method1_id, method2_id)
+);
+
+
+
+CREATE TABLE IF NOT EXISTS public."Methods"
+(
+ method_id serial,
+ method_name character varying(20) NOT NULL,
+ standart boolean NOT NULL,
+ PRIMARY KEY (method_id),
+ UNIQUE (method_name)
+);
+
+
+
+CREATE TABLE IF NOT EXISTS public."Source"
+(
+ dish_id integer,
+ picture serial NOT NULL,
+ PRIMARY KEY (dish_id)
+);
+
+
+CREATE TABLE IF NOT EXISTS public."Tech"
+(
+ tech_id serial,
+ tech_name character varying(20) NOT NULL,
+ PRIMARY KEY (tech_id),
+ CONSTRAINT "Name Tech" UNIQUE (tech_name)
+);
+
+
+
+CREATE TABLE IF NOT EXISTS public."Tech_Dish"
+(
+ "Tech_tech_id" integer,
+ "Dish_dish_id" integer,
+ PRIMARY KEY ("Tech_tech_id", "Dish_dish_id")
+);
+
+
+
+CREATE TABLE IF NOT EXISTS public."Alternative Name"
+(
+ ingr_id integer,
+ alt_name character varying(20) NOT NULL,
+ PRIMARY KEY (ingr_id),
+ CONSTRAINT "Alt Name" UNIQUE (alt_name)
+);
+
+ALTER TABLE IF EXISTS public."Cathegory"
+ ADD FOREIGN KEY (root_id)
+ REFERENCES public."Cathegory" (cath_id) MATCH SIMPLE
+ ON UPDATE NO ACTION
+ ON DELETE NO ACTION
+ NOT VALID;
+
+
+ALTER TABLE IF EXISTS public."Dish"
+ ADD FOREIGN KEY (cath_id)
+ REFERENCES public."Cathegory" (cath_id) MATCH SIMPLE
+ ON UPDATE NO ACTION
+ ON DELETE NO ACTION
+ NOT VALID;
+
+
+ALTER TABLE IF EXISTS public."Link"
+ ADD FOREIGN KEY (ingr_id)
+ REFERENCES public."Ingredients" (ingr_id) MATCH SIMPLE
+ ON UPDATE NO ACTION
+ ON DELETE NO ACTION
+ NOT VALID;
+
+
+ALTER TABLE IF EXISTS public."Link"
+ ADD FOREIGN KEY (dish_id)
+ REFERENCES public."Dish" (dish_id) MATCH SIMPLE
+ ON UPDATE NO ACTION
+ ON DELETE NO ACTION
+ NOT VALID;
+
+
+ALTER TABLE IF EXISTS public."Conversion"
+ ADD FOREIGN KEY (method1_id)
+ REFERENCES public."Methods" (method_id) MATCH SIMPLE
+ ON UPDATE NO ACTION
+ ON DELETE NO ACTION
+ NOT VALID;
+
+
+ALTER TABLE IF EXISTS public."Conversion"
+ ADD FOREIGN KEY (ingr_id)
+ REFERENCES public."Ingredients" (ingr_id) MATCH SIMPLE
+ ON UPDATE NO ACTION
+ ON DELETE NO ACTION
+ NOT VALID;
+
+
+ALTER TABLE IF EXISTS public."Conversion"
+ ADD FOREIGN KEY (method2_id)
+ REFERENCES public."Methods" (method_id) MATCH SIMPLE
+ ON UPDATE NO ACTION
+ ON DELETE NO ACTION
+ NOT VALID;
+
+
+ALTER TABLE IF EXISTS public."Source"
+ ADD FOREIGN KEY (dish_id)
+ REFERENCES public."Dish" (dish_id) MATCH SIMPLE
+ ON UPDATE NO ACTION
+ ON DELETE NO ACTION
+ NOT VALID;
+
+
+ALTER TABLE IF EXISTS public."Tech_Dish"
+ ADD FOREIGN KEY ("Tech_tech_id")
+ REFERENCES public."Tech" (tech_id) MATCH SIMPLE
+ ON UPDATE NO ACTION
+ ON DELETE NO ACTION
+ NOT VALID;
+
+
+ALTER TABLE IF EXISTS public."Tech_Dish"
+ ADD FOREIGN KEY ("Dish_dish_id")
+ REFERENCES public."Dish" (dish_id) MATCH SIMPLE
+ ON UPDATE NO ACTION
+ ON DELETE NO ACTION
+ NOT VALID;
+
+
+ALTER TABLE IF EXISTS public."Alternative Name"
+ ADD FOREIGN KEY (ingr_id)
+ REFERENCES public."Ingredients" (ingr_id) MATCH SIMPLE
+ ON UPDATE NO ACTION
+ ON DELETE NO ACTION
+ NOT VALID;
+
+END;
diff --git a/first.drawio b/first.drawio
new file mode 100644
index 0000000..2b25c2b
--- /dev/null
+++ b/first.drawio
@@ -0,0 +1,331 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pokemons.drawio b/pokemons.drawio
new file mode 100644
index 0000000..daf6294
--- /dev/null
+++ b/pokemons.drawio
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+