SQLに変数を使用することは出来るのでしょうか?
MySQL系のSQLでは文中に変数を含め利用することが可能です。この方法を使えるようになればより高度な記述が可能になります。
SQLの学習を始めたばかりの時には平文での記述に目が行きがちですが、変数を絡めた記述を理解することはSQLをマスターする上でとても重要です。
平文での記述をプログラミングに例えると、Classや独自関数を使用せず基本関数のみで組み立てるのと同じことです。
そこで今回は「SQL文で変数を使用する」方法について解説していきます。
この記事を機に皆さんも是非変数について学習してみましょう。
変数とは
まずは簡単に変数について説明します。
変数とは、値を代入する記号や文字列を指します。
プログラミングでデータを扱う際に使う記憶領域だと思ってください。
この記憶領域には好きな名前を付けることができ、また好きな時に呼び出すことが出来ます。
SQLでの変数の宣言
変数について簡単に説明を終えたところで、早速SQLにおける変数の使い方について解説してみたいと思います。
どのプログラム言語でもそうですが、変数を使用するためにはまず、その変数の宣言を行う必要があります。
変数の宣言には次のようなルールが存在しますので覚えましょう。
- 変数の宣言には「DECLARE(ディクレア)」ステートメントを使用する。
- 変数とする名前の先頭は必ず「@(アットマーク)」とする。
- 変数名の後に半角スペースを空け、データ型を指定する。
上のルールを全て含ませると基本記述は次のようになります。
DECLARE @sample int;
これで変数の宣言が完了します。
複数の変数を同時に宣言する
変数の宣言する場合に複数の変数を同時に宣言したい場合もあると思います。
そういった場合には次のように記述すると同時に宣言することが出来ます。
DECLARE @sample_a int, @sample_b int, @sample_c int
実行速度の違い
ここまで単体で宣言する方法と同時に複数を宣言する方法について解説してきましたが、実行速度という観点から見るとこの二つに違いが出てきます。
この問題について、結果から言うと単体で宣言する方法を繰り返した方が実行速度は速くなります。
多くの変数を宣言する場合には、これらの問題を踏まえたうえでどちらの方法を使用するかを検討するようにしましょう。
変数をセットする
これで変数の宣言についてはご理解いただけたと思いますので次は変数のセットについて解説していきます。
変数を宣言しただけではまだその変数には「NULL」が代入されているだけで使い物になりません。
この空の変数に値を代入するためには次のように記述します。
SET @sample = 1;
また、DECLAREで宣言をした際に同時に値をセットすることも出来ます。
DECLAREで宣言時にセットする場合には次のように記述します。
DECLARE @sample_a int = 1, @sample_b int = 2, @sample_c int ← 値を指定していない為、NULLが代入される
変数のスコープについて
変数のスコープとは、その変数を参照できるSQLステートメントの範囲を指します。
変数のスコープはその変数が宣言された時点で開かれ、バッチ及びストアドプロシージャが終了した時点で閉じられます。
わかりやすく解説を進めるため、実際にコードを見てみましょう。
// 使用テーブル id name age ----------- -------------------- ----------- 1 Alex 25 2 Sophia 23 3 Noah 28 4 Elijah 21 5 James 24 USE sample_db; GO DECLARE @sample int; SET @sample = 1; GO SELECT id, name, age FROM sample_table WHERE id = @sample; GO メッセージ 137、レベル 15、状態 2、サーバー DESKTOP-T3J7G2K\SQLEXPRESS、行 1 スカラー変数 "@sample" を宣言してください。
このサンプルコードでは解りやすくするため、ステートメントひとつづつをバッチで分割し実行しています。
14行目でDECLAREを使用し変数の宣言をしていますが、注意点としては子の変数の宣言が完了した時点で一度バッチを閉じている点です。
変数のスコープはバッチを閉じた時点で終了するため、上のコードでは結果としてエラーが排出されています。
このように、変数の宣言を行う場合には同バッチ内で宣言~使用までをセットで行う必要があります。
変数で関数を実行する
これで変数の解説は一通り終わりましたが、最後に変数を使った小技を紹介していきたいと思います。
変数には値をセットすることが出来ると解説してきましたが、関数を直接代入することも出来ます。
以下のコードを見てください。
DECLARE @selectTest nvarchar(500) = 'SELECT id, name, age FROM sample_table'; EXEC(@selectTest); GO id name age ----------- -------------------- ----------- 1 Alex 25 2 Sophia 23 3 Noah 28 4 Elijah 21 5 James 24
上のコードでは変数の中に直接クエリを文字列として代入しています。
1行目の時点ではDECLAREを使ってSELECT文を”文字列”として宣言しただけその他には目立ったクエリは実行していません。
ですが次の行で先ほど宣言した変数をEXECで実行してみると、ただの文字列として宣言されただけであるSELECT文が実行されていることが確認できます。
このように、変数には文字列として関数を代入しても実行することが可能です。
まとめ
いかがでしたか?
今回は「SQL文で変数を使用する」について具体的な例も踏まえて解説してみました。
変数をマスターすることで開発で頻繁に使用する値を省略することができ、結果として開発速度の向上に繋ぐことが出来ます。
またメンテナンス時にも、変数化しておけば全文を修正する必要もなくなるケースがありますので、ぜひともマスターしておくことをお勧めします。