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()作为表值构造函数;尽管它可以用于在INSERTorREPLACE语句中提供值,但不要将其与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。有关更多信息和示例,请参见这些语句的描述。
