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


13.2.14 VALUES ステートメント

VALUES は、MySQL 8.0.19 で導入された DML ステートメントで、1 つ以上の行のセットをテーブルとして返します。 つまり、スタンドアロン SQL ステートメントとしても機能するテーブル値コンストラクタです。

VALUES row_constructor_list [ORDER BY column_designator] [LIMIT BY number]

row_constructor_list:
    ROW(value_list)[, ROW(value_list)][, ...]

value_list:
    value[, value][, ...]

column_designator:
    column_index

VALUES ステートメントは、VALUES キーワードと、カンマで区切られた 1 つ以上の行コンストラクタのリストで構成されます。 行コンストラクタは、カッコで囲まれた 1 つ以上のスカラー値の値リストを持つ ROW() 行コンストラクタ句で構成されます。 値には、任意の MySQL データ型のリテラルまたはスカラー値に解決される式を使用できます。

ROW() は空にできません (ただし、指定された各スカラー値を NULL にすることはできます)。 同じ VALUES ステートメントの各 ROW() の値リストには、同じ数の値が含まれている必要があります。

DEFAULT キーワードは VALUES でサポートされていないため、INSERT ステートメントで値を指定するために使用される場合を除き、構文エラーが発生します。

VALUES の出力はテーブルです:

mysql> VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8);
+----------+----------+----------+
| column_0 | column_1 | column_2 |
+----------+----------+----------+
|        1 |       -2 |        3 |
|        5 |        7 |        9 |
|        4 |        6 |        8 |
+----------+----------+----------+
3 rows in set (0.00 sec)

VALUES からのテーブル出力のカラムには暗黙的に名前が付けられたカラム column_0, column_1, column_2 などがあり、常に 0 で始まります。 このファクトを使用すると、次に示すように、SELECT ステートメントと同じ方法で、オプションの ORDER BY 句を使用してカラムごとに行を並べ替えることができます:

mysql> VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) ORDER BY column_1;
+----------+----------+----------+
| column_0 | column_1 | column_2 |
+----------+----------+----------+
|        1 |       -2 |        3 |
|        4 |        6 |        8 |
|        5 |        7 |        9 |
+----------+----------+----------+
3 rows in set (0.00 sec)

VALUES ステートメントでは、出力の行数を制限するための LIMIT 句もサポートされています。

VALUES ステートメントは、カラム値のデータ型に関して許可されます。次に示すように、同じカラム内で型を混在させることができます:

mysql> VALUES ROW("q", 42, '2019-12-18'),
    ->     ROW(23, "abc", 98.6),
    ->     ROW(27.0002, "Mary Smith", '{"a": 10, "b": 25}');
+----------+------------+--------------------+
| column_0 | column_1   | column_2           |
+----------+------------+--------------------+
| q        | 42         | 2019-12-18         |
| 23       | abc        | 98.6               |
| 27.0002  | Mary Smith | {"a": 10, "b": 25} |
+----------+------------+--------------------+
3 rows in set (0.00 sec)
重要

ROW() の 1 つ以上のインスタンスを持つ VALUES は、テーブル値コンストラクタとして機能します。INSERT ステートメントまたは REPLACE ステートメントで値を指定するために使用できますが、この目的でも使用される VALUES キーワードと混同しないでください。 また、INSERT ... ON DUPLICATE KEY UPDATE のカラム値を参照する VALUES() 関数と混同しないでください。

ROW() は行値コンストラクタであることにも注意する必要があります (セクション13.2.11.5「行サブクエリー」 を参照してくださいが、VALUES ROW() はテーブル値コンストラクタであり、両者を同じ意味で使用することはできません)。

VALUES は、ここにリストされているものを含め、SELECT を使用できる多くの場合に使用できます:

  • 次に示すように、UNION を使用します:

    mysql> SELECT 1,2 UNION SELECT 10,15;
    +----+----+
    | 1  | 2  |
    +----+----+
    |  1 |  2 |
    | 10 | 15 |
    +----+----+
    2 rows in set (0.00 sec)
    
    mysql> VALUES ROW(1,2) UNION VALUES ROW(10,15);
    +----------+----------+
    | column_0 | column_1 |
    +----------+----------+
    |        1 |        2 |
    |       10 |       15 |
    +----------+----------+
    2 rows in set (0.00 sec)

    この方法では、次のように、複数の行を持つ構築されたテーブルを結合することもできます:

    mysql> VALUES ROW(1,2), ROW(3,4), ROW(5,6)
         >     UNION VALUES ROW(10,15),ROW(20,25);
    +----------+----------+
    | column_0 | column_1 |
    +----------+----------+
    |        1 |        2 |
    |        3 |        4 |
    |        5 |        6 |
    |       10 |       15 |
    |       20 |       25 |
    +----------+----------+
    5 rows in set (0.00 sec)

    このような場合は、UNION を完全に省略して、次のような単一の VALUES ステートメントを使用することもできます (通常はこれをお薦めします):

    mysql> VALUES ROW(1,2), ROW(3,4), ROW(5,6), ROW(10,15), ROW(20,25);
    +----------+----------+
    | column_0 | column_1 |
    +----------+----------+
    |        1 |        2 |
    |        3 |        4 |
    |        5 |        6 |
    |       10 |       15 |
    |       20 |       25 |
    +----------+----------+

    VALUES は、SELECT ステートメントまたは TABLE ステートメント (あるいはその両方) と組み合せて使用することもできます。

    UNION の構成されたテーブルには、SELECT を使用している場合と同様に、同じ数のカラムが含まれている必要があります。 その他の例については、セクション13.2.10.3「UNION 句」 を参照してください。

  • 結合内。 詳細および例については、セクション13.2.10.2「JOIN 句」を参照してください。

  • INSERT ステートメントまたは REPLACE ステートメントでの VALUES() のかわりに、そのセマンティクスはここで説明するものと多少異なります。 詳細は、セクション13.2.6「INSERT ステートメント」,を参照してください。

  • CREATE TABLE ... SELECT および CREATE VIEW ... SELECT のソーステーブルのかわり。 詳細および例については、これらのステートメントの説明を参照してください。


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