Вы можете получить доступ к любой пользовательской переменной без ее объявления или инициализации. Если вы ссылаетесь на переменную, которая не была инициализирована, она имеет значение NULLи тип строки.
SELECT@var_any_var_name
Вы можете инициализировать переменную используя оператор SETили SELECT:
SET@start=1,@finish =10;
или
SELECT@start:=1,@finish :=10;SELECT*FROM places WHERE place BETWEEN@startAND@finish;
Пользовательским переменным может быть присвоено значение из ограниченного набора типов данных: целочисленное, десятичное, с плавающей запятой, двоичная или недвоичная строка или значение NULL.
Пользовательские переменные зависят от сессии. То есть пользовательская переменная, определенная одним клиентом, не может быть просмотрена или использована другими клиентами.
Сервер MySQL поддерживает множество системных переменных, настроенных на значение по умолчанию. Они могут быть типа GLOBAL, SESSIONили BOTH.
Глобальные переменные влияют на общую работу сервера, тогда как переменные сеанса влияют на его работу для отдельных клиентских подключений.
Чтобы увидеть текущие значения, используемые запущенным сервером, используйте SHOW VARIABLESоператор или SELECT @@var_name.
SHOW VARIABLES LIKE'%wait_timeout%';SELECT@@sort_buffer_size;
Они могут быть установлены при запуске сервера с помощью параметров в командной строке или в файле параметров. Большинство из них могут быть изменены динамически во время работы сервера с помощью SET GLOBALили SET SESSION:
-- Syntax to Set value to a Global variable:SET GLOBAL sort_buffer_size=1000000;SET@@global.sort_buffer_size=1000000;-- Syntax to Set value to a Session variable:SET sort_buffer_size=1000000;SET SESSION sort_buffer_size=1000000;SET@@sort_buffer_size=1000000;SET@@local.sort_buffer_size=10000;
Почему-то =оператор не работает для меня. Он работал нормально, когда я использовал :=оператор.
Divinedragon
24
=Оператор работает только в SETпункте. Для присвоения значения переменной в SELECTзапросе вы можете использовать :=оператор, напримерSELECT @start := 1
Omesh
2
Не могли бы вы уточнить, что это значит: «Нет необходимости объявлять пользовательские переменные сеанса, обозначенные префиксом @»?
Биллиноа,
3
@billynoah Я предполагаю, что это означает, что определяемые пользователем переменные сеанса (начинающиеся с @) не требуют явного объявления; Вы можете просто назначить их немедленно, как если бы они уже были объявлены.
jobo3208
2
И вы можете назначить переменную с результатом оператора select следующим образом: SET @subscriptionId = (выберите subscriptionId от пользователя, где emailAddress='ac@tmail.com ');
Пророки программного обеспечения
28
НАБОР
SET@var_name = value
ИЛИ
SET@var := value
оба оператора = и : = принимаются
ВЫБРАТЬ
SELECT col1,@var_name := col2 from tb_name WHERE"conditon";
если для нескольких наборов записей найдено только последнее значение в col2, это keep (override);
SELECT col1, col2 INTO@var_name, col3 FROM.....
в этом случае результат выбора не содержит значений col2
Ex оба метода использовали
- TRIGGER_BEFORE_INSERT --- установка значения столбца из расчетов
...SELECT count(*)INTO@NR FROM a_table WHERE a_condition;SET NEW.ord_col = IFNULL(@NR,0)+1;...
Я предполагаю, что для mysql синтаксиса SELECT необходимо отделить значение = (comparation) от: = (asign)
bortunac
1
В некоторых случаях значения, оставленные в переменных, могут НЕ соответствовать последней возвращенной строке. Например, SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10кажется, что он оценивает присвоения переменных до того, как будет выполнен упорядочение, так что возвращаемое значение @var может даже не относиться ни к одной из возвращаемых строк. Однако в документах не говорится, при каких условиях это может произойти.
локальные переменные (без префикса @) строго типизированы и ограничены областью хранимой программы, в которой они объявлены. Обратите внимание, что в соответствии с документом DECLARE Syntax :
DECLARE разрешен только внутри составного оператора BEGIN ... END и должен находиться в его начале перед любыми другими операторами.
Пользовательские переменные (с префиксом @) свободно набираются и попадают в область сеанса. Обратите внимание, что они не нуждаются и не могут быть объявлены - просто используйте их напрямую.
Поэтому, если вы определяете хранимую программу и действительно хотите «локальную переменную», вам нужно будет удалить символ @ и убедиться, что ваш оператор DECLARE находится в начале блока вашей программы. В противном случае, чтобы использовать «пользовательскую переменную», отбросьте оператор DECLARE.
Кроме того, вам нужно будет заключить запрос в круглые скобки, чтобы выполнить его как подзапрос:
SET @countTotal = (ВЫБЕРИТЕ СЧЕТЧИК (*) ОТ НГРАММ);
Для любого человека, использующего @variable в функции concat_ws для получения сцепленных значений, не забудьте переинициализировать его с пустым значением. В противном случае он может использовать старое значение для того же сеанса.
Ответы:
В MySQL есть в основном три типа переменных:
Пользовательские переменные (с префиксом
@
):Вы можете получить доступ к любой пользовательской переменной без ее объявления или инициализации. Если вы ссылаетесь на переменную, которая не была инициализирована, она имеет значение
NULL
и тип строки.Вы можете инициализировать переменную используя оператор
SET
илиSELECT
:или
Пользовательским переменным может быть присвоено значение из ограниченного набора типов данных: целочисленное, десятичное, с плавающей запятой, двоичная или недвоичная строка или значение NULL.
Пользовательские переменные зависят от сессии. То есть пользовательская переменная, определенная одним клиентом, не может быть просмотрена или использована другими клиентами.
Их можно использовать в
SELECT
запросах с использованием методов пользовательских переменных Advanced MySQL .Локальные переменные (без префикса):
Локальные переменные должны быть объявлены с использованием
DECLARE
перед доступом к ним.Их можно использовать как локальные переменные и входные параметры внутри хранимой процедуры:
Если
DEFAULT
предложение отсутствует, начальное значение равноNULL
.Область действия локальной переменной - это
BEGIN ... END
блок, в котором она объявлена.Системные переменные сервера (с префиксом
@@
):Сервер MySQL поддерживает множество системных переменных, настроенных на значение по умолчанию. Они могут быть типа
GLOBAL
,SESSION
илиBOTH
.Глобальные переменные влияют на общую работу сервера, тогда как переменные сеанса влияют на его работу для отдельных клиентских подключений.
Чтобы увидеть текущие значения, используемые запущенным сервером, используйте
SHOW VARIABLES
оператор илиSELECT @@var_name
.Они могут быть установлены при запуске сервера с помощью параметров в командной строке или в файле параметров. Большинство из них могут быть изменены динамически во время работы сервера с помощью
SET GLOBAL
илиSET SESSION
:источник
=
оператор не работает для меня. Он работал нормально, когда я использовал:=
оператор.=
Оператор работает только вSET
пункте. Для присвоения значения переменной вSELECT
запросе вы можете использовать:=
оператор, напримерSELECT @start := 1
ИЛИ
оба оператора = и : = принимаются
если для нескольких наборов записей найдено только последнее значение в col2, это keep (override);
в этом случае результат выбора не содержит значений col2
Ex оба метода использовали
- TRIGGER_BEFORE_INSERT --- установка значения столбца из расчетов
источник
=
и:=
?SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10
кажется, что он оценивает присвоения переменных до того, как будет выполнен упорядочение, так что возвращаемое значение @var может даже не относиться ни к одной из возвращаемых строк. Однако в документах не говорится, при каких условиях это может произойти.Используйте набор или выберите
пример :
источник
Различные типы переменных:
DECLARE разрешен только внутри составного оператора BEGIN ... END и должен находиться в его начале перед любыми другими операторами.
Поэтому, если вы определяете хранимую программу и действительно хотите «локальную переменную», вам нужно будет удалить символ @ и убедиться, что ваш оператор DECLARE находится в начале блока вашей программы. В противном случае, чтобы использовать «пользовательскую переменную», отбросьте оператор DECLARE.
Кроме того, вам нужно будет заключить запрос в круглые скобки, чтобы выполнить его как подзапрос:
Или же вы можете использовать SELECT ... INTO:
источник
Для любого человека, использующего @variable в функции concat_ws для получения сцепленных значений, не забудьте переинициализировать его с пустым значением. В противном случае он может использовать старое значение для того же сеанса.
источник
Объявляет:
SET @a = 1;
Применение:
INSERT INTO `t` (`c`) VALUES (@a);
источник
SET Value
источник