サブクエリーは、別のステートメント内の SELECT
ステートメントです。
MySQL 4.1 から、SQL 標準に必要なサブクエリーのすべての形式および操作だけでなく、MySQL 固有のいくつかの機能がサポートされています。
サブクエリーの例を次に示します。
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
この例では、SELECT * FROM t1 ...
が外部クエリー (または 外部ステートメント) であり、(SELECT column1 FROM t2)
がサブクエリーです。これを、このサブクエリーは外部クエリー内でネストされていると表現し、また実際、サブクエリーをほかのサブクエリー内で (かなりの深さまで) ネストできます。サブクエリーは常に、括弧内に指定する必要があります。
サブクエリーの主な利点は次のとおりです。
ステートメントの各部分を分離できるように、構造化されたクエリーを可能にします。
通常であれば複雑な結合や和集合を必要とする操作を実行するための代替手段を提供します。
多くの人びとが、サブクエリーを複雑な結合や和集合より読みやすいと感じています。実際、早期の SQL である「構造化クエリー言語」を呼び出すという元の考え方を人びとに提供したのは、サブクエリーの技術革新でした。
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 つ以上の行) を返すことができます。これらは、スカラー、カラム、行、およびテーブルサブクエリーと呼ばれます。特定の種類の結果を返すサブクエリーは多くの場合、次の各セクションで説明されているように、特定のコンテキストでのみ使用できます。
サブクエリーを使用できるステートメントのタイプに関する制限はほとんどありません。サブクエリーには、DISTINCT
、GROUP BY
、ORDER BY
、LIMIT
、結合、インデックスヒント、UNION
構造構文、コメント、関数などの、通常の SELECT
に含めることのできる多くのキーワードや句を含めることができます。
サブクエリーの外部ステートメントは、SELECT
、INSERT
、UPDATE
、DELETE
、SET
、DO
のいずれでもかまいません。
MySQL では、テーブルを変更し、さらにサブクエリーで同じテーブルから選択することはできません。これは、DELETE
、INSERT
、REPLACE
、UPDATE
、LOAD DATA INFILE
(サブクエリーは SET
句で使用できるため) などのステートメントに適用されます。
オプティマイザによるサブクエリーの処理方法については、セクション8.2.1.18「サブクエリーの最適化」を参照してください。サブクエリーの使用に関する制限の説明 (特定の形式のサブクエリー構文でのパフォーマンスの問題を含む) については、セクションD.4「サブクエリーの制約」を参照してください。