MySQLでサブクエリを使用する
はじめに
SELECT文を使用する際に、現状のテーブルを加工した物から抽出したい事が有ります。 加工したテーブルやビューは使い回す予定が無い場合、データベースに保存しても削除の手間が増えるだけです。 そういった場合に役立つのが「サブクエリ」です。
サブクエリについて
・情報を取得するための、一時テーブルを生成する。 ・一時テーブルは処理が終わったら破棄される。
構文
SELECT "フィールド名" FROM ( "サブクエリを生成するSELECT文" ) AS "サブクエリ名";
ポイント
1、FROM句でサブクエリを生成。 2、生成時のSELECT文は「()」で囲み、「AS」でサブクエリ名を付ける。 3、そのサブクエリを元に最初のSELECT文が実行される。
サブクエリの入れ子も可能
SELECT "フィールド名3" FROM ( SELECT "フィールド名2" FROM ( SELECT "フィールド名1" FROM "テーブル名1" ) AS "サブクエリ名1" ) AS "サブクエリ名2";
使用例
欲しいもの
映画リストの中から2000年以降のSF映画のタイトル。
映画リストのテーブル”eiga”
mysql> select * from eiga; +----+--------------------+-------------+------+ | id | title | genre | year | +----+--------------------+-------------+------+ | 1 | Star Wars | SF | 2015 | | 2 | Back To The Future | SF | 1985 | | 3 | City Of God | Non Fiction | 2003 | | 4 | A Clockwork Orange | Thriller | 1971 | | 5 | Home Alone | Comedy | 1990 | +----+--------------------+-------------+------+
実行するSQL文
SELECT E.title FROM ( SELECT * FROM eiga WHERE year >= 2000 ) AS E WHERE genre='SF';
解説
1、4〜6行目の「yearが2000以上」の条件に絞ったサブクエリを生成。
mysql> select * from eiga where year>=2000; +----+-------------+-------------+------+ | id | title | genre | year | +----+-------------+-------------+------+ | 1 | Star Wars | SF | 2015 | | 3 | City Of God | Non Fiction | 2003 | +----+-------------+-------------+------+
2、8行目でASで生成したテーブルの別名を「E」と付けてます。 3、9行目のWHERE句で更に条件「genre が 'SF'」に当てはまる行をテーブルEから抽出しています。 4、1行目のSELECT句で「E.title(テーブルEのカラムtitle)」を指定して出力しています。
実行結果
+-----------+ | title | +-----------+ | Star Wars | +-----------+
最後に
今回の様なデータが欲しい場合にサブクエリは必要有りませんが、この形が分かりやすいかなと思いました。 処理が複雑な場合にサブクエリを挟む事でSQL文が分かりやすくなるので、可読性の意味でも使い勝手は有ると思います。