Как объявить переменную в MySQL?
Как объявить переменные в MySQL, чтобы второй запрос мог их использовать?
Я хотел бы написать что-то вроде:
SET start = 1;
SET finish = 10;
SELECT * FROM places WHERE place BETWEEN start AND finish;
Однако мой текущий подход не работает. Как правильно объявить переменные в MySQL, чтобы затем использовать их в SQL-запросе?
5 ответ(ов)
В 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).
В вашем вопросе вы хотите узнать, когда следует использовать SET
, а когда SELECT
для присвоения значения переменной в MySQL.
Вот некоторые ключевые моменты:
SET: Эта команда используется для инициализации переменных и присвоения значения. Используйте ее, когда вам нужно задать значение переменной напрямую.
SET @counter := 100;
SELECT: С помощью этой команды вы можете присваивать значение переменной, получая его из результатов запроса. Это особенно полезно, когда вы хотите извлечь данные из таблицы.
SELECT @price := MAX(product.price) FROM product;
В общем, если вы получаете значение из запроса, используйте SELECT
, а если хотите просто инициализировать переменную, то используйте SET
. Обе команды работают, но использование SELECT
позволяет извлекать данные из таблиц, тогда как SET
— это более простой способ задания значений.
Чтобы объявить переменную в SQL, вы можете использовать синтаксис, похожий на следующий:
SET @a = 1;
После того как вы объявите переменную, вы сможете использовать её в своих запросах. Например, для вставки значения в таблицу t
в столбец c
вы можете выполнить следующий запрос:
INSERT INTO `t` (`c`) VALUES (@a);
Таким образом, значение переменной @a
, равное 1, будет вставлено в таблицу t
.
При использовании переменной @variable
в функции concat_ws
для получения конкатенированных значений не забудьте переинициализировать её с пустым значением. В противном случае она может использовать старое значение в пределах одной сессии.
SET @Ids = '';
SELECT
@Ids := CONCAT_WS(',', @Ids, tbl.Id),
tbl.Col1,
...
FROM mytable tbl;
Если вы не переинициализируете переменную перед использованием, вы можете получить неожиданные результаты, так как @Ids
будет содержать значение из предыдущего вызова.
Вот мой ответ на ваш вопрос. Я хотел бы поделиться простым решением для 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), используя вычисленные индексы. Если у вас возникнут вопросы по этому коду, не стесняйтесь задавать их!
SQL: выбрать только строки с максимальным значением в столбце
Когда использовать одинарные кавычки, двойные кавычки и обратные кавычки в MySQL
Как временно отключить ограничение внешнего ключа в MySQL?
Как восстановить дамп-файл из mysqldump?
Удаление с использованием JOIN в MySQL