サブクエリは SELECT
ステートメントの FROM
条項内で正当です。実際の構文はこれです。
SELECT ... FROM (subquery
) [AS]name
...
[AS]
条項は強制なので、name
FROM
条項内の全てのテーブルは名前を持つ必要があります。subquery
選択リスト内の全てのカラムは固有の名前を持たなければいけません。このマニュアルの中で
「派生テーブル」
という言葉が利用されている他の場所で、この構文の説明を見付ける事ができます。
説明する為に、このテーブルを持っていると仮定してください。
CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT);
ここに、この例のテーブルを利用して、FROM
条項の中でサブクエリを利用する方法の説明があります。
INSERT INTO t1 VALUES (1,'1',1.0); INSERT INTO t1 VALUES (2,'2',2.0); SELECT sb1,sb2,sb3 FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb WHERE sb1 > 1;
結果: 2, '2', 4.0
.
ここに別の例があります。グループ分けされたテーブルの、合計セットの平均を知りたいと仮定します。これは機能しません。
SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1;
しかし、このクエリは要求された情報を提供します。
SELECT AVG(sum_column1) FROM (SELECT SUM(column1) AS sum_column1 FROM t1 GROUP BY column1) AS t1;
サブクエリの中で利用されたカラム名(sum_column1
)
が外部クエリの中で認められている事に注意してください。
FROM
条項内のサブクエリは、スカラ、カラム、行、そしてテーブルを返す事ができます。FROM
条項内のサブクエリは、JOIN
演算の ON
条項内で利用されない限り、相関サブクエリになる事ができません。
FROM
条項内のサブクエリは、EXPLAIN
ステートメント(派生テンポラリ
テーブルが作られた)
に対しても実行する事ができます。これは、上位レベルクエリが最適化の段階で全てのテーブルの情報を必要とする為に起こります。