Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


13.2.10 サブクエリー構文

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

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

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

MySQL では、テーブルを変更し、さらにサブクエリーで同じテーブルから選択することはできません。これは、DELETEINSERTREPLACEUPDATELOAD DATA INFILE (サブクエリーは SET 句で使用できるため) などのステートメントに適用されます。

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


User Comments
User comments in this section are, as the name implies, provided by MySQL users. The MySQL documentation team is not responsible for, nor do they endorse, any of the information provided here.
  Posted by Devang Modi on August 30, 2011
Combine queries for Insert and Select always obeys Innodb locking rules
if one of the source table is based on Innodb engine.
It is also possible that the INSERT activity applicable to TEMPORARY
table which is not InnoDB engine. It is also possible that in SELECT
section with INNODB, some other TEMPORARY Tables are used.
Devang Modi
Sign Up Login You must be logged in to post a comment.