[+/-]
サブクエリは、別のステートメント内の
SELECT
ステートメントです。
MySQL 4.1 から、MySQL 特有のいくつかの特徴と同様に、SQL スタンダードが要求する全てのサブクエリ型と演算子がサポートされています。
ここに、同じようなサブクエリの例があります。
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
この例の中では、SELECT * FROM t1 ...
は 外部クエリ (または
外部ステートメント)であり、(SELECT
column1 FROM t2)
は
サブクエリ
です。これは、サブクエリが外部クエリ内で
ネスト化された
という事であり、実際、サブクエリを別のサブクエリ内で、相当な深さまでネスト化する事が可能です。サブクエリは必ずカッコ内に表示されなければいけません。
サブクエリの主な利点は次のような物になります。
それらは、ステートメントのそれぞれの部分を分離させる事ができるように、構造化された クエリを許容します。
それらは、複雑な接合や合併を要求されないように、演算を行う為の代替法を提供します。
多くの人の意見によると、それらは複雑な接合や合併と比べると、読み込みやすいという事です。実際これは、初期 SQL の 「Structured Query Language.」 の創案を人々に与えたサブクエリの発明でした。
ここに、SQL スタンダードによって指定され、MySQL 内でサポートされているサブクエリ構文に関する主なポイントを説明するステートメントの例があります。
DELETE FROM t1 WHERE s11 > ANY (SELECT COUNT(*) /* no hint */ FROM t2 WHERE NOT EXISTS (SELECT * FROM t3 WHERE ROW(5*t2.s1,77)= (SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM (SELECT * FROM t5) AS t5)));
サブクエリは、スカラ(単一値)、単一行、単一カラム、またはテーブル(1つ、または複数カラムの、1つ、または複数行) を返す事ができます。これらはスカラ、カラム、行、そしてテーブル サブクエリと呼ばれます。次のセクションで説明されているように、頻繁に特定の種類の結果を返すサブクエリは、特定のコンテキストの中だけで利用する事ができます。
サブクエリを利用する事ができるステートメントのタイプには、いくつかの制限があります。サブクエリは、普通の
SELECT
が含む事のできるキーワードや条項を全て含む事ができます。それは
DISTINCT
、GROUP
BY
、ORDER
BY
、LIMIT
、接合、インデックスヒント、UNION
構成、コメント、関数などです。
制限の1つは、サブクエリの外部ステートメントが
SELECT
、INSERT
、UPDATE
、DELETE
、SET
、または
DO
のうちのどれか1つでなければいけないという事です。その他の制限は、現在はサブクエリの中でテーブルを変更したり、同じテーブルから選択する事ができないという事です。これは、DELETE
、INSERT
、REPLACE
、UPDATE
、そして(サブクエリは
SET
条項内で利用できる為)
LOAD DATA INFILE
のようなステートメントに適応します。
サブクエリ構文の特定型に関する性能問題を含む、サブクエリ利用に関する制限のさらなる総合的な説明に関しては、 項D.3. 「サブクエリの規制」 で紹介されています。