[+/-]
サブクエリーは、別のステートメント内の
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
のようなステートメントに適応します。
サブクエリー構文の特定型に関する性能問題を含む、サブクエリー利用に関する制限のさらなる総合的な説明に関しては、Restrictions on Subqueries で紹介されています。