Как объявить переменную в MySQL?


386

Как объявить переменную в MySQL, чтобы мой второй запрос мог ее использовать?

Я хотел бы написать что-то вроде:

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;

Не забывайте, что вам может потребоваться «Разрешить переменные пользователя = True».
Стив Смит

Ответы:


636

В MySQL есть в основном три типа переменных:

  1. Пользовательские переменные (с префиксом @):

    Вы можете получить доступ к любой пользовательской переменной без ее объявления или инициализации. Если вы ссылаетесь на переменную, которая не была инициализирована, она имеет значение NULLи тип строки.

    SELECT @var_any_var_name

    Вы можете инициализировать переменную используя оператор SETили SELECT:

    SET @start = 1, @finish = 10;    

    или

    SELECT @start := 1, @finish := 10;
    
    SELECT * FROM places WHERE place BETWEEN @start AND @finish;
    

    Пользовательским переменным может быть присвоено значение из ограниченного набора типов данных: целочисленное, десятичное, с плавающей запятой, двоичная или недвоичная строка или значение NULL.

    Пользовательские переменные зависят от сессии. То есть пользовательская переменная, определенная одним клиентом, не может быть просмотрена или использована другими клиентами.

    Их можно использовать в SELECTзапросах с использованием методов пользовательских переменных Advanced MySQL .

  2. Локальные переменные (без префикса):

    Локальные переменные должны быть объявлены с использованием DECLAREперед доступом к ним.

    Их можно использовать как локальные переменные и входные параметры внутри хранимой процедуры:

    DELIMITER //
    
    CREATE PROCEDURE sp_test(var1 INT) 
    BEGIN   
        DECLARE start  INT unsigned DEFAULT 1;  
        DECLARE finish INT unsigned DEFAULT 10;
    
        SELECT  var1, start, finish;
    
        SELECT * FROM places WHERE place BETWEEN start AND finish; 
    END; //
    
    DELIMITER ;
    
    CALL sp_test(5);
    

    Если DEFAULTпредложение отсутствует, начальное значение равно NULL.

    Область действия локальной переменной - это BEGIN ... ENDблок, в котором она объявлена.

  3. Системные переменные сервера (с префиксом @@):

    Сервер 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;
    

3
Почему-то =оператор не работает для меня. Он работал нормально, когда я использовал :=оператор.
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;
...

3
В чем разница между =и :=?
Корай Тугай

2
Я предполагаю, что для mysql синтаксиса SELECT необходимо отделить значение = (comparation) от: = (asign)
bortunac

1
В некоторых случаях значения, оставленные в переменных, могут НЕ соответствовать последней возвращенной строке. Например, SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10кажется, что он оценивает присвоения переменных до того, как будет выполнен упорядочение, так что возвращаемое значение @var может даже не относиться ни к одной из возвращаемых строк. Однако в документах не говорится, при каких условиях это может произойти.
Doin


3

Различные типы переменных:

  • локальные переменные (без префикса @) строго типизированы и ограничены областью хранимой программы, в которой они объявлены. Обратите внимание, что в соответствии с документом DECLARE Syntax :

DECLARE разрешен только внутри составного оператора BEGIN ... END и должен находиться в его начале перед любыми другими операторами.

  • Пользовательские переменные (с префиксом @) свободно набираются и попадают в область сеанса. Обратите внимание, что они не нуждаются и не могут быть объявлены - просто используйте их напрямую.

Поэтому, если вы определяете хранимую программу и действительно хотите «локальную переменную», вам нужно будет удалить символ @ и убедиться, что ваш оператор DECLARE находится в начале блока вашей программы. В противном случае, чтобы использовать «пользовательскую переменную», отбросьте оператор DECLARE.

Кроме того, вам нужно будет заключить запрос в круглые скобки, чтобы выполнить его как подзапрос:

SET @countTotal = (ВЫБЕРИТЕ СЧЕТЧИК (*) ОТ НГРАММ);

Или же вы можете использовать SELECT ... INTO:

ВЫБЕРИТЕ СЧЕТ (*) В @countTotal ОТ nGrams;


1

Для любого человека, использующего @variable в функции concat_ws для получения сцепленных значений, не забудьте переинициализировать его с пустым значением. В противном случае он может использовать старое значение для того же сеанса.

Set @Ids = '';

select 
  @Ids := concat_ws(',',@Ids,tbl.Id),
  tbl.Col1,
  ...
from mytable tbl;

0
  • Объявляет: SET @a = 1;

  • Применение: INSERT INTO `t` (`c`) VALUES (@a);


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.