Прописывая код для исполнения различного рода задач в MySQL у нас есть возможность определять локальные переменные.
До присвоения им какого-либо значения переменные не будут пустыми, в них будет специальное значение NULL. Они могут хранить в себе строковые величины и числа (целые и вещественные).
Локальные переменные не нужно предварительно создавать каким-либо особым образом, что достаточно удобно. Просто после запуска процесса, все переменные, которые были в нем объявлены, будут автоматически активированы.
Синтаксис
Имя такой переменной начинается с символа «@», далее идет непосредственно ее обозначение, к примеру: @simple.
Для составления имени разрешено использовать цифры, буквы (поддерживаемые сервером), символы «_», «$», «.». Они могут использоваться в любом порядке.
Стандартно для кодирования имен локальных переменных используется стандарт ISO-8859-1 Latin1. Если нас в такой расстановке вещей что-то не устраивает, то есть возможность изменить ее в параметре : --default-character-set mysqld.
Объявление
Чаще всего объявляются они с помощью команды SET:
SET @simple = { integer expression | real expression | string expression } @simple = …]
Это не единственный способ их объявления. Мы можем использовать с этой целью ряд других команд. К примеру:
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; +----------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | +----------------------+------+------+------+ | 5 | 5 | 1 | 4 | +----------------------+------+------+------+
Обратите внимание!
В отличие от SET, при объявлении локальных переменных другими командами следует пользоваться оператором «:=» заместо «=». Это объясняется функционалом, который зарезервирован в MySQL за оператором «=» - в первую очередь это сравнение величин, а не присваивание им значения.
Область применения локальных переменных
Мы не можем использовать данный вид переменных если контекст кода явно требует использования чилсла. К примеру:
- При наличии LIMIT-а внутри SELECT
- При наличии IGNORE number LINES внутри LOAD DATA
Также стоит обратить внимание, что используются они исключительно внутри выражений или же там, где наличие выражения уместно.
Осторожно, возможны ошибки!
При использовании локалок внутри SELECT-а существуют подводные камни, причина появления которых связана с тем, что выражения внутри селекта оцениваются во время отправки клиенту.
Так,использование HAVING, GROUP BY или ORDER BY приведет к ошибке, если мы сошлемся в них на выражения из части содержащейся в команде SELECT, поскольку переменные из селекта попросту не будут содержать информации, которая должна быть в них.
К примеру в строке кода приведенной ниже @aa ничего не содержит, в то время как id уже является строкой.
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;