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)。同一 VALUES 语句中的每个 ROW() 在其值列表中的值数量必须相同。 VALUES 不支持 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_0column_1column_2,依此类推,始终以 开头。此事实可用于使用可选的 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 关键字混淆。也不应该将它与在 INSERT ... ON DUPLICATE KEY UPDATE 中引用列值的 VALUES() 函数混淆。 还应该记住 ROW() 是一个行值构造器,而 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 也可以与 SELECTTABLE 语句联合使用。 UNION 构造的表必须包含相同数量的列,就像使用 SELECT 一样。 ● 在连接语句中使用。 ● 代替 INSERT 或 REPLACE 语句中的 VALUES(),在这种情况下,它的语义与这里描述的略有不同。 ●  CREATE TABLE ... SELECT 和 CREATE VIEW ... SELECT 中替换源表