МДК.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;
| id | name |
|---|---|
| 1 | Иванов Иван Иванович |
| 2 | Петров Петр Петрович |
| 3 | Сидоров Сидор Сидорович |
| id | title | user_id | balance |
|---|---|---|---|
| 1 | Основной | 1 | 10500 |
| 2 | Резервный | 1 | 3412.57 |
| 3 | Основной | 2 | 20750 |
| 4 | Основной | 3 | 25000 |
| 5 | Накопительный | 2 | 5401.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 предоставляют удобный способ хранения временных значений и использования их внутри запросов. Они позволяют более гибко работать с данными и выполнять сложные вычисления без необходимости создания дополнительных таблиц или структур данных.