この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
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文が分かりやすくなるので、可読性の意味でも使い勝手は有ると思います。