Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


15.2.19 VALUES 语句

VALUES 是一个 DML 语句,它返回一个或多个行作为一个表。在其他字面上,它是一个表值构造器,也可以作为独立的 SQL 语句。

VALUES row_constructor_list [ORDER BY column_designator] [LIMIT number]

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

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

column_designator:
    column_index

VALUES 语句由 VALUES 关键字后跟一个或多个行构造器,行构造器由 ROW() 行构造子句和一个或多个标量值列表组成。标量值可以是 MySQL 任意数据类型的文字或一个可以解析为标量值的表达式。

ROW() 不能为空,但是每个提供的标量值可以是 NULL。在同一个 VALUES 语句中,每个 ROW() 都必须具有相同数量的值。

不支持 DEFAULT 关键字,除非在 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_0column_1column_2 等,始终从 0 开始。这一事实可以用来对行进行排序,使用可选的 ORDER BY 子句,就像使用 SELECT 语句一样,如下所示:

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)
Important

VALUES 语句可以作为表值构造器使用;虽然它可以用来提供值在 INSERTREPLACE 语句中,但是不要与用于相同目的的 VALUES 关键字混淆,也不要与 VALUES() 函数混淆,该函数用于在 INSERT ... ON DUPLICATE KEY UPDATE 语句中引用列值。

您还需要注意的是,ROW()是一个行值构造函数(见第15.2.15.5节,“Row Subqueries”),而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一样。见第15.2.18节,“UNION Clause”,了解更多信息。

    可以使用EXCEPTINTERSECTVALUES,如下所示:

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

    第15.2.4节,“EXCEPT Clause”第15.2.8节,“INTERSECT Clause”,了解更多信息。

  • 在连接中。见第15.2.13.2节,“JOIN Clause”,了解更多信息和示例。

  • 取代VALUES()INSERTREPLACE语句中,在这种情况下,它的语义略微不同。见第15.2.7节,“INSERT Statement”,了解详细信息。

  • 取代源表在CREATE TABLE ... SELECTCREATE VIEW ... SELECT中。见这些语句的描述,了解更多信息和示例。