
БД 5 Отчёт
.docxМинистерство образования Республики Беларусь
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
Кафедра экономической информатики
Лабораторная работа №5
Манипулирование данными с помощью команд языка Transact-SQL
Вариант 6
Выполнил: |
|
Проверил: |
доцент кафедры ЭИ Бутов А.А. |
Минск 2023
Цель работы:
Изучить команды языка манипулирования данными.
Освоить основные команды языка определения данных.
Задачи:
Выборка данных из таблиц и представлений.
Обновление данных в таблицах и представлениях.
Удаление данных из таблиц и представлений.
Изменение структуры таблицы.
Удаление таблиц из базы данных.
Разработанный скрипт имеет вид:
USE Склад_218
GO
/*Для каждой пары полей "НаименованиеСклада" "НаименованиеГруппы" подсчитать
общую стоимость тех товаров,
которые были заказаны клиентами из Беларуси и России за последний год*/
SELECT
Склад.Наименование AS НаименованиеСклада,
ГруппаТоваров.Наименование AS НаименованиеГруппы,
SUM(Товар.Цена) AS ОбщаяСтоимость
FROM
Заказ
JOIN
Товар ON Заказ.КодТовара = Товар.КодТовара
JOIN
ГруппаТоваров ON Товар.КодГруппы = ГруппаТоваров.КодГруппы
JOIN
ГруппаСклад ON ГруппаТоваров.КодГруппы = ГруппаСклад.КодГруппы
JOIN
Склад ON ГруппаСклад.КодСклада = Склад.КодСклада
JOIN
Клиент ON Заказ.КодКлиента = Клиент.КодКлиента
JOIN
Регион ON Клиент.КодРегиона = Регион.КодРегиона
WHERE
Регион.Страна IN ('Беларусь', 'Россия') AND Заказ.ДатаЗаказа <= GetDate() - 365
GROUP BY
Склад.Наименование,
ГруппаТоваров.Наименование;
/*1. Из таблицы Клиент выберите все строки, для которых значение поля ФИОРуководителя
содержит подстроку «гор» и значение поля КодРегиона не принадлежит
диапазону от 101 до 200 или неизвестно.*/
SELECT *
FROM Клиент
WHERE
ФИОРуководителя LIKE '%гор%'
AND (КодРегиона < 101 OR КодРегиона > 200 OR КодРегиона IS NULL);
/*2. Из таблицы Поставщик выберите все строки, для которых значение поля УсловияОплаты
не равно «Предоплата» или значение поля КодРегиона не попадает в интервал значений от 101 до 200 и не
попадает в интервал значений от 301 до 400.*/
SELECT *
FROM Поставщик
WHERE
УсловияОплаты != 'Предоплата' OR (КодРегиона NOT BETWEEN 101 AND 200 AND КодРегиона NOT BETWEEN 301 AND 400);
/*3. Из таблицы Регион выберите все строки, относящиеся к России (но не связанные с городом «Москва»)
или к Беларуси (но не связанные с городами «Минск» и «Гомель»).*/
SELECT *
FROM Регион
WHERE
(Страна = 'Россия' AND Город != 'Москва')
OR (Страна = 'Беларусь' AND Город NOT IN ('Минск', 'Гомель'));
/*4. Из таблицы Товар выберите все строки, связанные с валютой «Доллары США», для которых значение
цены лежит в диапазоне от 200 до 800, а также все строки, связанные с валютой «Евро», д
ля которых значение цены лежит в диапазоне от 100 до 500 или неопределено.*/
SELECT *
FROM Товар
WHERE
(Цена > 199 AND Цена < 801 AND КодВалюты = 'USD') OR ((Цена > 99 AND Цена < 501 OR Цена IS NULL) AND КодВалюты = 'EUR')
/*5. В таблице Заказ найдите все те строки, для которых значение поля Количество не определено или не попадает
в интервал значений от 2 до 20. Однако на экран наряду с полями КодКлиента, КодТовара и КодПоставщика
выведите также поля ИмяКлиента, Наименование и ИмяПоставщика, которые снабдят малоинформативные коды
содержательными наименованиями.*/
SELECT Заказ.КодКлиента , Заказ.КодТовара , Заказ.КодПоставщика, Клиент.ИмяКлиента, Товар.Наименование , Поставщик.ИмяПоставщика
FROM Заказ
INNER JOIN Поставщик ON Поставщик.КодПоставщика = Заказ.КодПоставщика
INNER JOIN Товар ON Товар.КодТовара = Заказ.КодТовара
INNER JOIN Клиент ON Клиент.КодКлиента = Заказ.КодКлиента
WHERE (Количество IS NULL ) OR (Количество NOT BETWEEN 2 AND 20)
/*6. В таблице Заказ найдите все строки, относящиеся к поставщикам из России или Украины, а из них,
в свою очередь, выберите те строки, для которых с момента заказа прошло более 45 дней. Кроме того,
в полученном наборе строк дополните столбцы КодТовара и КодКлиента столбцами Наименование и ИмяКлиента,
расшифровывающими коды товаров и клиентов соответственно. Результирующий набор строк отсортируйте по полю
ДатаЗаказа в порядке убывания, далее (для совпадающих значений), – по полю ИмяКлиента и, далее (если и
здесь будут совпадения), - по полю Количество в порядке убывания.*/
SELECT СрокПоставки - ДатаЗаказа AS Просрочка, КодТовара , Заказ.КодКлиента , Клиент.ИмяКлиента , Количество
FROM Заказ
INNER JOIN Клиент ON Клиент.КодКлиента = Заказ.КодКлиента
WHERE КодПоставщика = 123 OR КодПоставщика = 456 AND СрокПоставки - ДатаЗаказа > 45
ORDER BY ДатаЗаказа DESC , ИмяКлиента , Количество
/*7. Из представления Запрос1 выберите все те строки, для которых одновременно выполняются 2 следующих условия:
- значение поля Наименование содержит в себе подстроку «тер» или «тор» или же заканчивается буквой «а»;
- значение поля Количество попадает в диапазон значений от 5 до 10 или значение поля ЕдиницаИзм равно «штука» или «литр».
*/
SELECT *
FROM Запрос1
WHERE
(Наименование LIKE '%тер%' OR Наименование LIKE '%тор%' OR Наименование LIKE '%а')
AND (Количество BETWEEN 5 AND 10 OR ЕдиницаИзм IN ('штука', 'литр'));
/*1. В таблице Клиент замените имя клиента «ГП ”Верас”» на «ГП ”Верас М”»,
а фамилию ее руководителя сделайте неопределенной.*/
UPDATE Клиент
SET
ИмяКлиента = 'ГП ”Верас М”',
ФИОРуководителя = NULL
WHERE
ИмяКлиента = 'ГП ”Верас”';
/*2. В таблице Поставщик в поле УсловияОплаты установите значение «По договору поставки»
для всех поставщиков, названия которых заканчиваются буквой «н», «т», «л» и не начинаются
префиксом «ЗАО» или «ОАО».*/
UPDATE Поставщик
SET УсловияОплаты = 'По договору поставки'
WHERE
(RIGHT(ИмяПоставщика, 1) IN ('н', 'т', 'л')
AND NOT (ИмяПоставщика LIKE 'ЗАО%' OR ИмяПоставщика LIKE 'ОАО%'));
/*3. В таблице Товар во всех записях, где цена от 100000 до 1000000 белорусских рублей,
замените код валюты на «RUR», а цену уменьшите в 285 раз, а во всех записях,
где цена больше 1000000 белорусских рублей, замените код валюты на «USD»,
а цену уменьшите в 9100 раз. */
UPDATE Товар
SET
КодВалюты = 'RUR',
Цена = Цена / 285
WHERE
Цена BETWEEN 100000 AND 1000000;
UPDATE Товар
SET
КодВалюты = 'USD',
Цена = Цена / 9100
WHERE
Цена > 1000000;
/*4. В таблице Заказ обновите поле СрокПоставки следующим образом: если дата заказа раньше
15 октября текущего года, то срок поставки будет равен дате заказа,
увеличенной на 14 дней, однако, после 15 октября срок поставки должен
быть больше даты заказа на 10 дней. Если же значение поля КодПоставщика не определено,
то срок поставки должен быть равен дате заказа, увеличенной на 20 дней.*/
UPDATE Заказ
SET СрокПоставки =
( CASE
WHEN (ДатаЗаказа < '15.10.2021') THEN ДатаЗаказа + 14
WHEN (ДатаЗаказа >= '15.10.2021') THEN ДатаЗаказа +10
ELSE ДатаЗаказа + 20
END )
/*1. Добавьте приведенные ниже данные в соответствующие таблицы базы данных с помощью команды INSERT.*/
INSERT INTO Валюта (КодВалюты, ИмяВалюты, ШагОкругления, КурсВалюты)
VALUES ('GRV', 'Украинские гривны', 0.01, 250);
INSERT INTO Товар (КодТовара, Наименование, ЕдиницаИзм, Цена, КодВалюты, Расфасован)
VALUES
(669, 'ПК-клавиатура', 'штука', 2630, 'GRV', 'Да'),
(777, 'Разъем USB', 'штука', 135, 'GRV', 'Да'),
(888, 'Принтер Lexmark', 'штука', 12790, 'GRV', 'Да');
INSERT INTO Заказ (КодКлиента, КодТовара, Количество, КодПоставщика)
VALUES
(4, 669, 17, 123),
(5, 777, 5, 124),
(3, 888, 14, 124),
(5, 669, 9, 125);
/*удаление строк*/
DELETE FROM Валюта
WHERE КодВалюты = 'GRV'
GO
/*удаление таблицы регион*/
EXEC sp_fkeys 'Регион'
GO
ALTER TABLE Клиент DROP CONSTRAINT FK_Клиент_Регион
ALTER TABLE Поставщик DROP CONSTRAINT FK_Поставщик_Регион
DROP TABLE Регион
GO
/*удаление таблицы поставщик*/
ALTER TABLE Заказ DROP CONSTRAINT FK_Заказ_Поставщик
DROP TABLE Поставщик
GO
/*удаление предстовления*/
DROP VIEW Запрос1;
GO