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


13.2.10.5 行サブクエリー

ここまでの説明は、スカラーまたはカラムサブクエリー、つまり、単一値または値のカラムを返すサブクエリーについてでした。行サブクエリーは、単一行を返し、そのために複数のカラム値を返すことができるサブクエリーバリアントです。行サブクエリーの比較のための正当な演算子は次のとおりです。

=  >  <  >=  <=  <>  !=  <=>

次に、2 つの例を示します。

SELECT * FROM t1
  WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
SELECT * FROM t1
  WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);

どちらのクエリーでも、テーブル t2id = 10 を持つ単一行が含まれている場合、このサブクエリーは単一行を返します。この行に t1 内のいずれかの行の col1 および col2 値に等しい col3 および col4 値が含まれている場合、WHERE 式は TRUE であり、各クエリーはこれらの t1 行を返します。t2 行の col3 および col4 値が、いずれの t1 行の col1 および col2 値にも等しくない場合、この式は FALSE であり、このクエリーは空の結果セットを返します。サブクエリーによって行が生成されない場合、この式は不明 (つまり、NULL) です。サブクエリーによって複数の行が生成される場合は、行サブクエリーが最大で 1 行しか返すことができないため、エラーが発生します。

(1,2)ROW(1,2) は、行コンストラクタとも呼ばれます。この 2 つは同等です。行コンストラクタと、サブクエリーによって返される行には、同じ数の値が含まれている必要があります。

行コンストラクタは、2 つ以上のカラムを返すサブクエリーとの比較に使用されます。サブクエリーが単一カラムを返すと、これは行ではなく、スカラー値として見なされるため、少なくとも 2 つのカラムを返さないサブクエリーで行コンストラクタを使用することはできません。そのため、次のクエリーは構文エラーで失敗します。

SELECT * FROM t1 WHERE ROW(1) = (SELECT column1 FROM t2)

行コンストラクタは、ほかのコンテキストでも正当です。たとえば、次の 2 つのステートメントは意味的に同等です (また、オプティマイザによって同じように処理されます)。

SELECT * FROM t1 WHERE (column1,column2) = (1,1);
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;

次のクエリーは、テーブル t2 内にも存在するテーブル t1 内のすべての行を検索するという要求にこたえます。

SELECT column1,column2,column3
  FROM t1
  WHERE (column1,column2,column3) IN
         (SELECT column1,column2,column3 FROM t2);

User Comments
Sign Up Login You must be logged in to post a comment.