6

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

9

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

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

SET start = 1;
SET finish = 10;

SELECT * FROM places WHERE place BETWEEN start AND finish;

Однако мой текущий подход не работает. Как правильно объявить переменные в MySQL, чтобы затем использовать их в SQL-запросе?

5 ответ(ов)

0

В SQL существуют два способа присваивания значений переменным с использованием оператора SET:

SET @var_name = value;     /* или */     SET @var_name := value;

Оба оператора = и := допустимы.


Для получения значения из таблицы используется оператор SELECT:

SELECT col1, @var_name := col2 FROM tb_name WHERE "condition";

Если будет найдено несколько записей, только последнее значение из col2 будет сохранено (перезаписано).

Также можно использовать конструкцию SELECT ... INTO:

SELECT col1, col2 INTO @var_name, col3 FROM ...

В данном случае результат запроса не будет содержать значения col2.


Пример использования обоих методов:

-- TRIGGER_BEFORE_INSERT --- установка значения столбца на основе расчетов

...
SELECT count(*) INTO @NR FROM a_table WHERE a_condition;
SET NEW.ord_col = IFNULL(@NR, 0) + 1;
...

В этом примере сначала считается количество записей, удовлетворяющих условию, и результат присваивается переменной @NR. Затем значению нового столбца ord_col присваивается значение, равное @NR (если @NR равно NULL, то добавляется 0).

0

В вашем вопросе вы хотите узнать, когда следует использовать SET, а когда SELECT для присвоения значения переменной в MySQL.

Вот некоторые ключевые моменты:

  1. SET: Эта команда используется для инициализации переменных и присвоения значения. Используйте ее, когда вам нужно задать значение переменной напрямую.

    SET @counter := 100;
    
  2. SELECT: С помощью этой команды вы можете присваивать значение переменной, получая его из результатов запроса. Это особенно полезно, когда вы хотите извлечь данные из таблицы.

    SELECT @price := MAX(product.price)
    FROM product;
    

В общем, если вы получаете значение из запроса, используйте SELECT, а если хотите просто инициализировать переменную, то используйте SET. Обе команды работают, но использование SELECT позволяет извлекать данные из таблиц, тогда как SET — это более простой способ задания значений.

0

Чтобы объявить переменную в SQL, вы можете использовать синтаксис, похожий на следующий:

SET @a = 1;

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

INSERT INTO `t` (`c`) VALUES (@a);

Таким образом, значение переменной @a, равное 1, будет вставлено в таблицу t.

0

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

SET @Ids = '';

SELECT 
  @Ids := CONCAT_WS(',', @Ids, tbl.Id),
  tbl.Col1,
  ...
FROM mytable tbl;

Если вы не переинициализируете переменную перед использованием, вы можете получить неожиданные результаты, так как @Ids будет содержать значение из предыдущего вызова.

0

Вот мой ответ на ваш вопрос. Я хотел бы поделиться простым решением для MySQL, которое, на мой взгляд, легче понять:

SET @countVal = (SELECT COUNT(*) FROM STATION);
/**
499/2 = 249.5 -> 250 -- ceil
499/2 = 249.5 + 1 = 250.5 -- floor 250

500/2 = 250 -- ceil 250
       = 250 + 1 = 251 -- floor 251
**/
SET @ceilVal = CEIL(@countVal / 2);
SET @floorVal = FLOOR((@countVal / 2) + 1);

SELECT ROUND(AVG(latitude), 4) FROM
(SELECT @lineNum := @lineNum + 1 AS id, 
        lat_n AS latitude
 FROM STATION s, (SELECT @lineNum := 0) pivot
 ORDER BY lat_n) AS a
WHERE id IN (@ceilVal, @floorVal);

Эта последовательность запросов сначала вычисляет общее количество строк в таблице STATION, после чего вычисляет значения для округления вверх и вниз. В последнем запросе делается выборка средних значений (latitude), используя вычисленные индексы. Если у вас возникнут вопросы по этому коду, не стесняйтесь задавать их!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь