MySQLのユーザー定義変数とローカル変数の違いとは?使い方と初期化の挙動を徹底解説
MySQLでは、SQL文やストアドプロシージャの中で値を一時的に保持するための「変数」を利用できます。大きく分けてユーザー定義変数(セッション固有変数)とローカル変数の2種類があり、それぞれスコープや寿命、初期化のタイミングが異なります。本記事では、両者の違いと具体的な使い方をサンプルコード付きで解説します。
ユーザー定義変数(セッション固有変数)とは
ユーザー定義変数は、セッション内でのみ有効な緩く型付けされた変数です。セッション中の任意の場所で初期化でき、その値はセッションが終了するまで保持され続けます。
ユーザー定義変数は必ず記号 @ を接頭辞として付けます。
@anyVariableName;
ユーザー定義変数の初期化方法
ユーザー定義変数を初期化する方法は2つあります。1つ目は SET コマンドを使う方法です。
SET @anyVariableName = anyValue;
2つ目は SELECT 文で代入演算子 := を使う方法です。
SELECT @anyVariableName := anyValue;
注意:コロンのない「=」は比較演算になる
SELECT 文で代入時にコロン(:)を省略すると、「=」は代入ではなく比較式として評価されます。結果は真(1)か偽(0)のいずれかになります。
mysql> select @m=10;
実行結果:
+-------+ | @m=10 | +-------+ | 1 | +-------+ 1 row in set (0.00 sec)
この例では @m の値が10であるため、比較結果として「1(真)」が返されています。
ローカル変数とは
ローカル変数は、ストアドプロシージャやストアドファンクションなどの内部でのみ使用できる変数です。DECLARE キーワードを使って宣言し、ユーザー定義変数のような @ 接頭辞は必要ありません。
宣言の構文は以下のとおりです。
DECLARE yourVariableName データ型;
ユーザー定義変数とローカル変数の主な違い
- 初期化のタイミング:ローカル変数はストアドプロシージャが呼び出されるたびにNULL値(または指定したデフォルト値)で再初期化されます。一方、ユーザー定義変数は呼び出しのたびに再初期化されず、セッション中は値が保持されます。
- 可視性:あるユーザーが設定したユーザー定義変数は、他のユーザーからは見えません。
- 寿命:ユーザーのセッション変数は、そのユーザーが接続を切断した時点で自動的に破棄されます。
ストアドプロシージャで動作を確認するデモ
ここからは、実際にストアドプロシージャを作成して、両者の挙動の違いを確認してみましょう。ローカル変数とユーザー定義変数の両方を使用するストアドプロシージャを作成するクエリは以下のとおりです。
mysql> DELIMITER //
mysql> CREATE PROCEDURE sp_LocalAndUserDefinedVariableDemo()
-> BEGIN
-> DECLARE localVariable int default 10;
-> SET localVariable = localVariable + 10;
-> SET @userVariable = @userVariable + 10;
-> SELECT localVariable;
-> SELECT @userVariable;
-> END;
-> //
Query OK, 0 rows affected (0.39 sec)
mysql> DELIMITER ;このプロシージャでは、ローカル変数 localVariable をデフォルト値10で宣言し、ユーザー定義変数 @userVariable とともにそれぞれ10を加算しています。
1回目の呼び出し
まず、ユーザー定義変数に初期値を設定します。
mysql> SET @userVariable = 10; Query OK, 0 rows affected (0.00 sec)
続いて、CALL コマンドでストアドプロシージャを呼び出します。1回目の呼び出しでは、ユーザー定義変数は 10+10=20、ローカル変数も 10+10=20 になります。
mysql> CALL sp_LocalAndUserDefinedVariableDemo();
実行結果:
+---------------+ | localVariable | +---------------+ | 20 | +---------------+ 1 row in set (0.32 sec) +---------------+ | @userVariable | +---------------+ | 20 | +---------------+ 1 row in set (0.34 sec) Query OK, 0 rows affected (0.36 sec)
2回目の呼び出し
2回目の呼び出しでは、ユーザー定義変数は前回の値20を保持しているため 20+10=30 になります。一方、ローカル変数は再び10で再初期化されるため 10+10=20 のままです。
mysql> CALL sp_LocalAndUserDefinedVariableDemo();
実行結果:
+---------------+ | localVariable | +---------------+ | 20 | +---------------+ 1 row in set (0.00 sec) +---------------+ | @userVariable | +---------------+ | 30 | +---------------+ 1 row in set (0.01 sec) Query OK, 0 rows affected (0.02 sec)
3回目の呼び出し
さらに3回目の呼び出しでは、ユーザー定義変数は30を保持して 30+10=40 になります。ローカル変数は引き続き 10+10=20 です。
まとめ
このように、ストアドプロシージャが呼び出されるたびに、ローカル変数は毎回指定された値(本例ではデフォルト値の10)またはNULLで再初期化されるのに対し、ユーザー定義変数は再初期化されずにセッション中ずっと値を保持し続けます。用途に応じて使い分けることで、より柔軟なSQL処理が可能になります。
-
C言語の静的変数(static変数)とは?特徴・構文・サンプルコードを解説
静的変数とはC言語における静的変数は、初期化が一度だけ行われる特殊な変数です。通常の自動変数と異なり、コンパイラはプログラムの終了までこの変数を保持し続けます。そのため、関数を抜けても値が失われることはありません。静的変数は関数の内部でも外部でも定義できます。関数内で宣言された場合、その変数はそのブロックに対してローカルとなり、他の関数から直接アクセスすることはできません。また、静的変数には以下のような重要な特徴があります。デフォルト値はゼロ(明示的に初期化しなくても0で初期化される)プログラムの実行が終了するまで生存し続ける初期化は最初の一度だけ行われる静的変数の構文C言語で静的変数を宣言す
-
【初心者向け】PowerShellの変数の基本:作成・確認・削除・追加の方法をわかりやすく解説
コンピュータサイエンスにおいて、変数とは後で利用するために任意の情報を格納しておくメモリ上の場所のことです。言い換えれば、データを一時的に保存し、必要なときに取り出すための「入れ物」です。シェル環境では、そのデータは単語(文字列)でも数字(整数)でも構いません。 パソコンで意識的に変数を使ったことがない人でも、日常生活の中で変数に近いものを使っているはずです。「あれを取って」「これを見て」といった言葉は、文法上の変数(いわゆる代名詞)と言えます。「これ」「あれ」が何を指すのかは、話し手が頭に思い浮かべているものや指差している対象によって決まります。数学でも未知の値を記号で表しますが、それも立派