プログラミングの学習で恐らく一番最初に触れる物と言えば”if文”ではないでしょうか。
MySQLではストアドルーチンの中でのみif文を使うことが許されています。
今回はこの「MySQLでif文を使う」をテーマに解説していきます。
ストアドルーチンとは
“ストアドルーチン”とは、「ストアドプロシージャ」と「ストアドファンクション」の2種類で構成されるSQLのことです。
データベース内に名前を付けて格納しておけるのが特徴であり、これを発行しておくことで手軽に呼び出せます。
使い回すようなクエリであれば、毎回冗長なクエリを記述するよりストアドルーチンを使う方が格段に効率が上がります。
また通常のSQLで使用できないような条件分岐やループ処理、変数定義などが使用できるようになるので、プログラミングをしているかのように自由度の高い記述が可能になります。
「ストアドプロシージャ」と「ストアドファンクション」
この二つについて簡単に解説していきます。
ストアドプロシージャとストアドファンクションは同じような動作が期待できますが、厳密な違いがあります。
ストアドプロシージャは戻り値が無いのに対し、ストアドファンクションには戻り値が存在します。
今回はこれらの具体的な使用方法には触れませんが、双方ともに使い方が若干異なりますので、必要に応じて調べてみてください。
MySQLでif文を使う方法
ここからが本題ですが、今回は解説するにあたり「ストアドファンクション」を使用して解説していきます。
ストアドファンクションの知識が無い方は予め簡単に学習しておいた方がより理解し易くなるので、ストアドファンクションについて書かれている別記事にも目を通してみてください。
それでは早速ですが、MySQLでif文を使う方法について解説していきます。
MySQLでif文を使うためにストアドファンクションを使用しますが、このストアドファンクションは以下のように定義します。
CREATE FUNCTION [ファンクション名]([引数] [引数のデータ型]) RETURNS [戻り値のデータ型] [DETERMINISTIC/NOT DETERMINISTIC] BEGIN [・・・一連の処理を記載・・・] RETURN(戻り値); END;
if文は先ほど説明した通り、ストアドファンクション内でのみ使用可能ですので、「一連の処理を記載」の部分で使用します。
またMySQLでのif文の定義は以下の通りとなります。
IF 条件式 THEN 処理文 ELSEIF 条件文 THEN 処理文 .... ELSE 処理文 END IF
RETURNにはif文の戻り値を変数に格納したものが入ります。
それでは実際にコードを見ていきましょう。
今回は予め作っておいたデータベーステーブル「sample_table」を使用しますが、その中身は以下の通りです。
+----+----------+-----------+ | id | num_left | num_right | +----+----------+-----------+ | 1 | 2 | 5 | | 2 | 3 | 1 | | 3 | 6 | 6 | +----+----------+-----------+
また今回は「MySQLでif文を使う方法」の解説なので、比較的簡単な条件分岐で解説していきたいと思います。
以下のコードはこれから使う式をわかりやすくプログラミング言語(Java)で書いたものです。
public class Sample { public static void main(String[] args) { int num_left[] = {2, 3, 6}; int num_right[] = {5, 1, 6}; for(int i = 0; i< num_left.length; i++) { if(num_left[i] > num_right[i]) { System.out.println("left is big !"); } else if(num_left[i] < num_right[i]){ System.out.println("right is big !"); } else { System.out.println("even..."); } } } }
実行結果
right is big ! left is big ! even...
上のコードは配列”num_left”と配列”num_right”を比較して、”num_left”が大きければ「left is big !」、”num_right”が大きければ「right is big !」、同じなら「even…」と表示させるだけの条件分岐です。
これをMySQLのストアドファンクションで記述すると以下のようになります。
DELIMITER // CREATE FUNCTION sample01(input int) -> RETURNS VARCHAR(20) DETERMINISTIC -> BEGIN -> DECLARE leftNum INT; -> DECLARE rightNum INT; -> DECLARE msg VARCHAR(20); -> -> SELECT num_left INTO leftNum FROM sample_table WHERE id = input; -> SELECT num_right INTO rightNum FROM sample_table WHERE id = input; -> -> IF leftNum > rightNum THEN SET msg = 'left is big !'; -> ELSEIF leftNum < rightNum THEN SET msg = 'right is big !'; -> ELSE SET msg = 'even...'; -> END IF; -> -> RETURN msg; -> END -> // Query OK, 0 rows affected (0.004 sec) DELIMITER ; SELECT id, sample01(id) AS Comment FROM sample_table; +----+----------------+ | id | Comment | +----+----------------+ | 1 | right is big ! | | 2 | left is big ! | | 3 | even... | +----+----------------+ 3 rows in set (0.001 sec)
Javaで記述したコードの方は、今回は記述を避けて配列を代入していますが、本来であればデータベースに接続し更にそこからデータを引っ張り出してその情報を変数に代入して・・・というような作業がある為、冗長なコードになりがちです。
一方MySQLでの記述であれば、データベースから直接データを取り出して使えるため、冗長なクエリにならずに済んでいることが確認できると思います。
このことからデータベースから情報を引っ張り出して使い回すようなコードであれば、直接データベース内で完結させておくというのも手段の一つであると言えます。
またデータベースで全てを完結させてしまうとサーバー負荷が高くなると指摘を受けるかもしれませんが、アプリケーションで負荷をかけるかサーバーで負荷をかけるかの違いなので、どちらでも余り変わらない結果となることが多いようです。
まとめ
いかがでしたか?
今回はMySQLでif文を使う方法について解説してみました。
MySQLクエリで完結させるメリットもありますので、データベースについても一通り学習しながら各言語の学習を並行して進めることをお勧めします。