
Лаб. 5 СУБД
.docxЛабораторная работа 5
«Операторы модификации базы данных»
SELECT * FROM public.student
where students_group_number like 'ИВТ-4_'
ORDER BY students_group_number ASC
begin;
with students_to_reassign as (
select student_id,
row_number() over (order by student_id) as rn
from student
where students_group_number = 'ИВТ-42'
),
available_groups as (
select students_group_number,
row_number() over (order by students_group_number) as grp_num
from (
select distinct students_group_number
from student
where students_group_number like 'ИВТ-4%' and students_group_number != 'ИВТ-42'
)
),
group_count as (
select count(*) as cnt from available_groups
),
matched as (
select s.student_id, g.students_group_number as new_group
from students_to_reassign s
join group_count c on true
join available_groups g on (s.rn - 1) % c.cnt + 1 = g.grp_num
)
update student
set students_group_number = matched.new_group
from matched
where student.student_id = matched.student_id;
select student_id, surname, name, patronymic, students_group_number
from student
where students_group_number like 'ИВТ-4_'
order by students_group_number, surname;
with count_bad_mark as (
select student_id, count(*) as c
from field_comprehension
where mark = 2
group by student_id
order by student_id
),
many_bad_marks as(
select * from count_bad_mark
where c > 2
)
select si.student_id, si.status
from student_id si
join many_bad_marks mb on si.student_id = mb.student_id;
begin;
create temp table many_bad_marks as
with count_bad_mark as (
select student_id, count(*) as c
from field_comprehension
where mark = 2
group by student_id
order by student_id
)
select * from count_bad_mark
where c > 2;
update student_id
set status = 'Заблокирован'
from many_bad_marks mb
where student_id.student_id = mb.student_id;
select si.student_id, si.status
from student_id si
join many_bad_marks mb on si.student_id = mb.student_id;
INSERT INTO coach (coach_id, surname, name, patronymic, experience, salary) VALUES
(1, 'Иванов', 'Иван', 'Иванович', 5, '50000'),
(2, 'Петров', 'Петр', 'Петрович', 10, '60000'),
(3, 'Сидоров', 'Сидор', 'Сидорович', 7, '55000'),
(4, 'Кузнецов', 'Алексей', 'Александрович', 3, '45000'),
(5, 'Лебедев', 'Дмитрий', 'Дмитриевич', 12, '70000'),
(6, 'Попов', 'Сергей', 'Сергеевич', 8, '65000'),
(7, 'Новиков', 'Антон', 'Николаевич', 4, '48000'),
(8, 'Морозов', 'Владимир', 'Владимирович', 15, '75000'),
(9, 'Васильев', 'Игорь', 'Игоревич', 6, '53000'),
(10, 'Семенов', 'Максим', 'Максимович', 9, '62000');
INSERT INTO section (section_id, section_name, coach_id) VALUES
('e438fbf6-5f79-43b5-b622-d5fce1bde70f', 'Футбол', 1),
('6d1e5249-6da1-4cd9-b8f2-51f4a9a6c493', 'Баскетбол', 2),
('a5f1d9cc-cdb4-4b6c-8c2f-6f8db5005b99', 'Волейбол', 3),
('b7b5a771-9178-428d-b29f-e8452f2a8398', 'Теннис', 4),
('a32bfbf8-4a12-4315-91fa-708bb2a0f2d3', 'Шахматы', 5),
('47f290b9-98fe-4bda-96f2-f08f20451256', 'Бег', 6),
('ae9e9bc2-2211-4a3e-b539-f9f4fbd7db1d', 'Плавание', 7),
('df49347b-6877-48cf-9cbf-7d320d35c0ea', 'Тхэквондо', 8),
('4b44c53b-8f4f-43f3-a970-e63dbb23f25a', 'Бокс', 9),
('d2f7e7b2-b8ad-47c6-96b4-1101ab15a94f', 'Гимнастика', 10);
INSERT INTO student_section (student_id, section_id) VALUES
(819967, 'e438fbf6-5f79-43b5-b622-d5fce1bde70f'),
(830220, '6d1e5249-6da1-4cd9-b8f2-51f4a9a6c493'),
(837209, 'a5f1d9cc-cdb4-4b6c-8c2f-6f8db5005b99'),
(839792, 'b7b5a771-9178-428d-b29f-e8452f2a8398'),
(850203, 'a32bfbf8-4a12-4315-91fa-708bb2a0f2d3'),
(856305, '47f290b9-98fe-4bda-96f2-f08f20451256'),
(865999, 'ae9e9bc2-2211-4a3e-b539-f9f4fbd7db1d'),
(879254, 'df49347b-6877-48cf-9cbf-7d320d35c0ea'),
(888781, '4b44c53b-8f4f-43f3-a970-e63dbb23f25a'),
(898271, 'd2f7e7b2-b8ad-47c6-96b4-1101ab15a94f');
Контрольные вопросы
Какие ключевые слова возможно использовать внутри оператора INSERT?
Каким образом возможно обновить сразу несколько значений?
Использование CASE внутри UPDATE:
UPDATE student
SET status = CASE
WHEN student_id = 1 THEN 'Заблокирован'
WHEN student_id = 2 THEN 'Активен'
ELSE status
END
WHERE student_id IN (1, 2);
С помощью JOIN:
UPDATE student
SET status = other_table.status
FROM other_table
WHERE student.student_id = other_table.student_id;
Возможно ли использовать операции объединения в операторе INSERT? Если да, то приведите пример.
Пример использования INSERT с операцией UNION:
INSERT INTO students (student_id, surname, name)
SELECT 1, 'Иванов', 'Иван'
UNION
SELECT 2, 'Петров', 'Петр'
UNION
SELECT 3, 'Сидоров', 'Сидор';
Пример с операцией JOIN внутри INSERT:
INSERT INTO student_courses (student_id, course_id)
SELECT s.student_id, c.course_id
FROM students s
JOIN courses c ON c.course_name = 'Математика';
Возможно ли изменять порядок атрибутов при вводе данных в таблицу?
INSERT INTO students (student_id, surname, name)
VALUES (1, 'Иванов', 'Иван');
INSERT INTO students (surname, name, student_id)
VALUES ('Иванов', 'Иван', 1);
INSERT INTO students
VALUES (1, 'Иванов', 'Иван');
В чем отличие между операторами DELETE и TRUNCATE?