From 4623603411e7dc0a20ee893383e503019dae7525 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Thu, 15 Feb 2024 15:29:30 +0300 Subject: [PATCH] reboot rep --- {Lab#7 => 3 sem/Lab#7}/lab7.sql | 174 +++++++----- {Lab#7 => 3 sem/Lab#7}/lab7_aa.sql | 0 {Lab => 3 sem/Lab}/Lab#1/lab1.sql | 0 {Lab => 3 sem/Lab}/Lab#2/BDLab2Corrected.pdf | Bin {Lab => 3 sem/Lab}/Lab#2/inserts.sql | 0 {Lab => 3 sem/Lab}/Lab#2/var1.sql | 0 {Lab => 3 sem/Lab}/Lab#2/var2.sql | 0 .../Lab}/Lab#3/BDLab3Corrected(2)(1).pdf | Bin {Lab => 3 sem/Lab}/Lab#3/lab3.sql | 0 .../Lab}/Lab#4/BDLab4Corrected(1).pdf | Bin {Lab => 3 sem/Lab}/Lab#4/lab4.sql | 0 {Lab => 3 sem/Lab}/Lab#5/lab5.sql | 0 3 sem/Lab/Lab#6/bd6_inserts.sql | 47 ++++ {Lab => 3 sem/Lab}/Lab#6/insert.sql | 30 +-- {Lab => 3 sem/Lab}/Lab#6/lab6.sql | 0 {Lab => 3 sem/Lab}/Lab#6/lab6_done.sql | 249 ++++++++++++++++-- {Lab => 3 sem/Lab}/Lab#6/test3.sql | 0 {Practice => 3 sem/Practice}/27_11.sql | 0 {Practice => 3 sem/Practice}/SR/sr2.sql | 0 {Practice => 3 sem/Practice}/SR/var1.sql | 0 {Practice => 3 sem/Practice}/prac1.sql | 0 {Practice => 3 sem/Practice}/prac2.sql | 0 inserts.sql => 3 sem/inserts.sql | 0 task 1.sql | 72 +++++ task3.sql | 32 +++ 25 files changed, 505 insertions(+), 99 deletions(-) rename {Lab#7 => 3 sem/Lab#7}/lab7.sql (50%) rename {Lab#7 => 3 sem/Lab#7}/lab7_aa.sql (100%) rename {Lab => 3 sem/Lab}/Lab#1/lab1.sql (100%) rename {Lab => 3 sem/Lab}/Lab#2/BDLab2Corrected.pdf (100%) rename {Lab => 3 sem/Lab}/Lab#2/inserts.sql (100%) rename {Lab => 3 sem/Lab}/Lab#2/var1.sql (100%) rename {Lab => 3 sem/Lab}/Lab#2/var2.sql (100%) rename {Lab => 3 sem/Lab}/Lab#3/BDLab3Corrected(2)(1).pdf (100%) rename {Lab => 3 sem/Lab}/Lab#3/lab3.sql (100%) rename {Lab => 3 sem/Lab}/Lab#4/BDLab4Corrected(1).pdf (100%) rename {Lab => 3 sem/Lab}/Lab#4/lab4.sql (100%) rename {Lab => 3 sem/Lab}/Lab#5/lab5.sql (100%) create mode 100644 3 sem/Lab/Lab#6/bd6_inserts.sql rename {Lab => 3 sem/Lab}/Lab#6/insert.sql (80%) rename {Lab => 3 sem/Lab}/Lab#6/lab6.sql (100%) rename {Lab => 3 sem/Lab}/Lab#6/lab6_done.sql (56%) rename {Lab => 3 sem/Lab}/Lab#6/test3.sql (100%) rename {Practice => 3 sem/Practice}/27_11.sql (100%) rename {Practice => 3 sem/Practice}/SR/sr2.sql (100%) rename {Practice => 3 sem/Practice}/SR/var1.sql (100%) rename {Practice => 3 sem/Practice}/prac1.sql (100%) rename {Practice => 3 sem/Practice}/prac2.sql (100%) rename inserts.sql => 3 sem/inserts.sql (100%) create mode 100644 task 1.sql create mode 100644 task3.sql diff --git a/Lab#7/lab7.sql b/3 sem/Lab#7/lab7.sql similarity index 50% rename from Lab#7/lab7.sql rename to 3 sem/Lab#7/lab7.sql index 238f434..c16ec45 100644 --- a/Lab#7/lab7.sql +++ b/3 sem/Lab#7/lab7.sql @@ -13,37 +13,37 @@ -- действительное число. Заполните таблицы 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 ( + 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) - ); +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 (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); - 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; @@ -56,49 +56,47 @@ SELECT * FROM people_log; -- операций с отрицательной суммой и данные об общем числе операций -- и среднем значении суммы. -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; - const CONSTANT INTEGER = 3; - -BEGIN - FOR pos_sum IN ( +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 AND sum > 0 - ORDER BY sum DESC - LIMIT const + WHERE operation_date BETWEEN start_date AND end_date + ORDER BY sum ) LOOP - RAISE INFO 'Positive: %, Sum: %', pos_sum.operation_date, pos_sum.sum; + 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; - 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 const - ) LOOP - RAISE INFO 'Negative: %, Sum: %', 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; - + 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; -END $$ LANGUAGE plpgsql; - -CALL statement_of_acount('2023-01-01', '2023-12-31'); -- Задание 3 @@ -115,14 +113,62 @@ CALL statement_of_acount('2023-01-01', '2023-12-31'); 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; \ No newline at end of file +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/Lab#7/lab7_aa.sql b/3 sem/Lab#7/lab7_aa.sql similarity index 100% rename from Lab#7/lab7_aa.sql rename to 3 sem/Lab#7/lab7_aa.sql 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 100% rename from Lab/Lab#5/lab5.sql rename to 3 sem/Lab/Lab#5/lab5.sql 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/Lab/Lab#6/insert.sql b/3 sem/Lab/Lab#6/insert.sql similarity index 80% rename from Lab/Lab#6/insert.sql rename to 3 sem/Lab/Lab#6/insert.sql index a41dcfd..350d918 100644 --- a/Lab/Lab#6/insert.sql +++ b/3 sem/Lab/Lab#6/insert.sql @@ -1,13 +1,13 @@ 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_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, @@ -21,13 +21,13 @@ CREATE TABLE 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_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 diff --git a/Lab/Lab#6/lab6.sql b/3 sem/Lab/Lab#6/lab6.sql similarity index 100% rename from Lab/Lab#6/lab6.sql rename to 3 sem/Lab/Lab#6/lab6.sql diff --git a/Lab/Lab#6/lab6_done.sql b/3 sem/Lab/Lab#6/lab6_done.sql similarity index 56% rename from Lab/Lab#6/lab6_done.sql rename to 3 sem/Lab/Lab#6/lab6_done.sql index d3bb14e..a31f9c1 100644 --- a/Lab/Lab#6/lab6_done.sql +++ b/3 sem/Lab/Lab#6/lab6_done.sql @@ -189,6 +189,33 @@ 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 @@ -200,42 +227,224 @@ SELECT * FROM dep_staff_counts; -CREATE OR REPLACE PROCEDURE department_names(integer) AS $$ +-- 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; + i integer; + l integer; BEGIN FOR d_attrs IN ( SELECT id,last_name, first_name, manager_id - FROM bd6_employees order by 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); + 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 LOOP; END $$ LANGUAGE plpgsql; - -CREATE OR REPLACE PROCEDURE department_names2(integer) AS $$ -DECLARE d_attrs RECORD; -BEGIN +CREATE OR REPLACE PROCEDURE dep(integer) AS $$ +DECLARE + d_attrs RECORD; + BEGIN FOR d_attrs IN ( - SELECT id,last_name, first_name, manager_id + SELECT + id, + last_name, + first_name, + manager_id FROM bd6_employees - order by manager_id + ORDER BY manager_id ) -LOOP - if d_attrs.id=$1 then + 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 IF; END LOOP; -CALL department_names($1); +CALL depa($1); END $$ LANGUAGE plpgsql; -CALL department_names2(4); \ No newline at end of file +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/Lab/Lab#6/test3.sql b/3 sem/Lab/Lab#6/test3.sql similarity index 100% rename from Lab/Lab#6/test3.sql rename to 3 sem/Lab/Lab#6/test3.sql diff --git a/Practice/27_11.sql b/3 sem/Practice/27_11.sql similarity index 100% rename from Practice/27_11.sql rename to 3 sem/Practice/27_11.sql 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/inserts.sql b/3 sem/inserts.sql similarity index 100% rename from inserts.sql rename to 3 sem/inserts.sql diff --git a/task 1.sql b/task 1.sql new file mode 100644 index 0000000..a1a388e --- /dev/null +++ b/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/task3.sql b/task3.sql new file mode 100644 index 0000000..5e057e4 --- /dev/null +++ b/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 $$;