> For the complete documentation index, see [llms.txt](https://olexsyn.gitbook.io/enote/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://olexsyn.gitbook.io/enote/data/mysql/zminni.md).

# Змінні

Змінні в MySQL використовуються для зберігання значень, які можуть бути використані в SQL-запитах. Вони бувають різних типів і виконують різні функції. Основні види змінних у MySQL включають користувацькі змінні, змінні сесії, змінні системи та змінні стану.

#### Користувацькі змінні

Користувацькі змінні оголошуються та використовуються в межах сесії. Вони починаються з символу @ і можуть бути використані для зберігання тимчасових значень.

**Приклад використання користувацьких змінних:**

```sql
SET @my_variable = 10;
SELECT @my_variable + 5;  -- Результат буде 15
```

#### Змінні сесії

Змінні сесії встановлюються та використовуються тільки в межах поточної сесії. Вони можуть бути змінені за допомогою команди `SET`.

**Приклад використання змінних сесії:**

```sql
SET SESSION max_connections = 200;
```

#### Системні змінні

Системні змінні контролюють роботу сервера MySQL. Вони можуть мати як глобальну, так і сесійну область видимості.

**Приклад використання системних змінних:**

```sql
SHOW VARIABLES LIKE 'max_connections';
SET GLOBAL max_connections = 500;
```

#### Змінні стану

Змінні стану використовуються для моніторингу роботи сервера MySQL. Вони надають інформацію про різні аспекти роботи сервера, такі як кількість запитів, статус підключень тощо.

**Приклад використання змінних стану:**

```sql
SHOW STATUS LIKE 'Threads_connected';
```

#### Декларація та присвоєння значень

**Декларація користувацьких змінних:**

```sql
SET @variable_name = value;
```

**Використання змінних у запитах:**

```sql
SET @a = 10;
SET @b = 20;
SELECT @a + @b;  -- Результат буде 30
```

**Використання змінних в процедурах:**

```sql
DELIMITER //
CREATE PROCEDURE simpleProcedure()
BEGIN
  DECLARE x INT;
  SET x = 10;
  SELECT x;
END //
DELIMITER ;
CALL simpleProcedure();
```

#### Висновок

Змінні в MySQL є потужним інструментом для зберігання і маніпулювання даними всередині SQL-запитів та процедур. Вони допомагають зробити код більш гнучким та зручним для підтримки. Змінні бувають різних типів і кожен з них має свої специфічні особливості і області використання.

## Чи можна користувацькій змінній привласнити значення запиту?

Так, користувацькій змінній у MySQL можна привласнити значення запиту. Це дозволяє зберегти результат виконання запиту в змінній для подальшого використання в інших запитах. Для цього можна використовувати команди `SELECT INTO` або присвоювати значення безпосередньо в операторі `SELECT`.

#### Використання `SELECT INTO`

Команда `SELECT INTO` дозволяє вибирати значення з таблиці та зберігати їх у змінній.

**Приклад:**

```sql
SET @my_variable = 0;
SELECT column_name INTO @my_variable
FROM table_name
WHERE condition;
```

#### Пряме присвоєння значення в `SELECT`

Іншим способом є використання `SELECT` для прямого присвоєння значення змінній:

**Приклад:**

```sql
SELECT @my_variable := column_name
FROM table_name
WHERE condition;
```

#### Приклади використання

**Присвоєння значення однієї змінної:**

```sql
SET @total := 0;
SELECT @total := COUNT(*)
FROM employees
WHERE department_id = 1;

SELECT @total;  -- Повертає кількість працівників у відділі з ID 1
```

**Використання в складених запитах:**

```sql
SET @average_salary := 0;
SELECT @average_salary := AVG(salary)
FROM employees
WHERE department_id = 1;

SELECT name, salary
FROM employees
WHERE department_id = 1
AND salary > @average_salary;
```

У наведених прикладах спочатку присвоюється значення змінній за допомогою запиту, а потім ця змінна використовується в іншому запиті. Це дозволяє ефективно використовувати результати попередніх запитів для фільтрації або обчислень в наступних запитах.

#### Використання в процедурах

Користувацькі змінні також можуть використовуватись у збережених процедурах для зберігання результатів запитів і виконання подальших обчислень або умовних операцій.

**Приклад збереженої процедури:**

```sql
DELIMITER //
CREATE PROCEDURE calculateTotalSales(IN department INT, OUT totalSales DECIMAL(10,2))
BEGIN
  SELECT SUM(sales) INTO totalSales
  FROM sales_table
  WHERE department_id = department;
END //
DELIMITER ;

CALL calculateTotalSales(1, @sales);
SELECT @sales;  -- Повертає загальну суму продажів для відділу з ID 1
```

У цьому прикладі збережена процедура `calculateTotalSales` обчислює загальну суму продажів для певного відділу і зберігає результат у змінній `@sales`.

## Користувацькі змінні можуть мати значення списку?

У MySQL користувацькі змінні не можуть безпосередньо зберігати значення списку, оскільки вони призначені для зберігання лише одного значення. Проте, ви можете використовувати декілька підходів для роботи зі списками значень.

#### 1. Використання розділених рядків

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

**Приклад:**

```sql
SET @list = '1,2,3,4,5';

-- Розбиття рядка на окремі значення можна виконати за допомогою спеціальної функції або збереженої процедури
```

```sql
SET @aids = (SELECT GROUP_CONCAT(DISTINCT aid) FROM au LIMIT 10);
```

`GROUP_CONCAT` - записує значення стовчика aid [як строку з комами](/enote/data/mysql/functions/group_concat.md), але LIMIT тут не діє - вибираються усі значення таблиці

#### 2. Використання тимчасових таблиць

Ви можете зберігати список значень у тимчасовій таблиці і працювати з цією таблицею у своїх запитах.

**Приклад:**

```sql
CREATE TEMPORARY TABLE temp_table (value INT);

INSERT INTO temp_table (value) VALUES (1), (2), (3), (4), (5);

-- Використання тимчасової таблиці у запитах
SELECT * FROM temp_table;
```

#### 3. Збереження результатів множинного запиту у користувацьку змінну

Ви можете зберігати результат множинного запиту у користувацьку змінну у вигляді рядка, використовуючи групові функції.

**Приклад:**

```sql
SET @list = (SELECT GROUP_CONCAT(id) FROM table_name WHERE condition);

SELECT @list;  -- Результат буде рядок, де всі id розділені комами
```

#### 4. Робота з JSON

У новіших версіях MySQL (5.7 і новіше) ви можете зберігати значення списку у форматі JSON і використовувати вбудовані функції для роботи з JSON-даними.

**Приклад:**

```sql
SET @json_list = JSON_ARRAY(1, 2, 3, 4, 5);

-- Використання функцій JSON
SELECT JSON_EXTRACT(@json_list, '$[0]');  -- Повертає перший елемент у списку (1)
```

#### Висновок

Хоча користувацькі змінні в MySQL не можуть безпосередньо зберігати списки значень у вигляді масивів або інших складних структур, можна використовувати рядки, тимчасові таблиці або формат JSON для досягнення подібного результату. Ці методи дозволяють зберігати і працювати зі списками значень у запитах і процедурах.
