User Variables
--------------
MySQL supports thread-specific variables with the `@variablename'
syntax. A variable name may consist of alphanumeric characters from
the current character set and also `_', `$', and `.' . The default
character set is ISO-8859-1 Latin1; this may be changed with the
`--default-character-set' option to `mysqld'. Note:Character sets.
Variables don't have to be initialized. They contain `NULL' by default
and can store an integer, real, or string value. All variables for a
thread are automatically freed when the thread exits.
You can set a variable with the `SET' syntax:
SET @variable= { integer expression | real expression | string expression }
[,@variable= ...].
You can also set a variable in an expression with the `@variable:=expr'
syntax:
select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+----------------------+------+------+------+
| 5 | 5 | 1 | 4 |
+----------------------+------+------+------+
(We had to use the `:=' syntax here, because `=' was reserved for
comparisons.)
User variables may be used where expressions are allowed. Note that
this does not currently include use in contexts where a number is
explicitly required, such as in the `LIMIT' clause of a `SELECT'
statement, or the `IGNORE number LINES' clause of a `LOAD DATA'
statement.
*NOTE:* In a `SELECT' statement, each expression is only evaluated
when it's sent to the client. This means that in the `HAVING', `GROUP
BY', or `ORDER BY' clause, you can't refer to an expression that
involves variables that are set in the `SELECT' part. For example, the
following statement will NOT work as expected:
SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;
The reason is that `@aa' will not contain the value of the current row,
but the value of `id' for the previous accepted row.