You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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"
    

    这个逻辑能成立的核心原因是:

    1. 后面的SELECT语句会返回一个结构化的结果集——它的列数、列的数据类型、列顺序和目标表orders_archived完全匹配(这里用*表示取原表所有列,只要两张表结构一致就没问题)
    2. 数据库会直接把这个结果集里的每一行,作为一条完整的记录插入到目标表中,不需要额外用VALUES来包裹,因为SELECT已经提供了符合要求的、现成的行数据集合

简单说,VALUES是给你手动填值用的,SELECT是直接拿查询出来的现成数据用的,两种都是INSERT语句的合法用法,只要数据源和目标表结构匹配就能正常运行。

内容的提问来源于stack exchange,提问作者Beth Tian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:47:08