MySQL 8.0 リファレンスマニュアル


13.2.11 サブクエリー

サブクエリーは、別のステートメント内の SELECT ステートメントです。

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 つ以上の行) を返すことができます。 これらは、スカラー、カラム、行、およびテーブルサブクエリーと呼ばれます。 特定の種類の結果を返すサブクエリーは多くの場合、次の各セクションで説明されているように、特定のコンテキストでのみ使用できます。

サブクエリーを使用できるステートメントのタイプに関する制限はほとんどありません。 サブクエリーには、DISTINCTGROUP BYORDER BYLIMIT、結合、インデックスヒント、UNION 構造構文、コメント、関数などの、通常の SELECT に含めることのできる多くのキーワードや句を含めることができます。

MySQL 8.0.19 以降、TABLE および VALUES ステートメントをサブクエリーで使用できます。 通常、VALUES を使用するサブクエリーは、set 表記法を使用するか、SELECT または TABLE 構文を使用してよりコンパクトにリライトできる、より詳細なバージョンのサブクエリーです。CREATE TABLE ts VALUES ROW(2), ROW(4), ROW(6) ステートメントを使用して ts テーブルを作成する場合、ここに示すステートメントはすべて同等です:

SELECT * FROM tt
    WHERE b > ANY (VALUES ROW(2), ROW(4), ROW(6));

SELECT * FROM tt
    WHERE b > ANY (2, 4, 6);

SELECT * FROM tt
    WHERE b > ANY (SELECT * FROM ts);

SELECT * FROM tt
    WHERE b > ANY (TABLE ts);

次の各セクションでは、TABLE サブクエリーの例を示します。

サブクエリーの外部ステートメントは、SELECTINSERTUPDATEDELETESETDO のいずれでもかまいません。

オプティマイザによるサブクエリーの処理方法については、セクション8.2.2「サブクエリー、導出テーブル、ビュー参照および共通テーブル式の最適化」を参照してください。 サブクエリーの使用に関する制限の説明 (特定の形式のサブクエリー構文でのパフォーマンスの問題を含む) については、セクション13.2.11.12「サブクエリーの制約」を参照してください。


関連キーワード:  ステートメント, サブクエリー, CREATE, TABLE, DROP, FROM, FUNCTION, SLAVE, 関数, テーブル