Buy this Reference Manual in softcover from Barnes & Noble!
Для конкретного процесса пользователь может определить локальные переменные, которые в MySQL обозначаются как @variablename
. Имя локальной переменной может состоять из буквенно-цифровых символов установленного в данное время алфавита и символов `_', `$', and `.'. Тип кодировки по умолчанию - ISO-8859-1 Latin1, он может быть изменен указанием иного типа в аргументе параметра --default-character-set
mysqld
(see section 4.6.1 Набор символов, применяющийся для записи данных и сортировки).
Локальные переменные не требуют инициализации. Они содержат значение NULL
по умолчанию; в них могут храниться целые числа, вещественные числа или строковые величины. При запуске конкретного процесса все объявленные в нем локальные переменные автоматически активизируются.
Локальную переменную можно объявить, используя синтаксис команды SET
:
SET @variable= { integer expression | real expression | string expression } [,@variable= ...].
Можно также определить значение переменной иным способом, без команды SET
. Однако в этом случае в качестве оператора присвоения более предпочтительно использовать оператор `:=', чем оператор `=', так как последний зарезервирован для сравнения выражений, не связанных с установкой переменных:
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; +----------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | +----------------------+------+------+------+ | 5 | 5 | 1 | 4 | +----------------------+------+------+------+
Введенные пользователем переменные могут применяться только в составе выражений и там, где выражения допустимы. Заметим, что в область их применения в данное время не включается контекст, в котором явно требуется число, например, условие LIMIT
в команде SELECT
или выражение IGNORE number LINES
в команде LOAD DATA
.
Примечание: в команде SELECT
каждое выражение оценивается только при отправлении клиенту. Это означает, что в условиях HAVING
, GROUP BY
, or ORDER BY
не следует ссылаться на выражение, содержащее переменные, которые введены в части SELECT
этой команды. Например, следующая команда НЕ будет выполняться так, как ожидалось:
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;
Причина в том, что переменная @aa
не будет содержать значения текущей строки, в то время как значение id
в предыдущем выражении является строкой.
Posted by on Friday May 17 2002, @6:24am | [Delete] [Edit] |
Be aware that the following does NOT work:
SET @TABLENAME="db";
SELECT * FROM @TABLENAME;
Posted by on Friday May 17 2002, @6:24am | [Delete] [Edit] |
Be warned that user variables also fail if they
are used in an aggregate function.
For example:
SELECT SUM(@myVal:=someDBfield * 2) AS field1,
SUM(@myVal * 2) AS field2 ...
will not return the answer that you are expecting!
Field2 will return with an incorrect value.
Posted by on Wednesday December 18 2002, @5:29pm | [Delete] [Edit] |
Would be it useful to add ability to store
lists
of values inside user variables, this could
then
be expanded within IN statements for example.
For example:
SELECT @list:=id FROM t1 WHERE ....
SELECT id FROM t2 WHERE id IN ( @list ) .....
Posted by Ted Farndon on Thursday October 31 2002, @11:03am | [Delete] [Edit] |
Re: User variables in aggregate functions... I was
able to use user variables in aggregate functions if I
submitted query twice in the same session / thread.
Perhaps this isn't the most stable method to use
user variables but for the moment it seems to work.
Only time and load will tell if this method holds up
reliably.
Add your own comment.