Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Готовые отчеты / Базы данных. Лабораторная работа 5

.pdf
Скачиваний:
47
Добавлен:
29.01.2021
Размер:
268.59 Кб
Скачать

Федеральное агентство связи ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» (СПбГУТ)

Факультет инфокоммуникационных сетей и систем Кафедра фотоники и линий связи

ЛАБОРАТОРНАЯ РАБОТА №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

Подключимся к базе данных MySQL (команда

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

NULL, функция CONCAT

MONTH() возвращает месяц для даты в диапазоне от 1 до 12 (с января по декабрь). Возвращает 0, если в месте указания месяца в дате написано 0.

CONCAT(expression1, expression2, ..., expressionN) позволяет

объединять вместе два или более выражений.

Если expression является числовым значением, то оно будет преобразовано функцией CONCAT в двоичную строку.

Если все expression не являются двоичными строками, функция CONCAT вернет недвоичную строку.

Если какое-либо из expression является двоичной строкой, функция CONCAT вернет двоичную строку.

Если какое-либо из выражений имеет значение вернет значение NULL.

5