MySQL での変数の宣言と使用

Gustavo du Mortier 2023年1月30日
  1. MySQL でのユーザー定義変数
  2. ユーザ定義変数の初期化
  3. SELECT ステートメントで変数をフィールドとして使用する
  4. MySQL でローカル変数を宣言する
  5. MySQL におけるシステム変数の宣言
MySQL での変数の宣言と使用

このチュートリアル記事では、MySQL データベースの SQL コード内で変数を宣言する方法を説明します。

SQL スクリプトでは、変数を使用して一連のコマンドの実行中に値を格納し、リテラルの代わりに使用することができます。

MySQL でのユーザー定義変数

MySQL は異なるタイプの変数を認識します。最初のタイプはユーザ定義変数で、プレフィックスとして使用される @ 記号で識別されます。MySQL では、事前に宣言したり初期化したりすることなく、ユーザ定義変数にアクセスすることができます。その場合、変数の初期化時には NULL 値が代入されます。例えば、今回のように変数に値を与えずに SELECT を使用した場合。

SELECT @SomeVariable;

MySQL は NULL 値を返します。

ユーザ定義変数の初期化

ユーザ定義の変数を初期化するには、SET または SELECT 文を使用する必要があります。このように、各代入文をカンマで区切ることで、多くの変数を一度に初期化することができます。

SET @FirstVar=1, @SecondVar=2;

変数に値を代入すると、その変数は与えられた値に応じた型を持つようになります。前の例では、@FirstVar@SecondVarint 型です。

ユーザ定義変数の寿命はセッションがアクティブである限り持続し、他のセッションからは見えません。セッションが終了すると、変数は消えます。

ユーザー定義変数に割り当てることができるデータ型は 5つあります。

  • 文字列(バイナリまたは非バイナリ
  • 整数
  • 十進数
  • 浮動小数点
  • NULL。任意のタイプに関連付けることができます。

変数に値を代入するには、記号 = または := のいずれかを使用することができます。以下の 2つの文は同じ効果があります。

SET @MyIntVar = 1;
SET @MyIntVar := 1;

SELECT ステートメントで変数をフィールドとして使用する

変数は SELECT 文のフィールドリストの一部として使用することができます。この例のように SELECT でフィールドを指定する際には、変数とフィールド名を混在させることができます。

SET @IndexVar := 1;
SELECT @IndexVar, ISBN FROM Books;

MySQL でローカル変数を宣言する

ローカル変数の名前には接頭辞 @ は必要ありませんが、使用する前に宣言しなければなりません。ローカル変数を宣言するには、DECLARE 文を使用するか、STORED PROCEDURE 宣言内のパラメータとして使用します。

ローカル変数を宣言する際には、オプションでデフォルト値を代入することができます。デフォルト値を代入しない場合、変数は NULL 値で初期化されます。

各変数は、その宣言を含む BEGIN ... END ブロックで区切られたスコープ内に存在します。

次の例は、ローカル変数をプロシージャのパラメータとして使用する方法と、プロシージャの内部変数として使用する方法の 2つの異なる使用方法を示しています。

DELIMITER $$

CREATE PROCEDURE GetUpdatedPrices(itemcount INT)
BEGIN
	DECLARE factor DECIMAL(5, 2);
	SET factor:=3.45;
	SELECT PartNo, Description, itemcount * factor * ListPrice FROM Catalogue;
END
$$

DELIMITER ;

前の例では、変数 itemcount がプロシージャに値を渡すためのパラメータとして使用されています。この変数は後に SELECT 文でテーブルから取得した ListPrice フィールドを乗算するために使われます。ローカル変数 factor は、結果の価格を乗算するために用いられる 10 進数の値を格納するために用いられます。

MySQL におけるシステム変数の宣言

システム変数と呼ばれる 3つ目のタイプの変数があり、個々のクライアント接続に影響を与える値(SESSION 変数)や、サーバ全体の動作に影響を与える値(GLOBAL 変数)を格納するために使用されます。

システム変数は通常、サーバの起動時に設定されます。これを行うには、コマンドラインを使用するか、オプションファイルに SET 文を含めることができます。しかし、その値は SQL スクリプト内で変更することができます。

システム変数は、プレフィックスとして二重の @ 記号を使用するか、SET 文の中で GLOBALSESSION という単語を使用して識別することができます。GLOBALSESSION システム変数を区別するもう一つの方法は、2 番目の接頭辞として global または session を使用することです。システム変数に値を代入する方法の例をいくつか挙げます。

-- Alternative ways to set session system variables:
SET interactive_timeout=30000;
SET SESSION interactive_timeout=30000;
SET @@interactive_timeout=30000;
SET @@local.interactive_timeout=30000;

-- Alternative ways to set global system variables:
SET @@global.interactive_timeout=30000;
SET GLOBAL interactive_timeout=30000;

セッション内やサーバ内で使用されているシステム変数を表示するには、SHOW VARIABLES ステートメントを使用します。特定の変数の値を取得したい場合は、比較演算子を追加してこのリストをフィルタリングすることができます。例えば、以下のようになります。

SHOW VARIABLES LIKE '%timeout%'