
В SQL переменные позволяют хранить временные данные внутри сеанса выполнения запросов и процедур. Их использование особенно важно при работе с динамическими запросами, условной логикой и циклическими операциями. Присвоение значения переменной зависит от конкретного диалекта SQL: в T-SQL используется ключевое слово SET, а в PL/SQL – оператор :=.
В T-SQL переменная объявляется с помощью DECLARE, после чего ей можно присвоить значение напрямую: DECLARE @count INT; SET @count = 10;. Альтернатива – присвоение через SELECT: SELECT @count = COUNT(*) FROM Orders;, что позволяет сразу инициализировать переменную результатом запроса.
В PL/SQL переменные объявляются в блоке DECLARE и присваиваются через :=. Например: v_total NUMBER; v_total := 500;. Такой подход обеспечивает строгую типизацию и предотвращает ошибки несоответствия типов.
Использование переменных также ускоряет выполнение повторяющихся операций. Вместо многократного обращения к таблице можно сохранить результат в переменной и использовать его в нескольких выражениях. Важно контролировать область видимости переменной: локальные переменные действуют только внутри блока, в котором объявлены, а глобальные могут использоваться в нескольких процедурах.
Создание переменной в SQL Server

В SQL Server переменные создаются с помощью оператора DECLARE. Синтаксис: DECLARE @Имя_Переменной Тип_Данных [= Значение]. Имя переменной должно начинаться с символа @. Тип данных указывается точно так же, как для столбцов таблиц: INT, VARCHAR(50), DATETIME и др.
Пример создания переменной с явным присвоением значения:
DECLARE @Counter INT = 10;
Здесь создается целочисленная переменная @Counter и сразу присваивается значение 10.
Переменные можно создавать без начального значения:
DECLARE @UserName VARCHAR(50);
Присвоение значения выполняется отдельно с помощью SET или в контексте SELECT:
SET @UserName = 'Admin';
или
SELECT @UserName = Name FROM Users WHERE Id = 1;
При объявлении нескольких переменных допускается разделять их запятыми:
DECLARE @Id INT, @DateCreated DATETIME = GETDATE();
Это создает переменные @Id без значения и @DateCreated с текущей датой и временем.
Для строковых переменных важно указывать максимальную длину:
DECLARE @Description NVARCHAR(200);
Если длина не указана, SQL Server использует 1 символ для CHAR и 1 для VARCHAR, что может привести к усечению данных.
Переменные существуют только в пределах текущей сессии или блока BEGIN...END. После завершения выполнения они автоматически удаляются.
Использование оператора SET для присвоения значения
Оператор SET используется для присвоения значения переменной в SQL Server. Синтаксис простой: SET @имя_переменной = выражение. Переменная должна быть объявлена через DECLARE перед использованием.
Пример присвоения числового значения:
DECLARE @count INT;
SET @count = 10;
Можно присвоить результат запроса, если он возвращает одно значение:
DECLARE @maxPrice DECIMAL(10,2);
SET @maxPrice = (SELECT MAX(Price) FROM Products);
Для строковых значений важно учитывать длину переменной:
DECLARE @name NVARCHAR(50);
SET @name = 'Продукт A';
SET поддерживает присвоение одного значения за раз. Для одновременного присвоения нескольких переменных рекомендуется использовать отдельные инструкции SET или оператор SELECT.
Если выражение возвращает NULL, переменная получает значение NULL. Это следует учитывать при последующих вычислениях, чтобы избежать неожиданных ошибок.
Присвоение значения через SELECT

DECLARE @value INT;
SELECT @value = column_name FROM table_name WHERE id = 1;
Если запрос возвращает несколько строк, переменная получит значение из последней строки. Для контроля используйте TOP 1 и ORDER BY:
SELECT TOP 1 @value = column_name FROM table_name ORDER BY created_at DESC;
Для MySQL присвоение переменной через SELECT выполняется через оператор SET или напрямую в SELECT с использованием @variable :=:
SET @value := (SELECT column_name FROM table_name WHERE id = 1);
Присвоение нескольких переменных одновременно:
SELECT @var1 = column1, @var2 = column2 FROM table_name WHERE id = 10;
Агрегатные функции можно использовать напрямую при присвоении:
SELECT @max_value = MAX(column_name) FROM table_name;
Совместимость типов переменной и выражения обязательна, иначе возникает ошибка преобразования. Такой метод позволяет использовать полученные значения в последующих запросах без повторного обращения к таблице.
Присвоение значения с вычислением выражений
В SQL переменные могут получать значения не только напрямую, но и через вычисление выражений. Это позволяет выполнять арифметические операции, конкатенацию строк или использование функций базы данных при присвоении.
Пример присвоения результата арифметического выражения:
DECLARE @totalPrice DECIMAL(10,2);
SET @totalPrice = @unitPrice * @quantity;
Можно использовать функции SQL для преобразований и вычислений. Например, вычисление даты окончания акции:
DECLARE @endDate DATE;
SET @endDate = DATEADD(DAY, 30, GETDATE());
Для строк допустимо использовать конкатенацию:
DECLARE @fullName NVARCHAR(100);
SET @fullName = @firstName + ' ' + @lastName;
Вычисления могут включать агрегатные функции при использовании переменных в блоке SELECT:
DECLARE @maxSalary DECIMAL(10,2);
SELECT @maxSalary = MAX(Salary) FROM Employees;
Присвоение значений с выражениями удобно комбинировать с условными операторами:
DECLARE @bonus DECIMAL(10,2);
SET @bonus = CASE WHEN @yearsWorked > 5 THEN @salary * 0.1 ELSE 0 END;
| Тип выражения | Пример | Результат |
|---|---|---|
| Арифметическое | SET @total = @a + @b | Сумма двух переменных |
| Строковое | SET @fullName = @first + ‘ ‘ + @last | Объединение имени и фамилии |
| Дата/время | SET @nextMonth = DATEADD(MONTH, 1, GETDATE()) | Дата через месяц от текущей |
| Условное | SET @status = CASE WHEN @score >= 50 THEN ‘Pass’ ELSE ‘Fail’ END | Присвоение значения по условию |
Работа с переменными в хранимых процедурах
В хранимых процедурах SQL переменные позволяют временно хранить данные и использовать их для вычислений или условий. Объявление переменной выполняется с помощью ключевого слова DECLARE. Пример:
DECLARE @TotalAmount INT;
Присвоение значения переменной может происходить через SET или SELECT:
SET @TotalAmount = 100;– присваивает конкретное значение.SELECT SUM(Price) INTO @TotalAmount FROM Orders;– сохраняет результат запроса в переменную.
Переменные внутри процедуры имеют локальную область видимости и доступны только в пределах этой процедуры. Использование переменных позволяет:
- Сохранять промежуточные результаты сложных вычислений.
- Передавать значения между блоками
IF,WHILEи другими конструкциями. - Упрощать динамическое формирование запросов через переменные строкового типа.
Пример использования переменной в условии:
DECLARE @CountOrders INT;
SELECT @CountOrders = COUNT(*) FROM Orders WHERE CustomerID = 1;
IF @CountOrders > 10
PRINT 'Активный клиент';
Для эффективной работы с переменными рекомендуется:
- Объявлять переменные максимально близко к месту использования.
- Использовать явное присвоение через
SETдля предотвращения неоднозначностей. - Не использовать переменные для хранения больших объемов данных – лучше применять временные таблицы.
Использование переменных в циклах и условиях

Переменные в SQL позволяют контролировать логику выполнения в циклах и условиях. Объявление происходит через DECLARE, присвоение через SET или сразу при объявлении: DECLARE @counter INT = 0;
Для повторяющихся операций используется цикл WHILE. Переменная может быть счетчиком или условием завершения. Пример: WHILE @counter < 5 BEGIN SET @counter = @counter + 1; INSERT INTO LogTable(Value) VALUES(@counter); END. Здесь переменная @counter управляет количеством итераций и сохраняет значение между проходами.
Условные конструкции IF…ELSE используют переменные для проверки значений и направления выполнения. Пример: IF @balance < 0 BEGIN UPDATE Accounts SET Status = 'Overdrawn' WHERE AccountID = @accountID END ELSE BEGIN PRINT 'Баланс в норме' END. Это исключает дублирование кода и позволяет гибко реагировать на данные.
Переменные можно применять внутри циклов для накопления и вычислений. Пример суммирования: DECLARE @sum INT = 0; DECLARE @amount INT; DECLARE cur CURSOR FOR SELECT Amount FROM Transactions; OPEN cur; FETCH NEXT FROM cur INTO @amount; WHILE @@FETCH_STATUS = 0 BEGIN SET @sum = @sum + @amount; FETCH NEXT FROM cur INTO @amount; END; CLOSE cur; DEALLOCATE cur;. Переменная @sum аккумулирует результат прохода по всем строкам.
Область видимости переменных ограничена текущим блоком или процедурой. Для повторного использования в разных блоках применяются параметры процедур или функций.
Присвоение значения переменной из подзапроса

DECLARE @TotalOrders INT;
SELECT @TotalOrders = COUNT(*)
FROM Orders
WHERE OrderDate >= '2025-01-01';
Подзапрос может возвращать одно значение, агрегат или конкретное поле. Если подзапрос возвращает несколько строк, SQL выдаст ошибку, поэтому необходимо гарантировать уникальность результата или использовать агрегатные функции, такие как MAX, MIN, SUM.
Для MySQL переменные задаются через SET или SELECT INTO:
SET @MaxPrice = (SELECT MAX(Price) FROM Products);
или
SELECT MAX(Price) INTO @MaxPrice FROM Products;
Важно учитывать тип данных переменной и совместимость с типом результата подзапроса. Несовпадение типов может привести к ошибке или неявному преобразованию, что повлияет на точность вычислений.
Для подзапросов с несколькими условиями рекомендуется явно ограничивать строки через TOP 1 или LIMIT 1, чтобы избежать ошибок присвоения и непредсказуемых значений.
Использование переменных из подзапроса удобно для хранения промежуточных вычислений и передачи данных между блоками запросов без создания временных таблиц.
1. Использование оператора SELECT:
- В SQL Server:
DECLARE @myVar INT = 10; SELECT @myVar; - В PostgreSQL:
DO $$ DECLARE myVar INT := 10; BEGIN RAISE NOTICE 'Value: %', myVar; END $$; - В MySQL:
SET @myVar = 10; SELECT @myVar;
2. Проверка типа данных:
- SQL Server:
SELECT SQL_VARIANT_PROPERTY(@myVar, 'BaseType') AS DataType; - PostgreSQL:
SELECT pg_typeof(myVar);
DECLARE @a INT = 5, @b NVARCHAR(20) = 'Test';
SELECT @a AS A, @b AS B;
4. Использование в условных выражениях для проверки содержимого:
IF @myVar IS NULL
PRINT 'Переменная пустая';
ELSE
PRINT 'Значение: ' + CAST(@myVar AS NVARCHAR(50));
Практика регулярной проверки значений переменных позволяет быстрее выявлять ошибки в логике скриптов и избегать неожиданных результатов при выполнении сложных запросов.
Вопрос-ответ:
Как объявить и присвоить значение переменной в SQL Server?
В SQL Server для объявления переменной используется ключевое слово DECLARE. После объявления переменной можно присвоить ей значение с помощью SET или в момент объявления. Например: DECLARE @myVar INT; SET @myVar = 10; или DECLARE @myVar INT = 10;. Переменные в SQL Server начинаются с символа @ и могут использоваться для хранения различных типов данных, таких как числа, строки или даты.
Можно ли присвоить значение переменной результатом запроса?
Да, переменной можно присвоить значение, которое возвращает запрос. Для этого в SQL Server используется конструкция SELECT @var = колонка FROM таблица WHERE условие;. Например, если нужно сохранить количество записей в таблице, можно написать: DECLARE @count INT; SELECT @count = COUNT(*) FROM Orders;. Переменная получит значение, вычисленное запросом, и его можно использовать дальше в скрипте.
Чем отличается присвоение через SET и SELECT?
Оба метода присваивания значений переменным работают, но есть различия. SET используется для присвоения одного значения и считается стандартным методом, который строго проверяет тип данных. SELECT может присваивать несколько переменных одновременно и позволяет присваивать результат запроса. Однако если запрос возвращает несколько строк, SELECT присвоит переменной значение только первой строки, что может привести к неожиданным результатам.
Как присвоить значение переменной в MySQL?
В MySQL для пользовательских переменных используется символ @ без объявления типа. Значение переменной присваивается через SET или напрямую в SELECT. Например: SET @myVar = 5; или SELECT COUNT(*) INTO @myVar FROM Orders;. Важно, что такие переменные существуют только в текущей сессии и могут использоваться для передачи значений между запросами.
Можно ли изменить значение переменной несколько раз в одном скрипте?
Да, переменные можно изменять несколько раз в рамках одного скрипта. После того как переменная объявлена, ей можно присвоить новое значение в любой момент. Например: DECLARE @x INT = 1; SET @x = 5; SET @x = @x + 10;. Это полезно, когда требуется хранить промежуточные результаты вычислений или накапливать данные в ходе выполнения запроса.
