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_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)
包含一个或多个 ROW()
实例的 VALUES
充当表值构造函数;尽管它可用于在 INSERT
或 REPLACE
语句中提供值,但不要将其与用于此目的的 VALUES
关键字混淆。您也不应将其与 VALUES()
函数混淆,该函数指的是 INSERT ... ON DUPLICATE KEY UPDATE
中的列值。
您还应该记住,ROW()
是一个行值构造函数(请参阅 第 15.2.15.5 节“行子查询”),而 VALUES ROW()
是一个表值构造函数;两者不能互换使用。
在许多可以使用 SELECT
的情况下,都可以使用 VALUES
,包括此处列出的情况
与
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 子句”。您可以将
EXCEPT
和INTERSECT
与VALUES
一起使用,其方式与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 子句”。
在
INSERT
或REPLACE
语句中代替VALUES()
,在这种情况下,其语义与此处描述的略有不同。有关详细信息,请参阅 第 15.2.7 节“INSERT 语句”。在
CREATE TABLE ... SELECT
和CREATE VIEW ... SELECT
中代替源表。有关更多信息和示例,请参阅这些语句的说明。