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_0
、column_1
、column_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)
VALUES
语句可以作为表值构造器使用;虽然它可以用来提供值在 INSERT
或 REPLACE
语句中,但是不要与用于相同目的的 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”,了解更多信息。可以使用
EXCEPT
和INTERSECT
与VALUES
,如下所示: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()
在INSERT
或REPLACE
语句中,在这种情况下,它的语义略微不同。见第15.2.7节,“INSERT Statement”,了解详细信息。 -
取代源表在
CREATE TABLE ... SELECT
和CREATE VIEW ... SELECT
中。见这些语句的描述,了解更多信息和示例。