VALUES语句
VALUES
是MySQL 8.0.19中引入的DML语句,该语句返回一组一个或多个行作为表。换句话说,它是一个表值构造函数,还可以充当独立的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
关键字组成,后跟一个或多个行构造函数的列表,以逗号分隔。行构造函数由ROW()
行构造函数组成,该函数具有一个或多个标量值的值列表作为其参数。值可以是任何MySQL数据类型的文字,也可以是解析为标量值的表达式。
ROW()
不能为空(但可以为NULL
)。ROW()
同VALUES
一条语句中的每个语句在其值列表中必须具有相同数量的值。
该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)
重要
VALUES
具有一个或多个act实例ROW()
作为表值构造函数;尽管它可以用于在INSERT
orREPLACE
语句中提供值,但不要将其与VALUES
也用于此目的的关键字混淆。您也不应将其与VALUES()
引用中的列值的函数混淆INSERT ... ON DUPLICATE KEY UPDATE
。另外,不要
VALUES ROW()
与ROW()
行构造函数的形式混淆(请参见“ROW子查询”)。
VALUES
可以在许多您可以雇用的情况下使用SELECT
,包括此处列出的那些情况:
使用
UNION
,如下所示:mysql>
SELECT 1,2UNION 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)VALUES
也可以与SELECT
语句,TABLE
语句或两者结合使用。中的构造表
UNION
必须包含相同数量的列,就像使用一样SELECT
。有关更多示例,请参见“ UNION子句”。- 在加入。有关更多信息和示例,请参见“ JOIN子句”。
- 在地方的
VALUES()
在INSERT
或REPLACE
声明,在这种情况下,它的语义从这里描述的是什么略有不同。有关详细信息,请参见“ INSERT语句”。 - 代替源表中
CREATE TABLE ... SELECT
和CREATE VIEW ... SELECT
。有关更多信息和示例,请参见这些语句的描述。