MySQLでサブクエリを使用する

2016.02.02

この記事は公開されてから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文が分かりやすくなるので、可読性の意味でも使い勝手は有ると思います。