Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб. 5 СУБД

.docx
Скачиваний:
0
Добавлен:
29.05.2025
Размер:
1.04 Mб
Скачать

Лабораторная работа 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');

Контрольные вопросы

  1. Какие ключевые слова возможно использовать внутри оператора INSERT?

  1. Каким образом возможно обновить сразу несколько значений?

Использование 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;

  1. Возможно ли использовать операции объединения в операторе 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 = 'Математика';

  1. Возможно ли изменять порядок атрибутов при вводе данных в таблицу?

INSERT INTO students (student_id, surname, name)

VALUES (1, 'Иванов', 'Иван');

INSERT INTO students (surname, name, student_id)

VALUES ('Иванов', 'Иван', 1);

INSERT INTO students

VALUES (1, 'Иванов', 'Иван');

  1. В чем отличие между операторами DELETE и TRUNCATE?

Соседние файлы в предмете Системы управления базами данных