Вы находитесь на странице: 1из 28

Лекция 1

Agenda

✓ View (Представления)
✓ Системные таблицы
✓ Условные функции
✓ Jobs
✓ Triggers
View (Представления)
Что такое представление?
Представления - это таблицы чье содержание выбирается или получается из других
таблиц. Они работают в запросах и операторах DML точно также как и основные таблицы ,
но не содержат никаких собственных данных. Фактически это запрос, который
выполняется всякий раз, когда мы обращаемся к представлению . Вывод запроса при этом
в каждый момент становится содержанием представления.
Иногда их называют Виртуальными таблицами

Представления могут основываться как на таблицах , так и на других представлениях , т .е .


могут быть вложенными (до 32 уровней вложенности).
Синтаксис: создание, изменение, удаление
Создание Представления Удаление Представления

CREATE DROP VIEW [IF EXISTS]


[OR REPLACE] view_name [, view_name] ...
[ALGORITHM = {UNDEFINED | MERGE | [RESTRICT | CASCADE]
TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
Плюсы и Минусы
✓ таблицы и представления, присутствующие
✓ удобство в использовании
в определении представления должны
✓ возможность гибкой настройки прав
существовать.
доступа к данным ✓ Нельзя использовать Индексы с
✓ возможность разделить логику представлениями
хранения данных и программного ✓ Ограничение длины имени поля (64 символа
обеспечения вместо 256)
✓ оптимизация
Ограничения в устаревших версиях
MySQL:
✓ нельзя повесить триггер на представление
✓ нельзя сделать представление на основе
временных таблиц; нельзя сделать
временное представление;
✓ нельзя использовать подзапрос в части
FROM
✓ нельзя использовать системные и
пользовательские переменные
✓ только представления, удовлетворяющие
И еще немного информации
Концепция «материализованных представлений» в СУБД Oracle

Использование с командами модификации DML (UPDATE, DELETE, INSERT)


Немного практики:
Необходимо отобразить данные о работнике
(id, first_name, last_name) и его текущую зарплату
Системные таблицы
Что такое системные таблицы?
Предустановленные схемы, которые содержат информацию о БД:
В MySQL:
MYSQL, SYS, INFORMATION_SCHEMA
Использование SQL для генерирования
SQL
select TABLE_NAME
from information_schema.TABLES
where TABLE_NAME like 'Emp%';

select
concat("select count(*) from ", table_name, " ;") as cnts
from information_schema.TABLES
where TABLE_SCHEMA = 'employees';
Условные функции
IF(), CASE … WHEN … THEN … END
IF(condition, then, else) CASE … WHEN … THEN … END

IF(condition, value_if_true, value_if_false)


IFNULL(), NULLIF()
IFNULL(expr1,expr2) NULLIF(expr1,expr2)
Если expr1 это NULL, то функция возвращает Если expr1 = expr2 верно, то функция возвращает
expr2 NULL, иначе expr1
А еще есть IF … THEN … ELSE
Используется в пользовательских функциях (о них мы поговорим позже):

IF search_condition THEN statement_list


[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
Немного практики:
Разделим текущие зарплаты на три уровня
(до 50000 - low paid
до 75000 - well paid
выше 75000 - highly paid),
и определим к какой части относится
сотрудник
Jobs
(MySQL: Events)
Что такое событие?
Событие - это производимая по расписанию операция в базе
данных. Это может быть вызов функции или процедуры или
запуск простых SQL команд.

SHOW VARIABLES
WHERE VARIABLE_NAME = 'event_scheduler'

set global event_scheduler = 'ON';


Синтаксис
DROP EVENT [IF EXISTS] event_name
CREATE
[DEFINER = { user | CURRENT_USER }]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
DO event_body;

schedule:
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]

interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR |
MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR |
DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND |
MINUTE_SECOND}
Применение
✓ Резервное копирование данных
✓ Запуск сохраненных процедур
✓ Регулярная очистка таблиц, сессий
✓ Обновление метериализованных представлений
Немного практики:
Создадим событие, которое будет
добавлять стажеров к нам в компанию
каждые 30 секунд на протяжении 2 минут

Создадим отдельную таблицу для хранения


стажеров (айди, имя, фамилия)
Пусть событие добавляет новых стажеров в
созданную таблицу
Triggers
Что такое триггеры?
Триггер — это хранимая процедура, которая не вызывается
непосредственно, а исполняется при наступлении определенного
действия в базе ( вставка, удаление, обновление строки ).
Поддержка триггеров в MySQL началась с версии 5.0.2

!!! Триггер представляет собой весьма полезное и в то же время


опасное средство. Так, при неправильной логике его работы можно
легко уничтожить целую базу данных, поэтому триггеры необходимо
очень тщательно отлаживать !!!
Синтаксис
CREATE DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order]
trigger_body

trigger_time: { BEFORE | AFTER }

trigger_event: { INSERT | UPDATE | DELETE }

trigger_order: { FOLLOWS | PRECEDES } other_trigger_name


_________________________________________________
Применение
В отличие от обычной подпрограммы, триггер выполняется неявно в каждом случае
возникновения триггерного события. Приведение его в действие иногда называют
запуском триггера. С помощью триггеров достигаются следующие цели :

✓ проверка корректности введенных данных и выполнение сложных ограничений


целостности данных, которые трудно, если вообще возможно , поддерживать с
помощью ограничений целостности, установленных для таблицы ;
✓ выдача предупреждений, напоминающих о необходимости выполнения
некоторых действий при обновлении таблицы, реализованном определенным
образом;
✓ накопление аудиторской информации посредством фиксации сведений о
внесенных изменениях и тех лицах, которые их выполнили;
✓ поддержка репликации.
Немного практики:
Создадим триггер который будет создавать
запись, о том что в компанию пришел новый
стажер
Создадим отдельную таблицу для хранения
лога (айди, имя, фамилия, таймстэмп)
При добавлении нового стажера триггер
должен сохранять в лог айди, имя, фамилию
и время прихода стажера в компанию
?
Спасибо

Оценить