MySQL 8.0 リファレンスマニュアル


13.2.11.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 行しか返すことができないため、エラーが発生します。

行の比較における各演算子の動作の詳細は、セクション12.4.2「比較関数と演算子」 を参照してください。

(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);

オプティマイザおよび行コンストラクタの詳細は、セクション8.2.1.22「行コンストラクタ式の最適化」 を参照してください


関連キーワード:  ステートメント, CREATE, サブクエリー, TABLE, DROP, col, column, FUNCTION, カラム, SLAVE