相関副問い合わせとは、その中に含まれるカラムの参照が外側のクエリにも含まれているサブクエリのことを言います。 次に例を示します。
SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2 WHERE t2.column2 = t1.column2);
注意:
上の例のサブクエリには、t1
の参照が含まれていますが、このサブクエリの
FROM
節ではテーブル
t1
については言及されていません。そのため、MySQL
によってサブクエリの外側が調べられ、外側のクエリで
t1 が検出されます。
テーブル t1
に、column1 =
5
で、 column2 = 6
であるレコードが含まれており、テーブル
t2
に、column1 = 5
で、column2 = 7
であるレコードが含まれているとします。...
WHERE column1 = ANY (SELECT column1 FROM t2)
という簡単な式の結果は TRUE
になりますが、この例の場合、サブクエリ内の
WHERE
節が FALSE
になるので(7 <> 5
であるため)、サブクエリ全体は
FALSE
になります。
スコープの規則:MySQL では、内側から外側に向かって評価を行います。 次に例を示します。
SELECT column1 FROM t1 AS x WHERE x.column1 = (SELECT column1 FROM t2 AS x WHERE x.column1 = (SELECT column1 FROM t3 WHERE x.column2 = t3.column1));
上の例では、SELECT column1 FROM t2 AS x
...
によって t2
の名前が変更されることから、x.column2
はテーブル t2
のカラムでなければなりません。SELECT
column1 FROM t1 ...
はずっと離れた外側のクエリなので、x.column2
はテーブル t1
のカラムではありません。
HAVING
節や ORDER BY
節のサブクエリについても、MySQL
では、外側の選択リストに指定されたカラム名が調べられます。
MySQL では、相関クエリを使用しないよう非公式に推奨しています。相関クエリは構成が複雑化するだけでなく、実行にもより多くの時間がかかります。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.