文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  VALUES 语句

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 关键字不受 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_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)
重要

包含一个或多个 ROW() 实例的 VALUES 充当表值构造函数;尽管它可用于在 INSERTREPLACE 语句中提供值,但不要将其与也用于此目的的 VALUES 关键字混淆。您也不应将其与引用 INSERT ... ON DUPLICATE KEY UPDATE 中列值的 VALUES() 函数混淆。

您还应该记住,ROW() 是一个行值构造函数(请参阅 第 15.2.15.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 一样。有关更多示例,请参阅 第 15.2.18 节“UNION 子句”

    您可以将 EXCEPTINTERSECTVALUES 一起使用,方法与 UNION 非常相似,如下所示

    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 子句”第 15.2.8 节“INTERSECT 子句”

  • 在联接中。有关更多信息和示例,请参阅 第 15.2.13.2 节“JOIN 子句”

  • INSERTREPLACE 语句中代替 VALUES(),在这种情况下,其语义与此处描述的略有不同。有关详细信息,请参阅 第 15.2.7 节“INSERT 语句”

  • CREATE TABLE ... SELECTCREATE VIEW ... SELECT 中代替源表。有关更多信息和示例,请参阅这些语句的说明。