Кафедра ИТКафедра ИТ
Обучение
  • О кафедре
  • Направления подготовки
  • Друзья и партнеры
  • Структура кафедры
  • Обращение к студентам
  • Официальный сайт «ВШП»
GitHub
Обучение
  • О кафедре
  • Направления подготовки
  • Друзья и партнеры
  • Структура кафедры
  • Обращение к студентам
  • Официальный сайт «ВШП»
  • МДК.11.01 - 16 - Переменные

МДК.11.01 - 16 - Переменные

Примеры данной темы используют учебную БД:

Структура БД
Дамп
SET foreign_key_checks = 0;

DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS accounts;

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`)
);

LOCK TABLES `users` WRITE;
INSERT INTO `users` VALUES (1,'Иванов Иван Иванович'),(2,'Петров Петр Петрович'),(3,'Сидоров Сидор Сидорович');
UNLOCK TABLES;

CREATE TABLE `accounts` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(255) DEFAULT NULL,
  `user_id` INT NOT NULL,
  `balance` DECIMAL(10,2) NOT NULL DEFAULT '0.00',
  PRIMARY KEY (`id`),
  KEY `user_id_idx` (`user_id`),
  CONSTRAINT `user_id`
    FOREIGN KEY (`user_id`)
    REFERENCES `users` (`id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE
);

LOCK TABLES `accounts` WRITE;
INSERT INTO `accounts` VALUES (1,'Основной',1,10500.00),(2,'Резервный',1,3412.57),(3,'Основной',2,20750.00),(4,'Основной',3,25000.00),(5,'Накопительный',2,5401.75);
UNLOCK TABLES;

SET foreign_key_checks = 1;
Таблицы
users
idname
1Иванов Иван Иванович
2Петров Петр Петрович
3Сидоров Сидор Сидорович
accounts
idtitleuser_idbalance
1Основной110500
2Резервный13412.57
3Основной220750
4Основной325000
5Накопительный25401.75

В MySQL 8, переменные могут быть использованы для хранения временных значений, которые могут быть использованы в рамках одного сеанса работы с базой данных. Они особенно полезны при написании сложных запросов или хранимых процедур, где требуется сохранить результаты промежуточных вычислений.

Важно отметить, что в MySQL 8 переменные не требуют объявления с помощью оператора DECLARE, как это было в предыдущих версиях. Вместо этого, переменные могут быть непосредственно инициализированы и использованы внутри запросов.

Давайте рассмотрим несколько примеров использования переменных.

Пример 1: Использование переменной для хранения значения из запроса

SET @total_count = (SELECT COUNT(*) FROM users);
SELECT @total_count;

В этом примере мы используем переменную @total_count для хранения значения общего количества записей в таблице users. Затем мы выводим значение переменной с помощью оператора SELECT. Обратите внимание, что символ @ используется для обозначения переменной.

Инфо

Переменные начинающиеся с символа @ являются локальными переменными и существуют в рамках текущей сессии (подключения к БД). Но также существуют глобальные переменные, начинающиеся с двух символов @@ — такие переменные используются как правило для конфигурации каких-либо параметров сервера БД (например @@global.transaction_isolation из прошлой темы)

Пример 2: Использование переменной в условии WHERE

SET @min_balance = 20000;
SELECT * FROM accounts WHERE balance >= @min_balance;

В этом примере мы используем переменную @min_balance для определения минимального значения баланса пользователей, по счетам которых мы хотим выбрать из таблицы accounts. Затем мы используем эту переменную в условии WHERE для фильтрации записей.

Пример 3: Использование переменной для хранения промежуточного значения

SET @users_count = (SELECT COUNT(*) FROM users);
SET @avg_balance = (SELECT AVG(balance) FROM accounts);
SELECT
  @users_count as 'Количество пользователей',
  @avg_balance as 'Средний баланс на счетах';

В этом примере мы используем переменные @users_count и @avg_balance для хранения общего количества записей в таблице users и среднего баланса на счетах из таблицы accounts соответственно. Затем мы выводим значения этих переменных с помощью оператора SELECT.

Пример 4: Использование переменной внутри транзакции

START TRANSACTION;

SET @money_amount = 5000;
SET @from_account = 1;
SET @to_account = 3;

SELECT balance as 'Баланс счёта с которого собрались переводить'
FROM accounts WHERE id = @from_account;
SELECT balance as 'Баланс счёта на который собрались переводить'
FROM accounts WHERE id = @to_account;

UPDATE accounts
SET balance = balance - @money_amount
WHERE id = @from_account;

UPDATE accounts
SET balance = balance + @money_amount
WHERE id = @to_account;

SELECT balance as 'Баланс счёта с которого перевели'
FROM accounts WHERE id = @from_account;
SELECT balance as 'Баланс счёта на который перевели'
FROM accounts WHERE id = @to_account;

-- Если результат устроил то
COMMIT;
-- Иначе — ROLLBACK;

В данном примере для упрощения структуры запросов, мы явно указали в переменной @money_amount сумму денег, которую собрались перевести со счета на счет, а также сами счета в переменных @from_account и @to_account соответственно.

Кроме того, значение переменной можно сразу задать при помощи команды SELECT:

SELECT
  id
INTO @max_balance_account_id
FROM accounts
ORDER BY balance DESC
LIMIT 1;

Здесь мы присвоили переменной @max_balance_account_id значение id счета на котором больше всего денег. Проверить присвоенное значение можно по аналогии:

SELECT @max_balance_account_id;

Таким образом, переменные в MySQL 8 предоставляют удобный способ хранения временных значений и использования их внутри запросов. Они позволяют более гибко работать с данными и выполнять сложные вычисления без необходимости создания дополнительных таблиц или структур данных.

Последнее обновление: 24.10.2025, 17:30
Предыдущая
МДК.11.01 - 15 - Расширенные транзакции
Следующая
МДК.11.01 - 17 - Введение в хранимые процедуры
© Кафедра информационных технологий ЧУВО «ВШП», 2025. Версия: 0.20.1
Материалы доступны в соответствии с лицензией: