Как объявить переменную в MySQL, чтобы мой второй запрос мог ее использовать?
Я хотел бы написать что-то вроде:
SET start = 1;
SET finish = 10;
SELECT * FROM places WHERE place BETWEEN start AND finish;
Как объявить переменную в MySQL, чтобы мой второй запрос мог ее использовать?
Я хотел бы написать что-то вроде:
SET start = 1;
SET finish = 10;
SELECT * FROM places WHERE place BETWEEN start AND finish;
Ответы:
В MySQL есть в основном три типа переменных:
Пользовательские переменные (с префиксом @
):
Вы можете получить доступ к любой пользовательской переменной без ее объявления или инициализации. Если вы ссылаетесь на переменную, которая не была инициализирована, она имеет значение 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 .
Локальные переменные (без префикса):
Локальные переменные должны быть объявлены с использованием 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
блок, в котором она объявлена.
Системные переменные сервера (с префиксом @@
):
Сервер 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;
=
оператор не работает для меня. Он работал нормально, когда я использовал :=
оператор.
=
Оператор работает только в SET
пункте. Для присвоения значения переменной в SELECT
запросе вы можете использовать :=
оператор, напримерSELECT @start := 1
НАБОР
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;
...
=
и :=
?
SELECT DISTINCT IFNULL(@var:=Name,'unknown') FROM Customers ORDER BY <some non-indexed expression> LIMIT 10
кажется, что он оценивает присвоения переменных до того, как будет выполнен упорядочение, так что возвращаемое значение @var может даже не относиться ни к одной из возвращаемых строк. Однако в документах не говорится, при каких условиях это может произойти.
Используйте набор или выберите
SET @counter := 100;
SELECT @variable_name := value;
пример :
SELECT @price := MAX(product.price)
FROM product
Различные типы переменных:
DECLARE разрешен только внутри составного оператора BEGIN ... END и должен находиться в его начале перед любыми другими операторами.
Поэтому, если вы определяете хранимую программу и действительно хотите «локальную переменную», вам нужно будет удалить символ @ и убедиться, что ваш оператор DECLARE находится в начале блока вашей программы. В противном случае, чтобы использовать «пользовательскую переменную», отбросьте оператор DECLARE.
Кроме того, вам нужно будет заключить запрос в круглые скобки, чтобы выполнить его как подзапрос:
SET @countTotal = (ВЫБЕРИТЕ СЧЕТЧИК (*) ОТ НГРАММ);
Или же вы можете использовать SELECT ... INTO:
ВЫБЕРИТЕ СЧЕТ (*) В @countTotal ОТ nGrams;
Для любого человека, использующего @variable в функции concat_ws для получения сцепленных значений, не забудьте переинициализировать его с пустым значением. В противном случае он может использовать старое значение для того же сеанса.
Set @Ids = '';
select
@Ids := concat_ws(',',@Ids,tbl.Id),
tbl.Col1,
...
from mytable tbl;
declare Regione int;
set Regione=(select id from users
where id=1) ;
select Regione ;