この時点までの話は、単一値や値のカラムを返すサブクエリーなどのような、スカラーやカラムサブクエリーに関してのものでした。行サブクエリー は単列を返し、ひいては複数のカラム値を返すことができるサブクエリーバリアントです。行サブクエリーの比較のための正当な演算子は次のとおりです。
= > < >= <= <> != <=>
ここに 2 つ例があります。
SELECT * FROM t1 WHERE (1,2) = (SELECT column1, column2 FROM t2); SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);
もしテーブル t2
が
column1 = 1
と
column2 = 2
の場所に行を持っていれば、ここにあるクエリーは両方
TRUE
です。
式 (1,2)
と
ROW(1,2)
は場合によって row constructors
と呼ばれます。それら 2
つは同等のものです。行コンストラクタと、サブクエリーによって返される行には、同じ値の数が含まれている必要があります。
行コンストラクタは、ほかのコンテキストでも正当です。たとえば、次の 2 つのステートメントは意味的に同等です。(1 つめは MySQL 5.1.12 まで最適化することができませんが)
SELECT * FROM t1 WHERE (column1,column2) = (1,1); SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
行コンストラクタは通常、2
つ以上のカラムを返すサブクエリーを持つ比較に対して利用します。たとえば、次のクエリーは要求に答えて、「テーブル
t2
」
にも存在するテーブル
t1
内のすべての行を検索します。
SELECT column1,column2,column3 FROM t1 WHERE (column1,column2,column3) IN (SELECT column1,column2,column3 FROM t2);