
Готовые отчеты / Базы данных. Лабораторная работа 5
.pdfФедеральное агентство связи ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» (СПбГУТ)
Факультет инфокоммуникационных сетей и систем Кафедра фотоники и линий связи
ЛАБОРАТОРНАЯ РАБОТА №5 по дисциплине «Базы данных»
на тему «CASE, встроенные функции MySQL»
Выполнили: студенты 3-го курса дневного отделения группы ИКПИ-85 Ежуров Антон Павлович
Коваленко Леонид Александрович Преподаватель:
ассистент кафедры ПИиВТ Овчинников Антон Олегович
Санкт-Петербург
2020

Цель работы Получить практические навыки в работе со встроенными функциями
на языке SQL.
Ход работы
Создадим базу данных university в программе-дизайнере MySQL Workbench. В этой базе данных создадим таблицу tasks с полями:
1.id типа INT, первичный ключ (PK), счетчик (AI);
2.taskname типа VARCHAR, ненулевое (NN);
3.taskmonth типа VARCHAR;
4.taskday типа VARCHAR;
5.user_id типа INT.
Создадим хранимую процедуру createTask (раздел Routines в MySQL Workbench). Заполним тело процедуры согласно образцу (табл. 1).
Таблица 1 — Процедура createTask
CREATE PROCEDURE `university`.`createTask` (IN tname VARCHAR(45), IN tdate DATETIME, OUT muchdays VARCHAR(45))
BEGIN
DECLARE tmonth VARCHAR(45); SELECT CONCAT('Task month is: ',
(CASE MONTH(tdate)
WHEN 1 THEN 'Jan'
WHEN 2 THEN 'Feb'
WHEN 3 THEN 'Mar'
WHEN 4 THEN 'Apr'
WHEN 5 THEN 'May'
WHEN 6 THEN 'Jun'
WHEN 7 THEN 'Jul'
WHEN 8 THEN 'Aug'
WHEN 9 THEN 'Sep'
WHEN 10 THEN 'Oct'
WHEN 11 THEN 'Nov'
WHEN 12 THEN 'Dec' ELSE 'None'
END)
) INTO tmonth;
INSERT INTO tasks (taskname, taskday, taskmonth) VALUES (tname, DAY(tdate), tmonth);
SELECT CONCAT('Remains days: ', DATEDIFF(tdate, CURDATE())) INTO muchdays;
END
Сохраним созданную в программе-дизайнере схему базы данных на локальный компьютер.
Запустим генерацию базы данных на сервере MySQL (Пункт меню: Database → Forward Engineer). В опциях поставим галки напротив пунктов
2

Generate INSERT statements for tables и DROP objects before each CREATE object.
mysql -u root -p) и
активизируем базу данных university (команда use university). В командной строке выполним следующие команды (рис. 1):
#Создаем новое задание и в days записываем число оставшихся дней CALL createTask('Database optimization', '2020-01-01', @days);
#Конкатенация строки и числа оставшихся дней
SELECT CONCAT('Optimization. ', @days);
#Создаем новое задание и в days записываем число оставшихся дней CALL createTask('Database replication', '2021-01-01', @days);
#Конкатенация строки и числа оставшихся дней
SELECT CONCAT('Replication. ', @days);
# Вывод списка задач SELECT * FROM tasks;
Рисунок 1 — Результат выполнения команд Выводы
CASE — условный оператор языка SQL. Первая форма CASE.
CASE
WHEN условие_1 THEN возвращаемое_значение_1
...
WHEN условие_N THEN возвращаемое_значение_N [ELSE возвращаемое_значение]
END
3
Посмотрим на следующий код:
SELECT
ID, Name, Salary, CASE
WHEN Salary>=3000 THEN 'ЗП >= 3000'
WHEN Salary>=2000 THEN '2000 <= ЗП < 3000' ELSE 'ЗП < 2000' # Можно без ELSE
END SalaryType FROM Employees;
По итогу выполнения получим таблицу с 4 столбцами, 3 первых столбца которой (ID, Name, Salary) были выбраны из самой таблицы и ещё один столбец под названием SalaryType, который сформировался на основе возвращаемого значения CASE. Если ELSE не указан и ни одно условие не оказалось верным, то SalaryType равен NULL.
Вторая форма CASE.
CASE проверяемое_значение
WHEN сравниваемое_значение_1 THEN возвращаемое_значение_1
...
WHEN сравниваемое_значение_N THEN возвращаемое_значение_N [ELSE возвращаемое_значение]
END
Посмотрим на следующий код:
SELECT
ID, Name, Salary, DepartmentID,
CASE DepartmentID # Проверяемое значение
WHEN 2 THEN '10%' # 10% от ЗП выдать Бухгалтерам
WHEN 3 THEN '15%' # 15% от ЗП выдать ИТ-шникам ELSE '5%' # Всем остальным по 5%
END NewYearBonusPercent FROM Employees
По итогу выполнения получим таблицу с 5 столбцами, 4 первых столбца которой (ID, Name, Salary, DepartmentID) были выбраны из самой таблицы и ещё один столбец под названием NewYearBonusPercent, который сформировался на основе возвращаемого значения CASE. Если ELSE не указан и ни одно условие не оказалось верным, то NewYearBonusPercent равен NULL.
4
MONTH() возвращает месяц для даты в диапазоне от 1 до 12 (с января по декабрь). Возвращает 0, если в месте указания месяца в дате написано 0.
CONCAT(expression1, expression2, ..., expressionN) позволяет
объединять вместе два или более выражений.
Если expression является числовым значением, то оно будет преобразовано функцией CONCAT в двоичную строку.
Если все expression не являются двоичными строками, функция CONCAT вернет недвоичную строку.
Если какое-либо из expression является двоичной строкой, функция CONCAT вернет двоичную строку.
Если какое-либо из выражений имеет значение вернет значение NULL.
5