From 827b74f0b413a54722f9d65f2e56db75ab0581ef Mon Sep 17 00:00:00 2001 From: Andrew Nuark G Date: Tue, 11 May 2021 22:08:11 +0700 Subject: [PATCH] [4sem] add db course files --- 4sem/db/lab10.sql | 39 ++++++ 4sem/db/lab11.sql | 21 +++ 4sem/db/lab12.sql | 17 +++ 4sem/db/lab13.sql | 56 ++++++++ 4sem/db/lab2.sql | 136 ++++++++++++++++++++ 4sem/db/lab3.sql | 271 +++++++++++++++++++++++++++++++++++++++ 4sem/db/lab4.sql | 22 ++++ 4sem/db/lab5.sql | 29 +++++ 4sem/db/lab6.sql | 55 ++++++++ 4sem/db/lab7.sql | 34 +++++ 4sem/db/lab8-1.sql | 59 +++++++++ 4sem/db/lab8-2.sql | 36 ++++++ 4sem/db/lab9.sql | 312 +++++++++++++++++++++++++++++++++++++++++++++ 13 files changed, 1087 insertions(+) create mode 100644 4sem/db/lab10.sql create mode 100644 4sem/db/lab11.sql create mode 100644 4sem/db/lab12.sql create mode 100644 4sem/db/lab13.sql create mode 100644 4sem/db/lab2.sql create mode 100644 4sem/db/lab3.sql create mode 100644 4sem/db/lab4.sql create mode 100644 4sem/db/lab5.sql create mode 100644 4sem/db/lab6.sql create mode 100644 4sem/db/lab7.sql create mode 100644 4sem/db/lab8-1.sql create mode 100644 4sem/db/lab8-2.sql create mode 100644 4sem/db/lab9.sql diff --git a/4sem/db/lab10.sql b/4sem/db/lab10.sql new file mode 100644 index 0000000..77dd34c --- /dev/null +++ b/4sem/db/lab10.sql @@ -0,0 +1,39 @@ +BEGIN TRANSACTION + +DECLARE @firstSpecialityID INT = (SELECT TOP 1 ID + FROM [Специальность] + ORDER BY ID); + +-- Создайте группу студентов, обучающихся по специальности, на которую студентов +-- не набирали. +INSERT INTO [Группа]([Название], [КодСпециальности], [ЗачётнаяКнижкаСтаросты], [ТабельныйНомерКуратора]) +VALUES (N'КИ20-09Б', @firstSpecialityID + 1, NULL, 1); + +-- Одну из групп, которых две по одной специальности (см. требования Лаб. раб. №9), +-- перевести в созданную группу (на другую специальность). +-- КИ20-07Б -> КИ20-09Б +DECLARE @firstGroupID INT = (SELECT TOP 1 ID + FROM [Группа] + ORDER BY ID); +DECLARE @newGroupID INT = (SELECT ID + FROM [Группа] + WHERE [Название] = N'КИ20-09Б'); +UPDATE [Студент] +SET Группа = @newGroupID +FROM [Студент] +WHERE Группа = @firstGroupID; + +-- Назначьте старосту и куратора тех же людей, которые были в теперь уже пустой +-- группе. +UPDATE [Группа] +SET ЗачётнаяКнижкаСтаросты = (SELECT [ЗачётнаяКнижкаСтаросты] FROM [Группа] WHERE ID = @firstGroupID), + ТабельныйНомерКуратора = (SELECT [ТабельныйНомерКуратора] FROM [Группа] WHERE ID = @firstGroupID) +FROM [Группа] +WHERE ID = @newGroupID; + +-- Удалите пустую группу из таблицы. +DELETE +FROM Группа +WHERE ID = @firstGroupID; + +COMMIT TRANSACTION \ No newline at end of file diff --git a/4sem/db/lab11.sql b/4sem/db/lab11.sql new file mode 100644 index 0000000..b240621 --- /dev/null +++ b/4sem/db/lab11.sql @@ -0,0 +1,21 @@ +DROP FUNCTION IF EXISTS dbo.AverageMark; +DROP FUNCTION IF EXISTS dbo.CreditsList; +GO; + +CREATE FUNCTION dbo.AverageMark(@disciplineId int) RETURNS float AS BEGIN; + DECLARE @out float = (SELECT AVG(CAST(Оценка AS FLOAT)) FROM Изучение WHERE Дисциплина = @disciplineId); + RETURN IIF(@out < 2, ROUND(@out, 0), @out); +END; +GO; + +CREATE FUNCTION dbo.CreditsList(@groupId int, @semester int) RETURNS table AS RETURN ( + SELECT DISTINCT D.[Название], D.[Отчётность] FROM [Дисциплина] AS D + JOIN [Группа] as G on G.ID = @groupId + WHERE D.[Семестр] = @semester AND G.[КодСпециальности] = D.[КодСпециальности] +); +GO; + +SELECT dbo.AverageMark(4), dbo.AverageMark(12), dbo.AverageMark(2); +SELECT * FROM dbo.CreditsList(2, 2); +SELECT * FROM dbo.CreditsList(4,1); + diff --git a/4sem/db/lab12.sql b/4sem/db/lab12.sql new file mode 100644 index 0000000..68ec345 --- /dev/null +++ b/4sem/db/lab12.sql @@ -0,0 +1,17 @@ +DROP VIEW IF EXISTS dbo.ExcellentStudents; +GO; + +CREATE VIEW dbo.ExcellentStudents AS +SELECT SSQ.[Фамилия], SSQ.[Имя], SSQ.[Отчество], SSQ.[Группа], SSQ.[Семестр] +FROM (SELECT S.[Фамилия], S.[Имя], S.[Отчество], S.[Группа], D.[Семестр], AVG(L.[Оценка]) AS AVG_MARK + FROM [Изучение] AS L + JOIN [Дисциплина] AS D on L.[Дисциплина] = D.ID + JOIN [Студент] AS S on L.[Студент] = S.[НомерЗачетнойКнижки] + GROUP BY S.[Фамилия], S.[Имя], S.[Отчество], S.[Группа], D.[Семестр]) AS SSQ +WHERE SSQ.AVG_MARK = 5 + OR SSQ.AVG_MARK = 1 +GROUP BY SSQ.[Фамилия], SSQ.[Имя], SSQ.[Отчество], SSQ.[Группа], SSQ.[Семестр]; +GO; + +SELECT * +FROM dbo.ExcellentStudents; \ No newline at end of file diff --git a/4sem/db/lab13.sql b/4sem/db/lab13.sql new file mode 100644 index 0000000..4c3a194 --- /dev/null +++ b/4sem/db/lab13.sql @@ -0,0 +1,56 @@ +DROP TRIGGER IF EXISTS dbo.NoDeleteUsedDiscipline; +DROP TRIGGER IF EXISTS dbo.NoSetWrongCaptain; +DROP TRIGGER IF EXISTS dbo.NoInsertWrongExam; +GO; + +CREATE TRIGGER dbo.NoDeleteUsedDiscipline ON [Дисциплина] INSTEAD OF DELETE AS BEGIN + SET NOCOUNT ON; + + DECLARE @d_discID TABLE (DISC INT); + INSERT INTO @d_discID(DISC) SELECT ID FROM DELETED; + + IF EXISTS(SELECT * FROM [Изучение] AS L WHERE EXISTS(SELECT * FROM @d_discID WHERE DISC = L.[Дисциплина])) BEGIN + RAISERROR ('Deletion is not allowed: discipline is in use', 16, 1); + RETURN; + END; + + DELETE FROM [Дисциплина] WHERE EXISTS(SELECT * FROM @d_discID WHERE DISC = ID); +END; +GO; + +CREATE TRIGGER dbo.NoSetWrongCaptain ON [Группа] AFTER UPDATE AS BEGIN + SET NOCOUNT ON; + + DECLARE @c_groupID TABLE (GRP INT, NCPT INT); + INSERT INTO @c_groupID(GRP, NCPT) SELECT ID, INSERTED.[ЗачётнаяКнижкаСтаросты] FROM INSERTED; + + IF UPDATE([ЗачётнаяКнижкаСтаросты]) AND EXISTS(SELECT * FROM [Студент] AS S WHERE EXISTS(SELECT * FROM @c_groupID WHERE GRP = S.[Группа] AND S.[НомерЗачетнойКнижки] = NCPT)) + RETURN; + + RAISERROR ('New captain not from this group', 16, 1); +END; +GO; + +CREATE TRIGGER dbo.NoInsertWrongExam ON [Изучение] AFTER INSERT AS BEGIN + SET NOCOUNT ON; + + DECLARE @i_learnID TABLE (SID INT, DID INT); + INSERT INTO @i_learnID(SID, DID) SELECT INSERTED.Студент, INSERTED.Дисциплина FROM INSERTED; + + IF EXISTS(SELECT * FROM [Студент] AS S + JOIN [Группа] AS G on S.[Группа] = G.ID + RIGHT JOIN [Дисциплина] AS D on D.[КодСпециальности] = G.[КодСпециальности] + WHERE EXISTS(SELECT * FROM @i_learnID WHERE SID = S.[НомерЗачетнойКнижки] AND D.ID = DID)) + RETURN; + + RAISERROR ('Student is not learning that discipline', 16, 1); +END; +GO; + +BEGIN TRANSACTION + +DELETE FROM [Дисциплина] WHERE ID = 33; +UPDATE [Группа] SET [Группа].[ЗачётнаяКнижкаСтаросты] = 25 WHERE ID = 4; +INSERT INTO [Изучение]([Студент], [Дисциплина], [Дата], [Оценка]) VALUES (13, 9, '2020-09-05', 1); + +ROLLBACK TRANSACTION \ No newline at end of file diff --git a/4sem/db/lab2.sql b/4sem/db/lab2.sql new file mode 100644 index 0000000..b68e94d --- /dev/null +++ b/4sem/db/lab2.sql @@ -0,0 +1,136 @@ +drop table if exists [Сделка]; +drop table if exists [Склад]; +drop table if exists [Сотрудник]; +drop table if exists [Поставщик]; +drop table if exists [Клиент]; +drop table if exists [Товар]; +go + +CREATE TABLE [Сотрудник] +( + ID int IDENTITY (1,1), + Имя nvarchar(300) NOT NULL, + КодНачальника int NOT NULL, + CONSTRAINT [PK_СОТРУДНИК] PRIMARY KEY CLUSTERED + ( + [ID] ASC + ) WITH (IGNORE_DUP_KEY = OFF) + +) +GO +CREATE TABLE [Поставщик] +( + ID int IDENTITY (1,1), + Имя nvarchar(300) NOT NULL, + CONSTRAINT [PK_ПОСТАВЩИК] PRIMARY KEY CLUSTERED + ( + [ID] ASC + ) WITH (IGNORE_DUP_KEY = OFF) + +) +GO +CREATE TABLE [Клиент] +( + ID int IDENTITY (1,1), + Имя nvarchar(300) NOT NULL, + Телефон nvarchar(10) NOT NULL, + Адрес nvarchar(300) NOT NULL, + Пол bit NOT NULL, + CONSTRAINT [PK_КЛИЕНТ] PRIMARY KEY CLUSTERED + ( + [ID] ASC + ) WITH (IGNORE_DUP_KEY = OFF) + +) +GO +CREATE TABLE [Товар] +( + ID int IDENTITY (1,1), + Имя nvarchar(300) NOT NULL, + Количество int NOT NULL, + Описание nvarchar(300) NOT NULL, + Категория nvarchar(300) NOT NULL, + CONSTRAINT [PK_ТОВАР] PRIMARY KEY CLUSTERED + ( + [ID] ASC + ) WITH (IGNORE_DUP_KEY = OFF) + +) +GO +CREATE TABLE [Склад] +( + ID int IDENTITY (1,1), + КодПоставщика int NOT NULL, + КодТовара int NOT NULL, + Количество int NOT NULL, + Цена money NOT NULL, + Дата date NOT NULL, + CONSTRAINT [PK_СКЛАД] PRIMARY KEY CLUSTERED + ( + [ID] ASC + ) WITH (IGNORE_DUP_KEY = OFF) + +) +GO +CREATE TABLE [Сделка] +( + ID int IDENTITY (1,1), + Дата date NOT NULL, + КодСклада int NOT NULL, + КодКлиента int NOT NULL, + КодСотрудника int NOT NULL, + Количество int NOT NULL, + Скидка money NOT NULL, + CONSTRAINT [PK_СДЕЛКА] PRIMARY KEY CLUSTERED + ( + [ID] ASC + ) WITH (IGNORE_DUP_KEY = OFF) + +) +GO +ALTER TABLE [Сотрудник] + WITH CHECK ADD CONSTRAINT [Сотрудник_fk0] FOREIGN KEY ([КодНачальника]) REFERENCES [Сотрудник] ([ID]) + ON UPDATE NO ACTION +GO +ALTER TABLE [Сотрудник] + CHECK CONSTRAINT [Сотрудник_fk0] +GO + + + +ALTER TABLE [Склад] + WITH CHECK ADD CONSTRAINT [Склад_fk0] FOREIGN KEY ([КодПоставщика]) REFERENCES [Поставщик] ([ID]) + ON UPDATE CASCADE +GO +ALTER TABLE [Склад] + CHECK CONSTRAINT [Склад_fk0] +GO +ALTER TABLE [Склад] + WITH CHECK ADD CONSTRAINT [Склад_fk1] FOREIGN KEY ([КодТовара]) REFERENCES [Товар] ([ID]) + ON UPDATE CASCADE +GO +ALTER TABLE [Склад] + CHECK CONSTRAINT [Склад_fk1] +GO + +ALTER TABLE [Сделка] + WITH CHECK ADD CONSTRAINT [Сделка_fk0] FOREIGN KEY ([КодСклада]) REFERENCES [Склад] ([ID]) + ON UPDATE CASCADE +GO +ALTER TABLE [Сделка] + CHECK CONSTRAINT [Сделка_fk0] +GO +ALTER TABLE [Сделка] + WITH CHECK ADD CONSTRAINT [Сделка_fk1] FOREIGN KEY ([КодКлиента]) REFERENCES [Клиент] ([ID]) + ON UPDATE CASCADE +GO +ALTER TABLE [Сделка] + CHECK CONSTRAINT [Сделка_fk1] +GO +ALTER TABLE [Сделка] + WITH CHECK ADD CONSTRAINT [Сделка_fk2] FOREIGN KEY ([КодСотрудника]) REFERENCES [Сотрудник] ([ID]) + ON UPDATE CASCADE +GO +ALTER TABLE [Сделка] + CHECK CONSTRAINT [Сделка_fk2] +GO diff --git a/4sem/db/lab3.sql b/4sem/db/lab3.sql new file mode 100644 index 0000000..5541dc1 --- /dev/null +++ b/4sem/db/lab3.sql @@ -0,0 +1,271 @@ +BEGIN TRANSACTION + +------------------------------------------------------------------------------------------------------------------------ + +-- Очистим базу +DELETE FROM [Сделка] WHERE 1 > 0; +DELETE FROM [Клиент] WHERE 1 > 0; +DELETE FROM [Склад] WHERE 1 > 0; +DELETE FROM [Поставщик] WHERE 1 > 0; +DELETE FROM [Сотрудник] WHERE 1 > 0; +DELETE FROM [Товар] WHERE 1 > 0; + +-- Обновим ключи +DBCC CHECKIDENT ([Сделка], RESEED, 1); +DBCC CHECKIDENT ([Клиент], RESEED, 1); +DBCC CHECKIDENT ([Склад], RESEED, 1); +DBCC CHECKIDENT ([Поставщик], RESEED, 1); +DBCC CHECKIDENT ([Сотрудник], RESEED, 1); +DBCC CHECKIDENT ([Товар], RESEED, 1); +go + +------------------------------------------------------------------------------------------------------------------------ + +-- Генерируем клиентов +INSERT INTO [Клиент]([Имя], [Телефон], [Адрес], [Пол]) +VALUES (N'Агафонова Милана Фёдоровна', '3361876906', N'985019, Свердловская область, город Талдом, шоссе Бухарестская, 82', '0'), + (N'Давыдова Александра Александровна', '9114695687', N'264202, Ярославская область, город Воскресенск, шоссе Космонавтов, 60', '0'), + (N'Демина Мария Александровна', '9461046614', N'266856, Самарская область, город Шаховская, проезд Домодедовская, 00', '0'), + (N'Иванов Иван Александрович', '9968051776', N'581486, Тюменская область, город Наро-Фоминск, пр. Будапештсткая, 49', '1'), + (N'Никифоров Руслан Александрович', '8331275435', N'624218, Новгородская область, город Озёры, въезд Домодедовская, 45', '1'), + (N'Руднев Олег Владимирович', '9004552583', N'157285, Оренбургская область, город Мытищи, пл. 1905 года, 52', '1'), + (N'Самсонов Георгий Кириллович', '9817892552', N'157598, Амурская область, город Талдом, наб. Домодедовская, 71', '1'), + (N'Семенова Екатерина Марковна', '9479462287', N'303011, Астраханская область, город Воскресенск, наб. Гоголя, 43', '0'), + (N'Тимофеев Михаил Михайлович', '9514816307', N'303937, Белгородская область, город Воскресенск, наб. Ленина, 46', '1'), + (N'Фролова Елена Игоревна', '9807420852', N'364746, Иркутская область, город Кашира, пер. Чехова, 27', '0'); + +------------------------------------------------------------------------------------------------------------------------ + +-- Генерируем поставщиков +INSERT INTO [Поставщик]([Имя]) +VALUES (N'Андреева София Константиновна'), + (N'Булгаков Егор Тихонович'), + (N'Жукова Виктория Матвеевна'), + (N'Иванова София Владиславовна'), + (N'Левина Яна Александровна'), + (N'Максимов Макар Богданович'), + (N'Назаров Савелий Степанович'), + (N'Полякова Мария Михайловна'), + (N'Соколов Илья Дмитриевич'), + (N'Фомин Михаил Сергеевич'); + +------------------------------------------------------------------------------------------------------------------------ + +-- Генерируем сотрудников +-- Создадим менеджера +INSERT INTO [Сотрудник]([Имя]) VALUES (N'Баженова Д.'); +DECLARE @manager INT; +set @manager = (SELECT TOP 1 [ID] FROM [Сотрудник] WHERE [КодНачальника] IS NULL); + +-- Начальников отделов +INSERT INTO [Сотрудник]([КодНачальника], [Имя]) +VALUES (@manager, N'Демина Д.'), + (@manager, N'Иванов З.'); +DECLARE @depHead1 INT; +DECLARE @depHead2 INT; +set @depHead1 = (SELECT TOP 1 [ID] FROM [Сотрудник] WHERE [КодНачальника] IS NOT NULL); +set @depHead2 = @depHead1 + 1 + +-- И их подчинённых +INSERT INTO [Сотрудник]([КодНачальника], [Имя]) +VALUES (@depHead1, N'Иванова А.'), + (@depHead1, N'Иванова П.'), + (@depHead1, N'Марков Д.'), + (@depHead2, N'Наумов И.'), + (@depHead2, N'Попов И.'), + (@depHead2, N'Смирнов И.'); + +------------------------------------------------------------------------------------------------------------------------ + +-- Генерируем товары +INSERT INTO [Товар]([Имя], [Количество], [Категория], [Описание]) +VALUES (N'Золотая мотыга', 1, N'Инструмент', N'Лучшая на рынке мотыга, самая быстрая и прочная'), + (N'Перфоратор "Сосед"', 1, N'Иснтрумент', N'Перфорирует всё и вся'), + (N'Смектит диоктаэдрический', 10, N'Лекарство', N'Порошок для приготовления суспензии для приёма внутрь'), + (N'Ретто', 1, N'Лекарство', N'Таблетки против изжоги'), + (N'Панкреатин', 1, N'Лекарство', N'Комплекс ферментов поджелудочной железы'), + (N'Хлорпромазин', 1, N'Лекарство', N'Лекарственное средство, обладающее транквилизирующим, ' + + N'противосудорожным, снотворным, миорелаксантным и ' + + N'седативным действием'), + (N'Сосиски "Столичные"', 20, N'Продукт', N'Мясные сосиски'), + (N'Сарсапарилла', 1, N'Продукт', N'Корневое пиво, сливочный карамельно-мятный вкус'), + (N'Масло Сливочное', 1, N'Продукт', N'Сливочное масло от местного изготовителя'), + (N'Подсолнечное масло', 1, N'Продукт', N'Растительное масло, получаемое из семян масличных сортов ' + + N'подсолнечника масличного'); + +------------------------------------------------------------------------------------------------------------------------ + +-- Закинем товары на склады +DECLARE @ignoreGoodStart INT; +DECLARE @ignoreProviderStart INT; + +SET @ignoreGoodStart = (SELECT TOP 1 ID + FROM [Товар] + ORDER BY NEWID()) - 2; +SET @ignoreProviderStart = (SELECT TOP 1 ID + FROM [Поставщик] + ORDER BY NEWID()) - 2; + +INSERT INTO [Склад]([КодПоставщика], [КодТовара], [Количество], [Цена], [Дата]) +SELECT *, + ABS(CHECKSUM(NEWID())) % 10 + 1 as AMOUNT, + ROUND(ABS(CHECKSUM(NEWID())) % 5000 + 1000, -2) as PRICE, + DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 364), '2019-01-01') as DATE +FROM (SELECT [Поставщик].ID as PID, [Товар].ID as GID + FROM [Поставщик] + JOIN [Товар] ON ([Товар].ID NOT BETWEEN @ignoreGoodStart AND @ignoreGoodStart + 3) AND + ([Поставщик].ID NOT BETWEEN @ignoreProviderStart AND @ignoreProviderStart + 3)) as SQGP +ORDER BY DATE + +DECLARE @lastDay DATE; + +SET @lastDay = (SELECT TOP 1 [Дата] + FROM [Склад] + ORDER BY [Дата] DESC); + +-- Закинем ещё товаров, сдвинутых по дате, отличных по цене +INSERT INTO [Склад]([КодПоставщика], [КодТовара], [Количество], [Цена], [Дата]) +SELECT TOP 5 [КодПоставщика], + [КодТовара], + [Количество], + ROUND([Цена] + (CHECKSUM(NEWID()) % 4000), -2), + DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 30), @lastDay) as DATE +FROM Склад +ORDER BY NEWID(); + +SET @lastDay = (SELECT TOP 1 [Дата] + FROM [Склад] + ORDER BY [Дата] DESC); + +-- Закинем ещё товаров, которые отсутствуют +INSERT INTO [Склад]([КодПоставщика], [КодТовара], [Количество], [Цена], [Дата]) +SELECT TOP 5 [КодПоставщика], + [КодТовара], + 0, + [Цена], + DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 30), @lastDay) as DATE +FROM Склад +ORDER BY NEWID(); + +------------------------------------------------------------------------------------------------------------------------ + +-- Проводим сделки +DECLARE @ignoreStoreStart INT; +DECLARE @lastManagerId INT; + +SET @ignoreStoreStart = (SELECT TOP 1 ID + FROM [Склад] + ORDER BY NEWID()) - 2; +set @lastManagerId = (SELECT TOP 1 [КодНачальника] + FROM [Сотрудник] + ORDER BY [КодНачальника] DESC); + +INSERT INTO [Сделка]([Дата], [КодСклада], [КодКлиента], [КодСотрудника], [Количество], [Скидка]) +SELECT DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 20), SDATE) as DATE, + SID, + CID, + (SELECT TOP 1 [Сотрудник].ID + FROM [Сотрудник] + WHERE [Сотрудник].ID = @lastManagerId + 1 + (ABS(CHECKSUM(NEWID())) % 6) + ORDER BY NEWID()) as WID, + ABS(CHECKSUM(NEWID())) % 10 as AMOUNT, + ROUND(ABS(CHECKSUM(NEWID())) % 5000 + 1000, -2) as DISCOUNT +FROM (SELECT [Клиент].ID as CID, [Склад].ID as SID, [Склад].[Дата] as SDATE + FROM [Клиент] + JOIN [Склад] ON ([Склад].ID NOT BETWEEN @ignoreStoreStart AND @ignoreStoreStart + 10)) as SQGP +ORDER BY DATE + +------------------------------------------------------------------------------------------------------------------------ + +COMMIT TRANSACTION + +-- Сколько товаров +DECLARE @goodsCount INT; +SET @goodsCount = (SELECT count(ID) + FROM [Товар]); +SELECT @goodsCount as GOODS_COUNT; + +-- Сколько товаров нет на складе +DECLARE @goodsInStorage INT; +SET @goodsInStorage = (SELECT count(*) + FROM (SELECT DISTINCT [Склад].[КодТовара] + FROM [Склад] + JOIN [Товар] ON [Товар].ID = [Склад].[КодТовара]) as GIDONS); +SELECT @goodsCount - @goodsInStorage as GOODS_NOT_ON_STORAGE; + +-- Сколько есть поставщиков +DECLARE @providersCount INT; +SET @providersCount = (SELECT count(ID) + FROM [Поставщик]); +SELECT @providersCount as PROVIDERS_COUNT; + +-- Сколько поставщиков не поставляют товары +DECLARE @providersProvideCount INT; +SET @providersProvideCount = ( + SELECT count(*) + FROM ( + SELECT DISTINCT [Склад].[КодПоставщика] + from [Склад] + JOIN [Поставщик] ON [Поставщик].ID = [Склад].[КодПоставщика] + ) as PIDPG +) +SELECT @providersCount - @providersProvideCount as PROVIDERS_DONT_PROVIDE_COUNT; + +-- Менеджер и кол-во менеджеров +DECLARE @managerId INT; +SET @managerId = (SELECT ID FROM [Сотрудник] WHERE [КодНачальника] IS NULL); +SELECT N'Начальник', * FROM [Сотрудник] WHERE ID = @managerId; + +-- Главы отделов и кол-во подчинённых +DECLARE @depHead1_ INT; +DECLARE @depHead2_ INT; + +SET @depHead1_ = (SELECT TOP 1 ID FROM [Сотрудник] WHERE [КодНачальника] = @managerId); +SET @depHead2_ = @depHead1_ + 1; + +SELECT N'Глава отдела', * FROM [Сотрудник] WHERE [КодНачальника] = @managerId; + +-- Сотрудники отделов +SELECT N'Глава отдела', * FROM [Сотрудник] WHERE [КодНачальника] BETWEEN @depHead1_ AND @depHead2_; + +-- Кол-во записей на складе +SELECT count(ID) FROM [Склад]; + +-- Один товар поставлен разными поставщиками по разной цене. +DECLARE @randGood INT; +SET @randGood = (SELECT TOP 1 [Склад].[КодТовара] FROM [Склад] ORDER BY NEWID()); +SELECT DISTINCT * FROM [Склад] WHERE [КодТовара] = @randGood; + +-- Один товар одного поставщика в разные даты поставлялся по разным ценам. +DECLARE @randProvider INT; +SET @randProvider = (SELECT TOP 1 [Склад].[КодПоставщика] FROM [Склад] ORDER BY NEWID()); +SET @randGood = (SELECT TOP 1 [Склад].[КодТовара] FROM [Склад] WHERE [КодПоставщика] = @randProvider ORDER BY NEWID()); +SELECT * FROM [Склад] WHERE [КодПоставщика] = @randProvider AND [КодТовара] = @randGood; + +-- Некоторые товары закончились на складе. +SELECT * FROM [Склад] WHERE [Количество] = 0; + +-- Кол-во клиентов, а так же мужчин и женщин среди них +DECLARE @clients INT; +DECLARE @maleClients INT; +DECLARE @femaleClients INT; + +SET @clients = (SELECT count(ID) + FROM [Клиент]); +SET @maleClients = (SELECT count(ID) + FROM [Клиент] + WHERE [Пол] = 1); +SET @femaleClients = @clients - @maleClients; +SELECT @clients as CLIENTS, @maleClients as MALES, @femaleClients AS FEMALES; + +-- Все клиенты совершили покупку единожды +DECLARE @doneDeal INT; +SET @doneDeal = (SELECT count(*) + FROM (SELECT DISTINCT [Сделка].[КодКлиента] + FROM [Сделка]) as CIDDD); +SELECT @clients as CLIENT, @doneDeal as DONE_DEAL_AT_LEAST_ONCE; + +-- Не все товары, имеющиеся на складе, продавались +DECLARE @storagesAmount INT; +SET @storagesAmount = (SELECT count(ID) FROM [Склад]); +SELECT @storagesAmount as STORAGES_AMOUNT, count(*) as UNIQUE_STORAGES_IN_DEALS FROM (SELECT [КодСклада] FROM [Сделка] INTERSECT SELECT ID FROM [Склад]) as SIDWD; diff --git a/4sem/db/lab4.sql b/4sem/db/lab4.sql new file mode 100644 index 0000000..7b10480 --- /dev/null +++ b/4sem/db/lab4.sql @@ -0,0 +1,22 @@ +SELECT + -- Вывести количество сделок, зафиксированных в БД. + (SELECT count(*) FROM [Сделка]) AS DEALS_COUNT, + + -- Определить среднее арифметическое значение количества товаров на складе. + (SELECT AVG([Склад].Количество) FROM [Склад]) AS AVERAGE_GOODS_COUNT, + + -- Определить общее количество товаров на складе. + (SELECT SUM([Склад].Количество) FROM [Склад]) AS ALL_GOODS_COUNT, + + -- Определить максимальное количество товаров на складе. + (SELECT MAX([Склад].Количество) FROM [Склад]) AS MAX_GOODS_COUNT, + + -- Вывести значение косинуса для угла 60º. + COS(RADIANS(60.0)) AS COS60, + + -- Получить целое случайное число в диапазоне [-7; 2]. + -- [-7; 3) -> [-7; 2] + FLOOR(RAND() * (3 - (-7)) + -7) AS RAND_IN_m7_TO_p2, + + -- Определить (вывести в виде числа от 1 до 7) текущий день недели. + DAY(GETDATE()) AS CURRENT_DAY; \ No newline at end of file diff --git a/4sem/db/lab5.sql b/4sem/db/lab5.sql new file mode 100644 index 0000000..019d071 --- /dev/null +++ b/4sem/db/lab5.sql @@ -0,0 +1,29 @@ +-- Сортировать поставщиков в алфавитном (обратном) порядке. +SELECT * FROM [Поставщик] ORDER BY [Имя] DESC; + +-- Вывести поставщика(ов) с самым длинным названием. +SELECT TOP 2 * FROM [Поставщик] ORDER BY LEN([Имя]) DESC; + +-- Вывести всех покупателей с фамилией, начинающейся на букву «В». +SELECT * FROM [Клиент] WHERE [Клиент].[Имя] LIKE N'И%'; + +-- Вывести всех покупателей с фамилией, начинающейся с букв в диапазоне от "В" до +-- "К", где вторая буква «о». +-- АБ[ВГДЕЁЖЗИК]ЛМНОПРСТУФХЦЧШЩЭЮЯ +SELECT * FROM [Клиент] WHERE [Клиент].[Имя] LIKE N'[ВГДЕЁЖЗИК]е%'; + +-- Определите количество сделок за текущий календарный месяц. +SELECT count(*) FROM [Сделка] WHERE MONTH(Дата) = MONTH(GETDATE()); + +-- Определите количество сделок, зафиксированных в заданные дни недели +-- (например, по вторникам и средам). +DECLARE @MON INT = 1; +DECLARE @TUE INT = 2; +DECLARE @WED INT = 3; +DECLARE @THU INT = 4; +DECLARE @FRI INT = 5; +DECLARE @SAT INT = 6; +DECLARE @SUN INT = 7; +DECLARE @daysList TABLE (ID INT); +INSERT @daysList(ID) VALUES (@MON),(@TUE); +SELECT count(*) FROM [Сделка] WHERE DATEPART(DW, [Дата]) in (SELECT ID FROM @daysList); \ No newline at end of file diff --git a/4sem/db/lab6.sql b/4sem/db/lab6.sql new file mode 100644 index 0000000..227e219 --- /dev/null +++ b/4sem/db/lab6.sql @@ -0,0 +1,55 @@ +-- Вывести наименования товаров, количество которых на складе максимально (на +-- складе должно быть как минимум два товара, количество которых одинаково и +-- равно максимальному). +SELECT DISTINCT (SELECT TOP 1 [Товар].[Имя] FROM [Товар] WHERE [Товар].ID = [Склад].КодТовара) as NAME +FROM [Склад] +WHERE [Склад].[Количество] = (SELECT MAX([Склад].[Количество]) FROM [Склад]); + +-- Вывести в порядке, обратном алфавитному, наименования товаров, количество +-- которых на складе находится в заданном диапазоне. +DECLARE @goodsAmountFrom INT = 3; +DECLARE @goodsAmountTo INT = 7; +SELECT DISTINCT (SELECT TOP 1 [Товар].[Имя] FROM [Товар] WHERE [Товар].ID = [Склад].КодТовара) as NAME +FROM [Склад] +WHERE [Склад].[Количество] BETWEEN @goodsAmountFrom AND @goodsAmountTo +ORDER BY NAME DESC; + +-- Вывести поставщиков, которые хотя бы раз осуществили поставку, в алфавитном +-- порядке. +SELECT DISTINCT (SELECT TOP 1 [Поставщик].Имя + FROM [Поставщик] + WHERE NOT EXISTS(SELECT * FROM [Склад] WHERE [Склад].КодПоставщика = [Поставщик].ID)) as NAME +FROM [Склад] +ORDER BY NAME; + +-- 30 дней с даты последней покупки действует дополнительная скидка на все товары. +-- Вывести список покупателей, имеющих возможность воспользоваться указанной +-- скидкой. +-- YYYY-MM-DD +DECLARE @desiredDate DATE = '2020-04-20'; +SELECT DISTINCT (SELECT [Клиент].[Имя] FROM [Клиент] WHERE [Клиент].ID = [Сделка].[КодКлиента]) as NAME +FROM [Сделка] +WHERE DATEDIFF(DAY, [Сделка].[Дата], @desiredDate) <= 30; + +-- Вывести список товаров, названия которых начинающиеся с букв «д» и «л», +-- стоимость которых не более 20% от максимальной. +SELECT (SELECT [Товар].[Имя] FROM [Товар] WHERE [Товар].ID = [Склад].[КодТовара]) as NAME +FROM [Склад] +WHERE ([Склад].Цена / (SELECT MAX([Склад].[Цена]) FROM [Склад])) <= .8 + AND EXISTS(SELECT * FROM [Товар] WHERE [Товар].ID = [Склад].[КодТовара] AND [Товар].[Имя] LIKE N'[мс]%'); + +-- Вывести поставщиков, которые не поставляют товары, названия которых +-- начинающиеся с букв «д» и «л» +SELECT DISTINCT [Поставщик].[Имя] +FROM [Поставщик] +WHERE NOT EXISTS(SELECT * + FROM [Склад] + WHERE [Склад].[КодПоставщика] = [Поставщик].ID + AND EXISTS(SELECT * + FROM [Товар] + WHERE [Склад].[КодТовара] = [Товар].ID + AND [Товар].[Имя] LIKE N'[мс]%')); + +-- Показать список клиентов с указанием их пола («мужчина» или «женщина»). +SELECT [Имя], (IIF([Пол] = 0, N'Женщина', N'Мужчина')) +FROM [Клиент]; \ No newline at end of file diff --git a/4sem/db/lab7.sql b/4sem/db/lab7.sql new file mode 100644 index 0000000..1732312 --- /dev/null +++ b/4sem/db/lab7.sql @@ -0,0 +1,34 @@ +-- Показать какой поставщик поставил каждый товар на склад (INNER JOIN). +SELECT DISTINCT G.[Имя], P.[Имя] FROM [Склад] + INNER JOIN [Поставщик] as P on P.ID = [Склад].[КодПоставщика] + INNER JOIN [Товар] as G on G.ID = [Склад].[КодТовара]; + +-- Вывести список товаров, которыми торгует фирма, и их поставщиков вне +-- зависимости от наличия поставок (LEFT JOIN). +SELECT [Товар].[Имя], P.[Имя] FROM [Товар] + LEFT JOIN [Склад] as S on S.[КодТовара] = [Товар].ID + LEFT JOIN [Поставщик] as P on P.ID = S.[КодПоставщика]; + +-- Вывести информацию о покупаемых со склада товарах и их покупателях, включая +-- товары, отсутствующие в списке реализованных товаров (RIGHT JOIN) +SELECT G.[Имя], + IIF(C.[Имя] is NULL, N'Не определён', C.[Имя]), + IIF([Сделка].[Количество] is NULL, N'Не определено', STR([Сделка].[Количество])) +FROM [Сделка] + INNER JOIN [Склад] as S on S.ID = [Сделка].КодСклада + INNER JOIN [Клиент] as C on C.ID = [Сделка].[КодКлиента] + RIGHT JOIN [Товар] as G on G.ID = S.[КодТовара]; + +-- Вывести список поставщиков, которые хотя бы раз осуществляли поставку на склад +-- (полусоединение). +SELECT DISTINCT [Поставщик].[Имя] FROM [Поставщик] + JOIN [Склад] AS S on [Поставщик].ID = S.[КодПоставщика] + +-- Выведите список сотрудников с указанием их прямых начальников +-- (самосоединение). Для главного начальника в столбец «Начальник» вывести +-- «не определен». +SELECT + [Сотрудник].[Имя], + IIF(B.[Имя] is NULL, N'Не определён', B.[Имя]) +FROM [Сотрудник] + LEFT JOIN [Сотрудник] as B on B.ID = [Сотрудник].[КодНачальника]; \ No newline at end of file diff --git a/4sem/db/lab8-1.sql b/4sem/db/lab8-1.sql new file mode 100644 index 0000000..4f317c8 --- /dev/null +++ b/4sem/db/lab8-1.sql @@ -0,0 +1,59 @@ +-- Провести оценку количества товара на складе по наименованиям: менее 10 – мало, +-- от 10 до 100 – достаточно, более 100 – избыточно. +SELECT G.[Имя], + SUM([Склад].[Количество]) as AMOUNT, + case + when SUM([Склад].[Количество]) < 10 then N'Мало' + when SUM([Склад].[Количество]) < 101 then N'Достаточно' + else N'Избыточно' + end as ESTIMATION +FROM [Склад] + JOIN [Товар] as G on G.ID = [Склад].[КодТовара] +GROUP BY G.[Имя]; + +-- Вывести наименования товаров, количество которых на складе от 1 до 10 (35 и 45) +SELECT * +FROM (SELECT G.[Имя], + SUM([Склад].[Количество]) as AMOUNT + FROM [Склад] + JOIN [Товар] as G on G.ID = [Склад].[КодТовара] + GROUP BY G.[Имя]) as SQNG +WHERE AMOUNT BETWEEN 35 AND 45; + +-- Определить тройку товаров, выручка за которые самая большая. +SELECT TOP 3 G.[Имя], + SUM(D.[Количество] * [Склад].[Цена]) as AMOUNT +FROM [Склад] + JOIN [Товар] as G on G.ID = [Склад].[КодТовара] + JOIN [Сделка] as D on D.[КодСклада] = [Склад].ID +GROUP BY G.Имя +ORDER BY AMOUNT DESC; + +-- Определить суммарную стоимость продаж каждого товара по месяцам. +SELECT G.[Имя], + YEAR(D.[Дата]) as YEAR, + DATENAME(MONTH, D.[Дата]) as MONTH, + SUM(D.[Количество] * [Склад].[Цена]) as AMOUNT +FROM [Склад] + JOIN [Товар] as G on G.ID = [Склад].[КодТовара] + JOIN [Сделка] as D on D.[КодСклада] = [Склад].ID +GROUP BY G.[Имя], YEAR(D.[Дата]), DATENAME(MONTH, D.[Дата]) +ORDER BY AMOUNT DESC; + +-- Показать месяца, в которых продажи Молока 3,2% (или любого другого товара, +-- хранящегося на складе с разными ID) были ниже 300 денег. +DECLARE @randomGoodsId INT = (SELECT TOP 1 ID + FROM [Товар] + ORDER BY NEWID()); +DECLARE @thresholdPrice INT = 200000; +SELECT * +FROM (SELECT G.[Имя], + YEAR(D.[Дата]) as YEAR, + DATENAME(MONTH, D.[Дата]) as MONTH, + SUM(D.[Количество] * [Склад].[Цена]) as AMOUNT + FROM [Склад] + JOIN [Товар] as G on G.ID = [Склад].[КодТовара] + JOIN [Сделка] as D on D.[КодСклада] = [Склад].ID + WHERE [Склад].КодТовара = @randomGoodsId + GROUP BY G.[Имя], YEAR(D.[Дата]), DATENAME(MONTH, D.[Дата])) as SQG +WHERE AMOUNT <= @thresholdPrice; \ No newline at end of file diff --git a/4sem/db/lab8-2.sql b/4sem/db/lab8-2.sql new file mode 100644 index 0000000..a0eaca3 --- /dev/null +++ b/4sem/db/lab8-2.sql @@ -0,0 +1,36 @@ +-- Ранжируйте сотрудников по объемам продаж и выведите тройку лидеров. +WITH trades AS ( + SELECT DISTINCT W.[Имя] AS NAME, + SUM([Сделка].[Количество] * S.Цена) OVER (PARTITION BY [КодСотрудника]) AS DEALS_SUM + + FROM [Сделка] + JOIN [Склад] AS S ON S.ID = [Сделка].[КодСклада] + JOIN [Сотрудник] AS W ON W.ID = [Сделка].[КодСотрудника] +) + +SELECT TOP 3 NAME, + DEALS_SUM, + DENSE_RANK() OVER (ORDER BY DEALS_SUM DESC) AS RANK +FROM trades +ORDER BY DEALS_SUM DESC; + +-- Вывести суммы сделок по месяцам для каждого сотрудника и показать разницу с +-- предыдущим месяцем, в котором были зафиксированы сделки +WITH trades AS ( + SELECT DISTINCT W.[Имя] AS NAME, + YEAR([Сделка].[Дата]) AS CURR_YEAR, + MONTH([Сделка].[Дата]) AS CURR_MONTH, + SUM([Сделка].[Количество] * S.Цена) + OVER (PARTITION BY [КодСотрудника], YEAR([Сделка].[Дата]), MONTH([Сделка].[Дата])) AS DEALS_SUM_CURR_MONTH + + FROM [Сделка] + JOIN [Склад] AS S ON S.ID = [Сделка].[КодСклада] + JOIN [Сотрудник] AS W ON W.ID = [Сделка].[КодСотрудника] +) + +SELECT NAME, + CURR_YEAR, + CURR_MONTH, + DEALS_SUM_CURR_MONTH, + DEALS_SUM_CURR_MONTH - COALESCE(LAG(DEALS_SUM_CURR_MONTH) OVER (PARTITION BY NAME ORDER BY NAME), 0.0) AS DIFF_WITH_LAST_MONTH +FROM trades; \ No newline at end of file diff --git a/4sem/db/lab9.sql b/4sem/db/lab9.sql new file mode 100644 index 0000000..18e8e5c --- /dev/null +++ b/4sem/db/lab9.sql @@ -0,0 +1,312 @@ +BEGIN TRANSACTION + +use dean; + +CREATE TABLE [Специальность] +( + ID int IDENTITY (1,1), + Шифр nvarchar(10) NOT NULL, + Наименование nvarchar(100) NOT NULL, + ФормаОбучения nvarchar(20) NOT NULL, + Уровень nvarchar(20) NOT NULL, + ПродолжительностьОбучения int NOT NULL, + Описание nvarchar(4000) NOT NULL, + CONSTRAINT [PK_СПЕЦИАЛЬНОСТЬ] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (IGNORE_DUP_KEY = OFF) +); +go; + +CREATE TABLE [Группа] +( + ID int IDENTITY (1,1), + Название nvarchar(30) NOT NULL, + КодСпециальности int NOT NULL, + ЗачётнаяКнижкаСтаросты int NULL, + ТабельныйНомерКуратора int NOT NULL, + CONSTRAINT [PK_ГРУППА] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (IGNORE_DUP_KEY = OFF) +); +go; + +CREATE TABLE [Студент] +( + НомерЗачетнойКнижки int IDENTITY (1,1), + Фамилия nvarchar(30) NOT NULL, + Имя nvarchar(30) NOT NULL, + Отчество nvarchar(30) NOT NULL, + Группа int NOT NULL, + ГодПоступления date NOT NULL, + CONSTRAINT [PK_СТУДЕНТ] PRIMARY KEY CLUSTERED (НомерЗачетнойКнижки ASC) WITH (IGNORE_DUP_KEY = OFF) +); +go; + +CREATE TABLE [Преподаватель] +( + ТабельныйНомер int IDENTITY (1,1), + Фамилия nvarchar(30) NOT NULL, + Имя nvarchar(30) NOT NULL, + Отчество nvarchar(30) NOT NULL, + УчёнаяСтепень nvarchar(50) NOT NULL, + УчёноеЗвание nvarchar(50) NOT NULL, + Кафедра nvarchar(50) NOT NULL, + CONSTRAINT [PK_ПРЕПОДАВАТЕЛЬ] PRIMARY KEY CLUSTERED (ТабельныйНомер ASC) WITH (IGNORE_DUP_KEY = OFF) +); +go; + +CREATE TABLE [Дисциплина] +( + ID int IDENTITY (1,1), + Название nvarchar(100) NOT NULL, + КодСпециальности int NOT NULL, + Семестр int NOT NULL, + Объём int NOT NULL, + Отчётность nvarchar(50) NOT NULL, + CONSTRAINT [PK_ДИСЦИПЛИНА] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (IGNORE_DUP_KEY = OFF) +); +go; + +CREATE TABLE [Изучение] +( + ID int IDENTITY (1,1), + Студент int NOT NULL, + Дисциплина int NOT NULL, + Дата date NOT NULL, + Оценка int NOT NULL, + CONSTRAINT [PK_ИЗУЧЕНИЕ] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (IGNORE_DUP_KEY = OFF) +); +go; + +CREATE TABLE [Преподавание] +( + ID int IDENTITY (1,1), + Дисциплина int NOT NULL, + Преподаватель int NOT NULL, + CONSTRAINT [PK_ПРЕПОДАВАНИЕ] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (IGNORE_DUP_KEY = OFF) +); +go; + +ALTER TABLE [Группа] + WITH CHECK ADD CONSTRAINT [Группа_fk0] FOREIGN KEY ([КодСпециальности]) REFERENCES [Специальность] ([ID]) + ON UPDATE CASCADE; +go; + +ALTER TABLE [Группа] + WITH CHECK ADD CONSTRAINT [Группа_fk1] FOREIGN KEY ([ЗачётнаяКнижкаСтаросты]) REFERENCES [Студент] ([НомерЗачетнойКнижки]) + ON UPDATE CASCADE; +go; + +ALTER TABLE [Группа] + WITH CHECK ADD CONSTRAINT [Группа_fk2] FOREIGN KEY ([ТабельныйНомерКуратора]) REFERENCES [Преподаватель] ([ТабельныйНомер]) + ON UPDATE CASCADE; +go; + + +ALTER TABLE [Студент] + WITH CHECK ADD CONSTRAINT [Студент_fk0] FOREIGN KEY ([Группа]) REFERENCES [Группа] ([ID]) + ON UPDATE NO ACTION; +go; + + +ALTER TABLE [Дисциплина] + WITH CHECK ADD CONSTRAINT [Специальность_fk0] FOREIGN KEY (КодСпециальности) REFERENCES [Специальность] ([ID]) + ON UPDATE CASCADE; +go; + + +ALTER TABLE [Изучение] + WITH CHECK ADD CONSTRAINT [Изучение_fk0] FOREIGN KEY (Студент) REFERENCES [Студент] ([НомерЗачетнойКнижки]) + ON UPDATE CASCADE; +go; + +ALTER TABLE [Изучение] + WITH CHECK ADD CONSTRAINT [Изучение_fk1] FOREIGN KEY (Дисциплина) REFERENCES [Дисциплина] ([ID]) + ON UPDATE CASCADE; +go; + + +ALTER TABLE [Преподавание] + WITH CHECK ADD CONSTRAINT [Преподавание_fk0] FOREIGN KEY (Дисциплина) REFERENCES [Дисциплина] ([ID]) + ON UPDATE CASCADE; +go; + +ALTER TABLE [Преподавание] + WITH CHECK ADD CONSTRAINT [Преподавание_fk1] FOREIGN KEY (Преподаватель) REFERENCES [Преподаватель] ([ТабельныйНомер]) + ON UPDATE CASCADE; +go; + +COMMIT TRANSACTION + +BEGIN TRANSACTION + +INSERT INTO [Преподаватель]([Фамилия], [Имя], [Отчество], [УчёнаяСтепень], [УчёноеЗвание], [Кафедра]) +VALUES (N'Казаков', N'Олег', N'Владимирович', N'Кандидат технических наук', N'Профессор', + N'Информатика и вычислительная техника'), + (N'Селиванов', N'Кирилл', N'Владимирович', N'Отсутствует', N'Старший преподаватель', + N'Информатика и вычислительная техника'), + (N'Оленева', N'Татьяна', N'Сергеевна', N'Отсутствует', N'Старший преподаватель', + N'Информатика и вычислительная техника'), + (N'Хантимиров', N'Илья', N'Андреевич', N'Отсутствует', N'Ассистент', N'Информатика и вычислительная техника'); + +INSERT INTO [Специальность]([Шифр], [Наименование], [ФормаОбучения], [Уровень], [ПродолжительностьОбучения], [Описание]) +VALUES (N'09.03.01', N'Информатика и вычислительная техника', N'Очная', N'Бакалавриат', 4, + N'Для того чтобы стать квалифицированным специалистом в выбранном направлении, студенту предстоит научиться:\n\nопределять сферу исследования, собирать, проводить проверку, обрабатывать и анализировать первичные сведения для проектирования;\nразрабатывать программное обеспечение, используя современные инструментальные приложения и средства;\nанализировать технические данные и научную информацию, делать выводы, опираясь на опыт зарубежных и российских коллег по теме проектирования;\nобучать сотрудников компании, использовать современные методы и автоматизированные программные средства для исследования и проектирования;\nосуществлять техническое обслуживание ЭВМ, программных средств и периферийной аппаратуры;\nустанавливать необходимые программные системы и приложения, настраивать и обеспечивать нормальную работу программно-аппаратных средств;\nанализировать показатели технического состояния, амортизации у вычислительного оборудования;\nпроизводить мероприятия по текущему ремонту и профилактике качественной работы систем;\nналаживать взаимосвязь между элементами и узлами вычислительных приборов;\nмонтировать, проводить тестирования и вводить в эксплуатацию вычислительные и информационные сети;\nработать с программными языками и писать приложения на них.'), + (N'09.03.02', N'Информационные системы и технологии', N'Очная', N'Бакалавриат', 4, + N'Бакалавров, получающих образование в области информационных систем и технологий, учат:\n\nосуществлять комплексный анализ разрабатываемых проектов и проводить консультации, помогающие обеспечить подготовку производственного процесса и технического обслуживания;\nизучать взаимосвязи в информационных комплексах и проводить системный анализ заданной области;\nсоздавать прикладные и базовые технологии;\nпроводить комплекс работ, направленных на освоение и финишную модернизацию технологических процессов на этапе подготовки производственного процесса нового продукта;\nпринимать непосредственное участие в вычислительных тестированиях и экспериментах, направленных на проверку точности и актуальности применяемых математических моделей;\nкорректировать стратегию проекта, исходя из инфраструктурного обеспечения предприятия и действующих в нем информационных систем;\nсобирать конечную программную систему, используя для этого готовые элементы и компоненты;\nобеспечивать непрерывную работу и сопровождать информационные технологии и системы, опираясь на требования по качеству и надежности;\nсоставлять доступные инструкции для персонала по применению правильной техники эксплуатации.'), + (N'09.03.04', N'Программная инженерия', N'Очная', N'Бакалавриат', 4, + N'Изучение данной специальности позволит студентам:\n\nучаствовать в осуществлении научных наблюдений и экспериментов в области глубокого анализа программных проектов, продукции, инструментов и методов изучаемого направления;\nобрабатывать и изучать возможности удовлетворения предъявленных заказчиком к разработчику требованиям;\nконструировать компоненты и составляющие программных изделий в необходимом для проектирования объеме в рамках определенного задания;\nадаптировать и использовать средства автоматизированного испытания, проектирования, разработки и обслуживания продукции;\nосуществлять деятельность, направленную на обучение пользователей и их аттестацию в области эксплуатации компьютерных систем;\nустанавливать, настраивать, осваивать и администрировать программное обеспечение;\nпроводить профилактические и корректирующие работы, связанные с эффективным использованием установленных требованиями продуктов;\nразрабатывать пакет документов и формы отчетности;\nсоздавать новые методические программы и разработки в области повышения квалификации и установления общего базового уровня технического персонала в области эксплуатации систем;\nсоздавать положительный эмоциональный и деловой фон во взаимоотношениях с заказчиком;\nиспользовать стандартные инструменты для обеспечения контроля, оценки и качества необходимого уровня программных продуктов.'), + + (N'09.04.01', N'Информатика и вычислительная техника', N'Очная', N'Магистратура', 2, + N'Магистры, получившие дипломы в этой области, умеют:\n\nмоделировать изучаемые процессы и изделия;\nсоздавать новые способы и средства конструирования новых устройств и процессов;\nпродумывать процесс автоматизации принимаемых решений;\nсамостоятельно производить испытания и тестирования, обстоятельно изучать их результаты;\nвыполнять работу ассистента на профильных кафедрах ВУЗов в преподавательской сфере;\nразрабатывать и проводить учебные курсы, которые контролируют доценты и профессоры;\nписать методические пособия, применяемые студентами в процессе учебы;\nпроектировать автоматизированные системы, обоснованно выбирать аппаратно-программные средства информатизации и автоматизации;\nконструировать сложные изделия, к которым относятся также и программные комплексы, применяя средства автоматизации и передовой опыт;\nосуществлять проекты, направленные на создание программ, комплексов и информационных баз;\nсоздавать проекты по объединению информационных систем, опираясь на методики и типовые стандарты в области документооборота и логистической поддержки;\nанализировать продуктивность конструируемых систем, выполняя технико-экономический и функционально-стоимостной анализ;\nсоздавать документы, определяющие нормы и технические стандарты для разработанных программ и проектов.'), + (N'09.04.02', N'Информационные системы и технологии', N'Очная', N'Магистратура', 2, + N'Магистры информационных технологий и систем с легкостью справляются со следующими профессиональными обязанностями:\n\nопределяют основную проектную стратегию, обозначают цели, необходимые для достижений в области проектирования, выбирают основные показатели эффективности и продуктивности, а также ограничивают сферу применения информационных технологий и систем;\nразрабатывают персональные задания для исполнителей в области конструирования отдельных составляющих и элементов, используя при этом методологию системной инженерии;\nприводят к общему виду и классифицируют по типам принимаемые решения;\nорганизовывают конструктивную работу в сфере взаимодействия коллективов заказчика и производителя;\nосуществляют поиск компромиссных решений в долгосрочной и краткосрочной перспективе, находят наилучшие варианты;\nизучают и создают собственные объектные модели в сфере машино- и приборостроения, науки, образования и техники;\nиспользуют определенную методику и способы для выполнения моделирования объектов и процессов;\nпредсказывают направления и темпы развития в сфере информационных технологий и систем;\nобеспечивают методическое наполнение учебного процесса в различных образовательных учреждениях;\nразрабатывают новые идеи, способные составить высокую конкуренцию тем, что действуют на рынке.'), + (N'09.04.04', N'Программная инженерия', N'Очная', N'Магистратура', 2, + N'Для получения степени магистра по программной инженерии учащемуся предстоит научиться:\n\nсоздавать новые средства, способы и методы, необходимые для осуществления процесса изучения объектов программной инженерии, опираясь на унифицированные тенденции в сфере развития профессиональной области;\nразрабатывать программы и проекты, направленные на удовлетворение требований, а также осуществлять контрольные и управляющие функции;\nиспользовать системный подход, моделирование и структурный анализ для выполнения проектных задач;\nприменять новейшие технологии в области конструирования программных комплексов и систем, используя средства автоматизации в процессах планирования, управления и контроля над качеством проектируемой продукции;\nпланировать и координировать работу в процессе разработки программных приложений;\nвыступать в роли эксперта по обучению пользователей необходимым навыкам для использования продукта;\nпроводить анализ и делать выводы на основе полученных сведений, создавая технико-экономическую базу для обоснования принятых решений;\nделать выбор в пользу экономической или технической модели развития и сопровождать на всех этапах жизненного цикла программный продукт;\nоптимизировать принятые проектные и технологические решения, обеспечивая необходимые условия для поддержания высокого уровня качества объектов.'); + +DECLARE @firstTeacherID INT = (SELECT TOP 1 ID + FROM [Специальность] + ORDER BY ID); +DECLARE @firstSpecialityID INT = (SELECT TOP 1 ID + FROM [Специальность] + ORDER BY ID); +INSERT INTO [Группа]([Название], [КодСпециальности], [ЗачётнаяКнижкаСтаросты], [ТабельныйНомерКуратора]) +VALUES (N'КИ20-07Б', @firstSpecialityID, NULL, @firstTeacherID), + (N'КИ20-08Б', @firstSpecialityID + 2, NULL, @firstTeacherID + 1), + (N'КИ16-07Б', @firstSpecialityID + 3, NULL, @firstTeacherID + 2), + (N'КИ16-08Б', @firstSpecialityID + 5, NULL, @firstTeacherID + 3); + +DECLARE @firstGroupID INT = (SELECT TOP 1 ID + FROM [Группа] + ORDER BY ID); +INSERT INTO [Студент]([Фамилия], [Имя], [Отчество], [Группа], [ГодПоступления]) +VALUES (N'Муравьёв', N'Вячеслав', N'Геннадиевич', @firstGroupID, '2020-09-01'), + (N'Сафонов', N'Мстислав', N'Федорович', @firstGroupID, '2020-09-01'), + (N'Воронов', N'Терентий', N'Созонович', @firstGroupID, '2020-09-01'), + (N'Козлова', N'Томила', N'Рудольфовна', @firstGroupID, '2020-09-01'), + (N'Полякова', N'Изольда', N'Леонидовна', @firstGroupID, '2020-09-01'), + (N'Михеева', N'Янина', N'Давидовна', @firstGroupID, '2020-09-01'), + (N'Мухина', N'Милена', N'Ростиславовна', @firstGroupID, '2020-09-01'), + + (N'Дьячкова', N'Беатриса', N'Ильяовна', @firstGroupID + 1, '2020-09-01'), + (N'Евсеева', N'Нинна', N'Мэлоровна', @firstGroupID + 1, '2020-09-01'), + (N'Князев', N'Виссарион', N'Ильяович', @firstGroupID + 1, '2020-09-01'), + (N'Панфилов', N'Моисей', N'Михайлович', @firstGroupID + 1, '2020-09-01'), + (N'Вишняков', N'Юлиан', N'Григорьевич', @firstGroupID + 1, '2020-09-01'), + (N'Самсонова', N'Агния', N'Парфеньевна', @firstGroupID + 1, '2020-09-01'), + (N'Ермакова', N'Елена', N'Феликсовна', @firstGroupID + 1, '2020-09-01'), + + (N'Мишин', N'Харитон', N'Протасьевич', @firstGroupID + 2, '2016-09-01'), + (N'Калинина', N'Мэри', N'Аристарховна', @firstGroupID + 2, '2016-09-01'), + (N'Петухова', N'Наталия', N'Владленовна', @firstGroupID + 2, '2016-09-01'), + (N'Назаров', N'Исак', N'Егорович', @firstGroupID + 2, '2016-09-01'), + (N'Кузнецов', N'Варлаам', N'Ярославович', @firstGroupID + 2, '2016-09-01'), + (N'Трофимова', N'Ванесса', N'Мироновна', @firstGroupID + 2, '2016-09-01'), + (N'Мухин', N'Родион', N'Авксентьевич', @firstGroupID + 2, '2016-09-01'), + + (N'Шарапова', N'Богдана', N'Васильевна', @firstGroupID + 3, '2016-09-01'), + (N'Шарапова', N'Моника', N'Филатовна', @firstGroupID + 3, '2016-09-01'), + (N'Рожков', N'Флор', N'Ростиславович', @firstGroupID + 3, '2016-09-01'), + (N'Красильников', N'Ипполит', N'Романович', @firstGroupID + 3, '2016-09-01'), + (N'Белоусова', N'Бронислава', N'Валерьяновна', @firstGroupID + 3, '2016-09-01'), + (N'Николаев', N'Корней', N'Альбертович', @firstGroupID + 3, '2016-09-01'), + (N'Рыбаков', N'Даниил', N'Тарасович', @firstGroupID + 3, '2016-09-01'); + +UPDATE [Группа] +SET [ЗачётнаяКнижкаСтаросты] = (SELECT TOP 1 [НомерЗачетнойКнижки] FROM [Студент] WHERE [Группа] = 1 ORDER BY NEWID()) +FROM [Группа] +WHERE ID = 1; + +UPDATE [Группа] +SET [ЗачётнаяКнижкаСтаросты] = (SELECT TOP 1 [НомерЗачетнойКнижки] FROM [Студент] WHERE [Группа] = 2 ORDER BY NEWID()) +FROM [Группа] +WHERE ID = 2; + +UPDATE [Группа] +SET [ЗачётнаяКнижкаСтаросты] = (SELECT TOP 1 [НомерЗачетнойКнижки] FROM [Студент] WHERE [Группа] = 3 ORDER BY NEWID()) +FROM [Группа] +WHERE ID = 3; + +UPDATE [Группа] +SET [ЗачётнаяКнижкаСтаросты] = (SELECT TOP 1 [НомерЗачетнойКнижки] FROM [Студент] WHERE [Группа] = 4 ORDER BY NEWID()) +FROM [Группа] +WHERE ID = 4; + +/* +Учились 2 семестра. В каждом было 3 зачета и 2 экзамена по четырем дисциплинам (по +одной дисциплине предусмотрены и зачет, и экзамен) + +На каждую специальность по 8 дисциплин [ 4 на семестр D: ] +*/ +INSERT INTO [Дисциплина]([Название], [КодСпециальности], [Семестр], [Объём], [Отчётность]) +VALUES (N'История России', @firstSpecialityID, 1, 120, N'Зачёт'), + (N'Алгебра и геометрия', @firstSpecialityID, 1, 120, N'Зачёт'), + (N'Математический анализ', @firstSpecialityID, 1, 240, N'Зачёт и Экзамен'), + (N'Теория вероятностей', @firstSpecialityID, 1, 180, N'Экзамен'), + + (N'Основы программирования', @firstSpecialityID, 2, 120, N'Зачёт'), + (N'Алгоритмы и структуры данных', @firstSpecialityID, 2, 120, N'Зачёт'), + (N'Теория и практика речевого общения', @firstSpecialityID, 2, 240, N'Зачёт и Экзамен'), + (N'Философия', @firstSpecialityID, 2, 180, N'Экзамен'), + + + (N'История России', @firstSpecialityID + 2, 1, 120, N'Зачёт'), + (N'Алгебра и геометрия', @firstSpecialityID + 2, 1, 120, N'Зачёт'), + (N'Математический анализ', @firstSpecialityID + 2, 1, 240, N'Зачёт и Экзамен'), + (N'Теория вероятностей', @firstSpecialityID + 2, 1, 180, N'Экзамен'), + + (N'Решение оптимизационных задач программными средствами', @firstSpecialityID + 2, 2, 120, N'Зачёт'), + (N'Базы данных', @firstSpecialityID + 2, 2, 120, N'Зачёт'), + (N'Теория и практика речевого общения', @firstSpecialityID + 2, 2, 240, N'Зачёт и Экзамен'), + (N'Философия', @firstSpecialityID + 2, 2, 180, N'Экзамен'), + + + (N'Архитектура информационных систем', @firstSpecialityID + 3, 1, 120, N'Зачёт'), + (N'Автоматизированное управление бизнес-процессами и финансами', @firstSpecialityID + 3, 1, 120, N'Зачёт'), + (N'Теория и практика речевого общения', @firstSpecialityID + 3, 1, 240, N'Зачёт и Экзамен'), + (N'Философия', @firstSpecialityID + 3, 1, 180, N'Экзамен'), + + (N'Космические информационные системы и технологии', @firstSpecialityID + 3, 2, 120, N'Зачёт'), + (N'Безопасность и защита программных систем', @firstSpecialityID + 3, 2, 120, N'Зачёт'), + (N'Вычислительные машины, системы, комплексы и сети', @firstSpecialityID + 3, 2, 240, N'Зачёт и Экзамен'), + (N'Теория вероятностей', @firstSpecialityID + 3, 2, 180, N'Экзамен'), + + + (N'Нейронные сети', @firstSpecialityID + 5, 1, 120, N'Зачёт'), + (N'Операционные системы и ядра', @firstSpecialityID + 5, 1, 120, N'Зачёт'), + (N'Теория и практика речевого общения', @firstSpecialityID + 5, 1, 240, N'Зачёт и Экзамен'), + (N'Философия', @firstSpecialityID + 5, 1, 180, N'Экзамен'), + + (N'Цифровые технологии сложных инженерных объектов', @firstSpecialityID + 5, 2, 120, N'Зачёт'), + (N'Разработка программно-информационных систем', @firstSpecialityID + 5, 2, 120, N'Зачёт'), + (N'Корпоративные информационные системы', @firstSpecialityID + 5, 2, 240, N'Зачёт и Экзамен'), + (N'Компьютерные системы и сети', @firstSpecialityID + 5, 2, 180, N'Экзамен'); + +DECLARE @firstDisciplineID INT = (SELECT TOP 1 ID + FROM [Дисциплина] + ORDER BY ID); + +INSERT INTO [Преподавание]([Дисциплина], [Преподаватель]) +VALUES (@firstDisciplineID, @firstTeacherID), + (@firstDisciplineID + 1, @firstTeacherID + 1), + (@firstDisciplineID + 2, @firstTeacherID + 2), + (@firstDisciplineID + 3, @firstTeacherID + 3); + + +DECLARE @copyFirstDisciplineID INT = @firstDisciplineID; +WHILE EXISTS(SELECT * + FROM [Дисциплина] + WHERE ID = @copyFirstDisciplineID) + BEGIN + INSERT INTO [Преподавание]([Дисциплина], [Преподаватель]) + VALUES (@copyFirstDisciplineID, (SELECT TOP 1 [ТабельныйНомер] FROM [Преподаватель] ORDER BY NEWID())); + + SET @copyFirstDisciplineID = @copyFirstDisciplineID + 1; + END + +INSERT INTO [Изучение]([Студент], [Дисциплина], [Дата], [Оценка]) +SELECT TOP 50 S.[НомерЗачетнойКнижки], + D.ID, + DATEADD(DAY, 40 + (CHECKSUM(NEWID()) % 30), '2020-01-01'), + IIF(D.Отчётность = N'Зачёт', (0 + ABS(CHECKSUM(NEWID())) % 2), (2 + ABS(CHECKSUM(NEWID())) % 4)) +FROM [Студент] AS S, + [Дисциплина] AS D +ORDER BY NEWID() + +COMMIT TRANSACTION \ No newline at end of file