From d177467c09b2114f70687032da7edbe917c6e833 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Mon, 27 Nov 2023 12:51:56 +0300 Subject: [PATCH 01/11] new --- Lab/Lab#5/lab5.sql | 34 +++++++---- Lab/Lab#6/lab6.sql | 148 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 170 insertions(+), 12 deletions(-) create mode 100644 Lab/Lab#6/lab6.sql diff --git a/Lab/Lab#5/lab5.sql b/Lab/Lab#5/lab5.sql index 5bf2073..5677732 100644 --- a/Lab/Lab#5/lab5.sql +++ b/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,19 +18,29 @@ 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 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 db_employees e -JOIN tmp t ON t.chr = ANY(string_to_array(LOWER(e.last_name), NULL)) -GROUP BY e.last_name; \ No newline at end of file +WITH tmp AS + ( + SELECT + last_name, + (REGEXP_MATCHES(LOWER(last_name), '[a-z]', 'g'))[1] AS l, + COUNT(*)*(ASCII((REGEXP_MATCHES(LOWER(last_name), '[a-z]', 'g'))[1]) - 96) AS cnt_l + FROM bd_employees + GROUP BY last_name, l + ) +SELECT last_name, sum(cnt_l) FROM tmp GROUP BY last_name; diff --git a/Lab/Lab#6/lab6.sql b/Lab/Lab#6/lab6.sql new file mode 100644 index 0000000..bd53776 --- /dev/null +++ b/Lab/Lab#6/lab6.sql @@ -0,0 +1,148 @@ +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; + +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(); + +DECLARE + prev_employee NUMBER := 0; + mod_salary NUMBER; +BEGIN + FOR tmp IN ( + SELECT first_name, last_name, salary, + ROW_NUMBER() OVER (ORDER BY salary) AS salary_rank + FROM employees + ) + LOOP + IF emp.salary_rank = 1 THEN + modified_salary := FLOOR(emp.salary / 100) * 100; -- округляем до сотен в меньшую сторону + ELSE + modified_salary := FLOOR((emp.salary + previous_remainder) / 100) * 100; + previous_remainder := (emp.salary + previous_remainder) - modified_salary; + END IF; + + DBMS_OUTPUT.PUT_LINE('Фамилия: ' || emp.last_name || ', Имя: ' || emp.first_name || ', Модифицированная заработная плата: ' || modified_salary); + END LOOP; +END; + + +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(); + +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; + +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(); + +CREATE OR REPLACE PROCEDURE modified_salary() AS $$ +DECLARE + prev_employee numeric := 0; + mod_salary numeric := ( + SELECT FLOOR(min(salary_in_euro) / 100) * 100 + FROM bd6_employees + ); + d_attrs RECORD; +BEGIN + FOR d_attrs IN WITH tmp AS ( + SELECT first_name, last_name, salary_in_euro + FROM bd6_employees + ORDER BY salary_in_euro ASC + ) + SELECT * FROM tmp + RAISE INFO ' % % % ', + d_attrs.last_name, + d_attrs.first_name, + mod_salary; + LOOP + mod_salary := FLOOR((d_attrs.salary_in_euro + prev_employee) / 100) * 100; + prev_employee := (d_attrs.salary_in_euro + prev_employee) - mod_salary; + RAISE INFO ' % % % ', + d_attrs.last_name, + d_attrs.first_name, + mod_salary; + END LOOP; +END $$ LANGUAGE plpgsql; +CALL modified_salary(); From 48c98e32c8cb5a5a2e1fa8d7dfecaa0073daca77 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Mon, 27 Nov 2023 13:54:19 +0300 Subject: [PATCH 02/11] added 6done --- Lab/Lab#6/lab6.sql | 148 ---------------------------------------- Lab/Lab#6/lab6_done.sql | 132 +++++++++++++++++++++++++++++++++++ Lab/Lab#6/test3.sql | 26 +++++++ 3 files changed, 158 insertions(+), 148 deletions(-) create mode 100644 Lab/Lab#6/lab6_done.sql create mode 100644 Lab/Lab#6/test3.sql diff --git a/Lab/Lab#6/lab6.sql b/Lab/Lab#6/lab6.sql index bd53776..e69de29 100644 --- a/Lab/Lab#6/lab6.sql +++ b/Lab/Lab#6/lab6.sql @@ -1,148 +0,0 @@ -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; - -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(); - -DECLARE - prev_employee NUMBER := 0; - mod_salary NUMBER; -BEGIN - FOR tmp IN ( - SELECT first_name, last_name, salary, - ROW_NUMBER() OVER (ORDER BY salary) AS salary_rank - FROM employees - ) - LOOP - IF emp.salary_rank = 1 THEN - modified_salary := FLOOR(emp.salary / 100) * 100; -- округляем до сотен в меньшую сторону - ELSE - modified_salary := FLOOR((emp.salary + previous_remainder) / 100) * 100; - previous_remainder := (emp.salary + previous_remainder) - modified_salary; - END IF; - - DBMS_OUTPUT.PUT_LINE('Фамилия: ' || emp.last_name || ', Имя: ' || emp.first_name || ', Модифицированная заработная плата: ' || modified_salary); - END LOOP; -END; - - -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(); - -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; - -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(); - -CREATE OR REPLACE PROCEDURE modified_salary() AS $$ -DECLARE - prev_employee numeric := 0; - mod_salary numeric := ( - SELECT FLOOR(min(salary_in_euro) / 100) * 100 - FROM bd6_employees - ); - d_attrs RECORD; -BEGIN - FOR d_attrs IN WITH tmp AS ( - SELECT first_name, last_name, salary_in_euro - FROM bd6_employees - ORDER BY salary_in_euro ASC - ) - SELECT * FROM tmp - RAISE INFO ' % % % ', - d_attrs.last_name, - d_attrs.first_name, - mod_salary; - LOOP - mod_salary := FLOOR((d_attrs.salary_in_euro + prev_employee) / 100) * 100; - prev_employee := (d_attrs.salary_in_euro + prev_employee) - mod_salary; - RAISE INFO ' % % % ', - d_attrs.last_name, - d_attrs.first_name, - mod_salary; - END LOOP; -END $$ LANGUAGE plpgsql; -CALL modified_salary(); diff --git a/Lab/Lab#6/lab6_done.sql b/Lab/Lab#6/lab6_done.sql new file mode 100644 index 0000000..bbce025 --- /dev/null +++ b/Lab/Lab#6/lab6_done.sql @@ -0,0 +1,132 @@ +/* Вариант 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 PROCEDURE 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-я с конца заработная плата должна добавиться +к человеку со второй по размеру заработной платой и т.д. */ + +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(); + +-- 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+i5 AS f1, 2+i5 AS f2, 3+i5 AS f3, 4+i5 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(); \ No newline at end of file diff --git a/Lab/Lab#6/test3.sql b/Lab/Lab#6/test3.sql new file mode 100644 index 0000000..35ed016 --- /dev/null +++ b/Lab/Lab#6/test3.sql @@ -0,0 +1,26 @@ +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(); \ No newline at end of file From c5039ec7e7260664de0aeec9fb0e825bf1cefca2 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Mon, 27 Nov 2023 14:02:17 +0300 Subject: [PATCH 03/11] added insert for 6 --- Lab/Lab#6/insert.sql | 163 ++++++++++++++++++++++++++++++++++++++++ Lab/Lab#6/lab6_done.sql | 10 +-- 2 files changed, 168 insertions(+), 5 deletions(-) create mode 100644 Lab/Lab#6/insert.sql diff --git a/Lab/Lab#6/insert.sql b/Lab/Lab#6/insert.sql new file mode 100644 index 0000000..a1cc812 --- /dev/null +++ b/Lab/Lab#6/insert.sql @@ -0,0 +1,163 @@ +DROP TABLE bd6_employees IF EXISTS; + +-- 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/Lab/Lab#6/lab6_done.sql b/Lab/Lab#6/lab6_done.sql index bbce025..af2a394 100644 --- a/Lab/Lab#6/lab6_done.sql +++ b/Lab/Lab#6/lab6_done.sql @@ -9,7 +9,7 @@ b) Напишите программу на языке PL/SQL, печатающ и имя сотрудника с идентификатором 1 и всех его подчинённых, как прямых, так и подчинённых более низкого ранга. */ -CREATE OR REPLACE PROCEDURE department_names() AS +CREATE OR REPLACE PROCEDURE department_names() AS $$ DECLARE d_attrs RECORD; BEGIN @@ -25,7 +25,7 @@ SELECT * FROM tmp LOOP RAISE INFO ' % % ', d_attrs.first_name, d_attrs.last_name; END LOOP; -END LANGUAGE plpgsql; +END $$ LANGUAGE plpgsql; CALL department_names(); @@ -39,7 +39,7 @@ employees в порядке возрастания заработной плат увеличивается на остаток от округления, полученный от предыдущего сотрудника, а затем округляется до сотен в меньшую сторону. */ -CREATE OR REPLACE PROCEDURE print_employees() RETURNS VOID AS $$ +CREATE OR REPLACE PROCEDURE print_employees() AS $$ DECLARE current_salary INTEGER; m_salary INTEGER; @@ -64,7 +64,7 @@ mod_salary := current_salary - m_salary; END LOOP; END $$ LANGUAGE plpgsql; -SELECT print_employees(); +CALL print_employees(); -- Task 3 -- /* Напишите программу на языке PL/SQL, удаляющую 10 сотрудников с @@ -116,7 +116,7 @@ DECLARE d_attrs RECORD; BEGIN FOR d_attrs IN WITH RECURSIVE tmp AS ( - SELECT 1+i5 AS f1, 2+i5 AS f2, 3+i5 AS f3, 4+i5 AS f4,5+i*5 AS f5 + 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 From d6d403f3d5a5eb2ae188d1471fa4929a2fb13014 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Mon, 27 Nov 2023 23:50:07 +0300 Subject: [PATCH 04/11] 6lab_DONE! --- Lab/Lab#6/insert.sql | 2 +- Lab/Lab#6/lab6.sql | 49 +++++++++++++++++++ Lab/Lab#6/lab6_done.sql | 57 +++++++++++++--------- Lab/Lab#6/test3.sql | 56 +++++++++++++--------- Practice/27_11.sql | 104 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 221 insertions(+), 47 deletions(-) create mode 100644 Practice/27_11.sql diff --git a/Lab/Lab#6/insert.sql b/Lab/Lab#6/insert.sql index a1cc812..a41dcfd 100644 --- a/Lab/Lab#6/insert.sql +++ b/Lab/Lab#6/insert.sql @@ -1,4 +1,4 @@ -DROP TABLE bd6_employees IF EXISTS; +DROP TABLE IF EXISTS bd6_employees; -- CREATE TABLE bd6_departments( -- id integer PRIMARY KEY, diff --git a/Lab/Lab#6/lab6.sql b/Lab/Lab#6/lab6.sql index e69de29..06a1c72 100644 --- a/Lab/Lab#6/lab6.sql +++ b/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/Lab/Lab#6/lab6_done.sql b/Lab/Lab#6/lab6_done.sql index af2a394..b79b71a 100644 --- a/Lab/Lab#6/lab6_done.sql +++ b/Lab/Lab#6/lab6_done.sql @@ -50,6 +50,7 @@ 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; @@ -74,32 +75,42 @@ CALL print_employees(); большой заработной платой. 2-я с конца заработная плата должна добавиться к человеку со второй по размеру заработной платой и т.д. */ -CREATE OR REPLACE PROCEDURE update_salary() AS $$ +CREATE OR REPLACE FUNCTION rearrange_salaries() RETURNS VOID 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; + salaries RECORD; + small NUMERIC[]; + larg NUMERIC[]; + const CONSTANT INTEGER = 10; 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 + 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; - 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(); + 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 – целые числа. diff --git a/Lab/Lab#6/test3.sql b/Lab/Lab#6/test3.sql index 35ed016..40cf955 100644 --- a/Lab/Lab#6/test3.sql +++ b/Lab/Lab#6/test3.sql @@ -1,26 +1,36 @@ -CREATE OR REPLACE PROCEDURE update_salary() AS $$ +CREATE OR REPLACE FUNCTION rearrange_salaries() RETURNS VOID 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; + salaries RECORD; + small NUMERIC[]; + larg NUMERIC[]; + const CONSTANT INTEGER = 10; 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 + 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; - 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(); \ No newline at end of file + 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(); \ No newline at end of file diff --git a/Practice/27_11.sql b/Practice/27_11.sql new file mode 100644 index 0000000..6634436 --- /dev/null +++ b/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'); + From 6dc308a601eb5fc20397ef414bfb8ba6addca1f0 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Mon, 4 Dec 2023 11:12:10 +0300 Subject: [PATCH 05/11] added 2 and 1b point --- Lab/Lab#6/lab6_done.sql | 149 +++++++++++++++++++++++++++++++++++----- Lab/Lab#6/test3.sql | 38 +++++++++- 2 files changed, 169 insertions(+), 18 deletions(-) diff --git a/Lab/Lab#6/lab6_done.sql b/Lab/Lab#6/lab6_done.sql index b79b71a..e4827dd 100644 --- a/Lab/Lab#6/lab6_done.sql +++ b/Lab/Lab#6/lab6_done.sql @@ -9,24 +9,82 @@ b) Напишите программу на языке PL/SQL, печатающ и имя сотрудника с идентификатором 1 и всех его подчинённых, как прямых, так и подчинённых более низкого ранга. */ -CREATE OR REPLACE PROCEDURE department_names() AS $$ -DECLARE d_attrs RECORD; +-- 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(); + +-- Пункт а) +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 + +-- Пункт б) +CREATE OR REPLACE PROCEDURE department_names(integer) AS $$ +DECLARE + d_attrs RECORD; + i integer; + l integer; 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; +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; -CALL department_names(); + + +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); -- Task 2 -- @@ -60,6 +118,32 @@ LOOP 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; +END LOOP; +END $$ LANGUAGE plpgsql; + +CALL print_employees(); +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; + + 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; @@ -140,4 +224,35 @@ then RAISE INFO ' % % % % %', d_attrs.f5, d_attrs.f4, d_attrs.f3, d_attrs.f2, d_ end case; END LOOP; END $$ LANGUAGE plpgsql; -call f(); \ No newline at end of file +call f(); + +-- Task 7 from lab4 -- + + + + + + +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; +BEGINFOR 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); \ No newline at end of file diff --git a/Lab/Lab#6/test3.sql b/Lab/Lab#6/test3.sql index 40cf955..78bdae3 100644 --- a/Lab/Lab#6/test3.sql +++ b/Lab/Lab#6/test3.sql @@ -33,4 +33,40 @@ BEGIN END LOOP; END; $$ LANGUAGE plpgsql; -SELECT rearrange_salaries(); \ No newline at end of file +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 From 3125047b7a21ba05cc6825f77cc019bfd93614f9 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Mon, 4 Dec 2023 12:40:42 +0300 Subject: [PATCH 06/11] s --- Lab/Lab#6/lab6_done.sql | 25 ++-- inserts.sql | 307 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 324 insertions(+), 8 deletions(-) create mode 100644 inserts.sql diff --git a/Lab/Lab#6/lab6_done.sql b/Lab/Lab#6/lab6_done.sql index e4827dd..bf74e70 100644 --- a/Lab/Lab#6/lab6_done.sql +++ b/Lab/Lab#6/lab6_done.sql @@ -30,14 +30,17 @@ b) Напишите программу на языке PL/SQL, печатающ -- Пункт а) 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 + 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 id, first_name, last_name +FROM tmp +GROUP BY id, first_name, last_name; -- Пункт б) CREATE OR REPLACE PROCEDURE department_names(integer) AS $$ @@ -228,6 +231,12 @@ call f(); -- Task 7 from lab4 -- +CREATE VIEW dep_staff_counts AS +SELECT department, COUNT(*) AS ecount +FROM staff +GROUP BY department; + +SELECT * FROM dep_staff_counts; diff --git a/inserts.sql b/inserts.sql new file mode 100644 index 0000000..d86a8a9 --- /dev/null +++ b/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); From 2360cb388fd2e797be9b399706a7920b8747285f Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Fri, 15 Dec 2023 22:05:50 +0300 Subject: [PATCH 07/11] done 7lab --- Lab#7/lab7.sql | 128 ++++++++++++++++++++++++++++++++++++ Lab#7/lab7_aa.sql | 99 ++++++++++++++++++++++++++++ Lab/Lab#6/lab6.sql | 2 +- Lab/Lab#6/lab6_done.sql | 140 ++++++++++++++++------------------------ 4 files changed, 285 insertions(+), 84 deletions(-) create mode 100644 Lab#7/lab7.sql create mode 100644 Lab#7/lab7_aa.sql diff --git a/Lab#7/lab7.sql b/Lab#7/lab7.sql new file mode 100644 index 0000000..238f434 --- /dev/null +++ b/Lab#7/lab7.sql @@ -0,0 +1,128 @@ +-- Лабораторная работа №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 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 ( + 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 + ) LOOP + RAISE INFO 'Positive: %, Sum: %', 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 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; + + RAISE INFO 'Total number of operations: %', total_count; + RAISE INFO 'Average amount of transactions: %', avg_amount; + +END $$ LANGUAGE plpgsql; + +CALL statement_of_acount('2023-01-01', '2023-12-31'); + + +-- Задание 3 +-- • Напишите процедуру или функцию account_operation, которая на +-- основе двух параметров: идентификатора человека и суммы вносит +-- изменения в таблицы people и people_log. В таблице people у человека с +-- указанным в качестве параметра идентификатором состояние счёта +-- должно измениться на указанную в качестве параметра сумму. В +-- таблицу people_log должна быть добавлена запись с указанным в +-- качестве параметра идентификатором человека, текущей датой и +-- временем и указанной в качестве параметра суммой. + + + +CREATE OR REPLACE PROCEDURE account_operation(new_id integer, add_sum numeric) AS $$ +DECLARE +BEGIN + 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); +END $$ LANGUAGE plpgsql; + +CALL account_operation(5, 1000000); + +SELECT * FROM people; +SELECT * FROM people_log; \ No newline at end of file diff --git a/Lab#7/lab7_aa.sql b/Lab#7/lab7_aa.sql new file mode 100644 index 0000000..56fe44c --- /dev/null +++ b/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#6/lab6.sql b/Lab/Lab#6/lab6.sql index 06a1c72..86a98ee 100644 --- a/Lab/Lab#6/lab6.sql +++ b/Lab/Lab#6/lab6.sql @@ -33,7 +33,7 @@ BEGIN ORDER BY salary_in_euro LIMIT 10 ), highest_salary AS ( - SELECT max(salary_in_euro) AS max_salary + SELECT max(salary_in_euro) AS max_salary FROM bd6_employees ) UPDATE bd6_employees e diff --git a/Lab/Lab#6/lab6_done.sql b/Lab/Lab#6/lab6_done.sql index bf74e70..d3bb14e 100644 --- a/Lab/Lab#6/lab6_done.sql +++ b/Lab/Lab#6/lab6_done.sql @@ -9,41 +9,23 @@ 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(); - -- Пункт а) 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 + + 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 + JOIN tmp t ON e.manager_id = t.id ) -SELECT id, first_name, last_name +SELECT * FROM tmp -GROUP BY id, first_name, last_name; +; -- Пункт б) -CREATE OR REPLACE PROCEDURE department_names(integer) AS $$ +CREATE OR REPLACE PROCEDURE depa(integer) AS $$ DECLARE d_attrs RECORD; i integer; @@ -59,13 +41,12 @@ FOR d_attrs IN 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); + CALL depa(l); END IF; END LOOP; END $$ LANGUAGE plpgsql; - -CREATE OR REPLACE PROCEDURE department_names2(integer) AS $$ +CREATE OR REPLACE PROCEDURE dep(integer) AS $$ DECLARE d_attrs RECORD; BEGIN @@ -85,10 +66,9 @@ DECLARE 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); +CALL depa($1); END $$ LANGUAGE plpgsql; -CALL department_names2(4); - +CALL dep(1); -- Task 2 -- /* Напишите программу на языке PL/SQL, выбирающую строки из таблицы @@ -100,6 +80,8 @@ employees в порядке возрастания заработной плат увеличивается на остаток от округления, полученный от предыдущего сотрудника, а затем округляется до сотен в меньшую сторону. */ +UPDATE bd6_employees SET salary_in_euro = 299 WHERE id = 3; + CREATE OR REPLACE PROCEDURE print_employees() AS $$ DECLARE current_salary INTEGER; @@ -107,52 +89,28 @@ m_salary INTEGER; mod_salary INTEGER := 0; employee_rec RECORD; BEGIN -FOR employee_rec IN ( +FOR employee_rec IN + ( SELECT last_name, first_name, salary_in_euro FROM bd6_employees - ORDER BY salary_in_euro) + 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; + 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(); -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) +SELECT * +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; - -CALL print_employees(); -- Task 3 -- /* Напишите программу на языке PL/SQL, удаляющую 10 сотрудников с @@ -167,7 +125,7 @@ DECLARE salaries RECORD; small NUMERIC[]; larg NUMERIC[]; - const CONSTANT INTEGER = 10; + const CONSTANT INTEGER = 3; BEGIN FOR salaries IN SELECT id, salary_in_euro @@ -242,26 +200,42 @@ SELECT * FROM dep_staff_counts; -CREATE OR REPLACE PROCEDURE department_names(integer) AS $$DECLARE d_attrs RECORD; -i integer;l integer; +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; +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; -BEGINFOR d_attrs IN ( - SELECT id,last_name, first_name, manager_id FROM bd6_employees order by manager_id ) +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; + 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); \ No newline at end of file From 4623603411e7dc0a20ee893383e503019dae7525 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Thu, 15 Feb 2024 15:29:30 +0300 Subject: [PATCH 08/11] 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 $$; From 6d31e87d50b1231ead61b3714056e3cbcd8725be Mon Sep 17 00:00:00 2001 From: Dmitry <124861781+ada-dmitry@users.noreply.github.com> Date: Tue, 27 Feb 2024 13:04:39 +0300 Subject: [PATCH 09/11] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20first.drawio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- first.drawio | 331 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 331 insertions(+) create mode 100644 first.drawio diff --git a/first.drawio b/first.drawio new file mode 100644 index 0000000..2b25c2b --- /dev/null +++ b/first.drawio @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 74e7072f6d07c60739406e871769798109aaefd3 Mon Sep 17 00:00:00 2001 From: Dmitry <124861781+ada-dmitry@users.noreply.github.com> Date: Tue, 12 Mar 2024 10:24:38 +0300 Subject: [PATCH 10/11] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20pokemons.drawio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pokemons.drawio | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 pokemons.drawio diff --git a/pokemons.drawio b/pokemons.drawio new file mode 100644 index 0000000..daf6294 --- /dev/null +++ b/pokemons.drawio @@ -0,0 +1,10 @@ + + + + + + + + + + From 33a666eadbe6fd16479d0b6dcf5ecd25a804545f Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Sat, 30 Mar 2024 17:33:32 +0300 Subject: [PATCH 11/11] switch device --- task 1.sql => BD_4s/task 1.sql | 0 task3.sql => BD_4s/task3.sql | 0 BD_4s/task_from_lection.sql | 25 ++++ Lab`s/insert.sql | 19 +++ Lab`s/lab`s_code.sql | 209 +++++++++++++++++++++++++++++++++ 5 files changed, 253 insertions(+) rename task 1.sql => BD_4s/task 1.sql (100%) rename task3.sql => BD_4s/task3.sql (100%) create mode 100644 BD_4s/task_from_lection.sql create mode 100644 Lab`s/insert.sql create mode 100644 Lab`s/lab`s_code.sql diff --git a/task 1.sql b/BD_4s/task 1.sql similarity index 100% rename from task 1.sql rename to BD_4s/task 1.sql diff --git a/task3.sql b/BD_4s/task3.sql similarity index 100% rename from task3.sql rename to BD_4s/task3.sql 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`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;