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


MySQL 8.0 リファレンスマニュアル  /  ...  /  スカラーオペランドとしてのサブクエリー

13.2.11.1 スカラーオペランドとしてのサブクエリー

もっとも単純な形式のサブクエリーは、単一値を返すスカラーサブクエリーです。 スカラーサブクエリーは単純なオペランドであるため、単一カラム値またはリテラルが正当である場所であればほぼどこでも使用できるほか、データ型、長さ、NULL にできることの表示などの、すべてのオペランドが持っている特性を持つことを期待できます。 例:

CREATE TABLE t1 (s1 INT, s2 CHAR(5) NOT NULL);
INSERT INTO t1 VALUES(100, 'abcde');
SELECT (SELECT s2 FROM t1);

この SELECT 内のサブクエリーは、CHAR のデータ型、5 の長さ、CREATE TABLE の時点で有効なデフォルトに等しい文字セットと照合順序、およびこのカラム内の値を NULL にできることの表示を持つ単一値 ('abcde') を返します。 サブクエリー結果が空であればその結果は NULL になるため、スカラーサブクエリーによって選択された値の NULL 可能性はコピーされません。 今示したサブクエリーで t1 が空であった場合は、s2NOT NULL であるにもかかわらず、その結果は NULL になります。

スカラーサブクエリーを使用できないコンテキストがいくつか存在します。 ステートメントでリテラル値のみが許可されている場合は、サブクエリーを使用できません。 たとえば、LIMIT にはリテラル整数引数が必要で、LOAD DATA にはリテラル文字列ファイル名が必要です。 サブクエリーを使用してこれらの値を指定することはできません。

次の各セクションにある、やや簡素な構造構文 (SELECT column1 FROM t1) が含まれた例を参照するときは、はるかに多様で、かつ複雑な構造構文を含む独自のコードがあるものと考えてください。

次の 2 つのテーブルを作成するとします。

CREATE TABLE t1 (s1 INT);
INSERT INTO t1 VALUES (1);
CREATE TABLE t2 (s1 INT);
INSERT INTO t2 VALUES (2);

次に、SELECT を実行します。

SELECT (SELECT s1 FROM t2) FROM t1;

t2 には、2 の値を持つカラム s1 が含まれている行が存在するため、その結果は 2 になります。

MySQL 8.0.19 以降では、TABLE を使用して前述のクエリーを次のように記述することもできます:

SELECT (TABLE t2) FROM t1;

スカラーサブクエリーを式の一部にすることはできますが、そのサブクエリーが関数への引数を提供するオペランドである場合でも、括弧を忘れないでください。 例:

SELECT UPPER((SELECT s1 FROM t1)) FROM t2;

同じ結果は、MySQL 8.0.19 以降で SELECT UPPER((TABLE t1)) FROM t2 を使用して取得できます。


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