# Змінні

Змінні в 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 для досягнення подібного результату. Ці методи дозволяють зберігати і працювати зі списками значень у запитах і процедурах.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://olexsyn.gitbook.io/enote/data/mysql/zminni.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
