- •Письменные лекции по дисциплине «Базы данных»
- •Лекция 1. Понятие субд. Модели данных. Реляционная модель
- •1.1. Бд и субд
- •1.2. Классификация бд
- •1.3. Классификация субд
- •1.3.1. Состав субд и работа бд
- •1.4. Язык sql
- •1.5. Основные типы sql запросов по их видам
- •1.6. Основные функции субд
- •1.7. Модели данных
- •1.8. Реляционная модель данных
- •1.9. Информационный объект
- •1.10. Нормализация отношений
- •1.10.1. Первая нормальная форма
- •1.10.2. Вторая нормальная форма
- •Лекция 2. Продолжение прошлой лекции
- •2.1. Третья нормальная форма
- •2.2. Отношения
- •2.3. Ключ
- •2.4. Пример выгрузки данных
- •2.5. Заполнение таблиц
- •2.6. Реляционные операции
- •1. Выборка
- •2. Проекция
- •3. Объединение
- •4. Пересечение
- •5. Разность
- •6. Произведение
- •7. Деление
- •8. Соединение
- •2.7. Соединение таблиц
- •2.8. Изменение таблицы
- •2.9. Типы данных MySql
- •2.10. Параллелизм
- •Лекция 3. Хранимые процедуры и функции
- •3.1. Хранимая процедура MySql
- •3.2. Переменные
- •3.3. Параметры процедуры
- •3.4. Операторы if и case
- •3.5. Оператор return
- •Лекция 4. Транзакции. Уровни изоляции. Блокировки.
- •4.1. Понятие транзакции
- •4.2. Операторы транзакции
- •4.3. Уровни изоляции (изолированности) транзакций
- •4.4. Тест acid
- •4.5. Механизм блокировок
- •4.6. Взаимоблокировки
- •4.7. Ведение журнала транзакций
- •Лекция 5. Ссылочная целостность данных. Внешние ключи. Индексирование.
- •5.1. Ссылочная целостность данных
- •5.2. Внешний ключ
- •5.2.1. Условия обеспечения целостности данных при помощи внешнего ключа
- •5.2.2. Практический пример
- •5.2.3. Синтаксис объявления внешнего ключа
- •5.3. Индекс
- •5.3.1. Для каких полей нужно создавать индексы
- •5.3.2. Принцип работы индексов
- •5.3.3. Виды индексов
- •5.3.4. Индексирование таблиц MySql
- •5.3.5. Создание индекса в MySql
- •5.3.6. Типы индексов в MySql
- •5.3.7. Удаление индекса в MySql
- •5.3.8. Преимущества использования индексов
- •5.3.9. Недостатки использования индексов
- •5.3.10. Практический пример
- •5.4. Курсор
- •Лекция 6. Администрирование баз данных
- •6.1. Резервирование и восстановление вручную
- •6.2. Команды grant и revoke
- •6.3. Утилита mysqldump
- •6.3.1. Создание дампа
- •6.3.2. Развертывание дампа
- •6.4. Утилита mysqlhotcopy
- •6.5. Утилита mysqlcheck
- •Лекция 7. Администрирование бд
- •7.7. Статус таблиц
- •7.8. Просмотр таблиц, доступных в бд
- •7.9. Получение информации о статусе сервера
- •7.10. Получение информации о переменных
- •7.16. Файлы журналов
- •7.17. Как обезопасить MySql от хакеров
- •Указатели на страницы с ответами
3.2. Переменные
Переменные бывают пользовательскими (такая переменная создается в момент присвоения ей значения и хранится до завершения соединения с сервером; пишется со знаком @, например, @total), переменными хранимого кода (имеют ограниченную область видимости; пишется без знака @) и системными.
Пользовательская переменная:
SET @total = 5;
Переменная хранимого кода:
DECLARE total INT DEFAULT 5;
или
DECLARE total INT;
SET total = 5;
Системная переменная может быть глобальной или переменной сеанса.
Глобальная системная переменная:
SET GLOBAL total = 5;
или
SET @@global.total = 5;
Системная переменная сеанса:
SET total = 5;
или
SET SESSION total = 5;
или
SET @@total = 5;
или
SET @@local.total = 5;
В следующем примере показано использование пользовательских переменных внутри хранимой процедуры.
mysql> DELIMITER $$
mysql> CREATE PROCEDURE my_procedure_User_Variables()
-> BEGIN
-> SET @x = 15;
-> SET @y = 10;
-> SELECT @x, @y, @x - @y;
-> END $$
Query OK, 0 rows affected (0.32 sec)
mysql> DELIMITER ; $$
Теперь выполним процедуру:
mysql> CALL my_procedure_User_Variables();
+------+------+---------+
| @x | @y | @x - @y |
+------+------+---------+
| 15 | 10 | 5 |
+------+------+---------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
3.3. Параметры процедуры
Синтаксис процедуры:
CREATE [DEFINER = { пользователь | CURRENT_USER }]
PROCEDURE имя_процедуры ([параметр_процедуры[,...]])
[характеристики ...] тело_подпрограммы
параметр_процедуры: [ IN | OUT | INOUT ] имя_парамета type
Варианты синтаксиса:
CREATE PROCEDURE имя_процедуры () …
CREATE PROCEDURE имя_процедуры ([IN] имя_параметра type)…
CREATE PROCEDURE имя_процедуры ([OUT] имя_параметра type)…
CREATE PROCEDURE имя_процедуры ([INOUT] имя_параметра type)…
В первом примере список параметров пуст.
Во втором примере параметр IN передает значение в процедуру. Эта процедура может изменить значение. Но, когда процедура возвращает значение, оно не будет видно для вызывающего агента.
В третьем примере параметр OUT передает значение из процедуры обратно вызывающему агенту. Его начальное значение в процедуре NULL, и, когда процедура возвращает значение, оно видно вызывающему агенту.
В четвертом примере параметр INOUT инициализируется вызывающим агентом, он может быть изменен процедурой, и когда процедура возвращает значение, любые изменения, произведенные MySQL хранимой процедурой, будут видны вызывающему агенту.
В процедуре каждый параметр по умолчанию является параметром IN. Чтобы изменить это, используйте перед именем параметра ключевое слово OUT или INOUT.
Пример параметра IN.
mysql> CREATE PROCEDURE my_proc_IN (IN var1 INT)
-> BEGIN
-> SELECT * FROM jobs LIMIT var1;
-> END$$
Query OK, 0 rows affected (0.00 sec)
LIMIT используется для ограничения количества возвращаемых записей таблицы jobs на основании предельного значения var1.
Чтобы выбрать первые две строки из таблицы jobs выполним следующую команду:
mysql> CALL my_proc_in(2)$$
+---------+-------------------------------+------------+------------+
| JOB_ID | JOB_TITLE | MIN_SALARY | MAX_SALARY |
+---------+-------------------------------+------------+------------+
| AD_PRES | President | 20000 | 40000 |
| AD_VP | Administration Vice President | 15000 | 30000 |
+---------+-------------------------------+------------+------------+
2 rows in set (0.00 sec)Query OK, 0 rows affected (0.03 sec)
Пример параметра OUT.
Дальше представлен MySQL хранимой процедуры пример, в котором используется параметр OUT. В рамках процедуры MySQL функция MAX() извлекает максимальную зарплату из столбца MAX_SALARY таблицы jobs:
mysql> CREATE PROCEDURE my_proc_OUT (OUT highest_salary INT)
-> BEGIN
-> SELECT MAX(MAX_SALARY) INTO highest_salary FROM JOBS;
-> END$$
Query OK, 0 rows affected (0.00 sec)
В теле процедуры параметр получает самую высокую зарплату из столбца MAX_SALARY. После вызова процедуры слово OUT сообщает СУБД, что значение исходит от процедуры. highest_salary — это имя выходного параметра и в операторе CALL мы передали его значение переменной сеанса с именем @M:
mysql> CALL my_proc_OUT(@M)$$
Query OK, 1 row affected (0.03 sec)
mysql> SELECT @M$$+-------+
| @M |
+-------+
| 40000 |
+-------+
1 row in set (0.00 sec)
Пример параметра INOUT.
В следующем примере показана простая хранимая процедура MySQL, которая использует параметр INOUT и параметр IN. Пользователь предоставляет 'M' или 'F' через параметр IN (emp_gender) для подсчета количества сотрудников мужского или женского пола из таблицы user_details. Параметр INOUT (mfgender) возвращает результат пользователю. Вот код и результат выполнения процедуры:
mysql> CALL my_proc_OUT(@M)$$
Query OK, 1 row affected (0.03 sec)
mysql> CREATE PROCEDURE my_proc_INOUT (INOUT mfgender INT, IN emp_gender CHAR(1))
-> BEGIN
-> SELECT COUNT(gender) INTO mfgender FROM user_details WHERE gender = emp_gender;
-> END$$
Query OK, 0 rows affected (0.00 sec)
Теперь проверяем количество сотрудников мужского и женского пола в указанной таблице:
mysql> CALL my_proc_INOUT(@C,'M')$$
Query OK, 1 row affected (0.02 sec)
mysql> SELECT @C$$
+------+
| @C |
+------+
| 3 |
+------+
1 row in set (0.00 sec)
mysql> CALL my_proc_INOUT(@C,'F')$$
Query OK, 1 row affected (0.00 sec)
mysql> SELECT @C$$
+------+
| @C |
+------+
| 1 |
+------+
1 row in set (0.00 sec)