使用SQL INSERT INTO子查询时无需VALUE关键字的原因是什么?
为什么带SELECT的INSERT INTO语句不需要VALUES关键字?
SQL的INSERT语句本身就支持两种常用的写入模式,这是SQL标准定义的合法语法:
手动指定值的模式:用
VALUES子句,适合直接输入单行或多行具体值的场景,比如:INSERT INTO orders_archived (order_id, customer_id, order_date) VALUES (1001, 501, "2017-12-30"), (1002, 502, "2017-11-15");这里
VALUES的作用是把手动输入的零散值包装成数据库能识别的行数据。复用查询结果的模式:用
SELECT子句替代VALUES,适合从其他表或子查询批量导入数据的场景,也就是你给出的例子:INSERT INTO orders_archived SELECT * FROM orders WHERE order_date < "2018-01-01"这个逻辑能成立的核心原因是:
- 后面的
SELECT语句会返回一个结构化的结果集——它的列数、列的数据类型、列顺序和目标表orders_archived完全匹配(这里用*表示取原表所有列,只要两张表结构一致就没问题) - 数据库会直接把这个结果集里的每一行,作为一条完整的记录插入到目标表中,不需要额外用
VALUES来包裹,因为SELECT已经提供了符合要求的、现成的行数据集合
- 后面的
简单说,VALUES是给你手动填值用的,SELECT是直接拿查询出来的现成数据用的,两种都是INSERT语句的合法用法,只要数据源和目标表结构匹配就能正常运行。
内容的提问来源于stack exchange,提问作者Beth Tian
相关产品推荐
相关产品推荐

