- 13.2.11.1 スカラーオペランドとしてのサブクエリー
- 13.2.11.2 サブクエリーを使用した比較
- 13.2.11.3 ANY、IN、または SOME を使用したサブクエリー
- 13.2.11.4 ALL を使用したサブクエリー
- 13.2.11.5 行サブクエリー
- 13.2.11.6 EXISTS または NOT EXISTS を使用したサブクエリー
- 13.2.11.7 相関サブクエリー
- 13.2.11.8 導出テーブル
- 13.2.11.9 ラテラル導出テーブル
- 13.2.11.10 サブクエリーのエラー
- 13.2.11.11 サブクエリーの最適化
- 13.2.11.12 サブクエリーの制約
サブクエリーは、別のステートメント内の 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 つ以上の行) を返すことができます。 これらは、スカラー、カラム、行、およびテーブルサブクエリーと呼ばれます。 特定の種類の結果を返すサブクエリーは多くの場合、次の各セクションで説明されているように、特定のコンテキストでのみ使用できます。
サブクエリーを使用できるステートメントのタイプに関する制限はほとんどありません。 サブクエリーには、DISTINCT
、GROUP BY
、ORDER BY
、LIMIT
、結合、インデックスヒント、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
サブクエリーの例を示します。
サブクエリーの外部ステートメントは、SELECT
、INSERT
、UPDATE
、DELETE
、SET
、DO
のいずれでもかまいません。
オプティマイザによるサブクエリーの処理方法については、セクション8.2.2「サブクエリー、導出テーブル、ビュー参照および共通テーブル式の最適化」を参照してください。 サブクエリーの使用に関する制限の説明 (特定の形式のサブクエリー構文でのパフォーマンスの問題を含む) については、セクション13.2.11.12「サブクエリーの制約」を参照してください。