0

0

insert values和insert select语法有什么不同_mysql写法区别

P粉602998670

P粉602998670

发布时间:2025-12-31 03:51:11

|

581人浏览过

|

来源于php中文网

原创

INSERT ... VALUES 用于手动插入静态值,适用于明确具体值且不依赖现有数据的场景;INSERT ... SELECT 用于从已有表动态查询并插入数据,适用于数据迁移、归档等需基于条件筛选的场景。

insert values和insert select语法有什么不同_mysql写法区别

INSERT ... VALUESINSERT ... SELECT 是 MySQL 中两类根本不同的插入方式,不是写法风格差异,而是数据来源和语义完全不同:前者是「手动提供静态值」,后者是「从已有表动态查出数据再插入」。


什么时候该用 INSERT ... VALUES

当你明确知道要插入哪些具体值(比如注册一个新用户、录入一条订单),且这些值不依赖数据库中已有的行时,就用它。

  • 支持单行插入:
    INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
  • 也支持多行批量插入(性能更好):
    INSERT INTO users (name, email) VALUES 
    ('Bob', 'bob@example.com'),
    ('Charlie', 'c@example.com'),
    ('Diana', 'd@example.com');
  • 不能省略 VALUES 关键字 —— 写成 INSERT INTO t VALUES (1) SELECT ... 会直接报错 ERROR 1064
  • 值必须与列顺序、类型严格匹配;字符串/日期要用单引号包裹,如 '2025-12-30'

什么时候必须用 INSERT ... SELECT

当你想把「另一个表里符合条件的数据」搬过来,或者做数据归档、迁移、去重、补全等操作时,只能靠它。

  • 目标表必须已存在,且字段数量/类型要兼容(或显式转换):
    INSERT INTO archive_orders (order_id, amount, created_at)
    SELECT id, total, created FROM orders WHERE status = 'shipped';
  • 可以混用常量和字段:
    INSERT INTO logs (event, source, created_at) 
    SELECT 'user_login', 'web', NOW() FROM users WHERE last_login > '2025-12-01';
  • 绝对不能加 VALUES —— 常见错误:INSERT INTO t(col) VALUES (SELECT ...) 语法非法
  • 若目标表有主键/唯一约束,而 SELECT 出的值冲突,整条语句会失败(除非加 ON DUPLICATE KEY UPDATE 或改用 REPLACE INTO

容易踩的坑:列名、NULL 和默认值处理

两者对缺失字段的处理逻辑不同,这点极易引发静默错误。

PPT.AI
PPT.AI

AI PPT制作工具

下载
  • INSERT ... VALUES:没写的列,若允许 NULL 就填 NULL;若有 DEFAULT 就用默认值;若既不允许 NULL 又没默认值,直接报错 ERROR 1364
  • INSERT ... SELECT:SELECT 返回的列数必须等于 INSERT 指定的列数。少一列?报错;多一列?也报错。不会自动补 NULL 或默认值,除非你在 SELECT 里显式写 NULL AS col_name
  • 别依赖表结构顺序 —— 即使你省略列名写 INSERT INTO t VALUES (...),一旦后续加了新字段或调整顺序,语句就可能插错列甚至失败

性能与可读性建议

没有“哪个更快”的绝对答案,关键看场景。

  • 插入几十条固定测试数据?用 VALUES 多行写法最简洁高效
  • 从日志表抽取上万条成功支付记录到宽表?SELECT 方式天然批处理,还支持 WHERE/JOIN/GROUP BY 过滤聚合
  • 想避免手写大量 VALUES?可以用程序生成 SQL,但注意单条语句别超 max_allowed_packet(默认 64MB)
  • 线上大批量迁移?建议加 LOW_PRIORITY 或分批次执行,避免锁表太久影响查询

MySQL 不强制你选哪一种,但混淆它们的语义(比如误以为 VALUES 后能跟子查询)会导致语法错误或数据错位——这种错往往在上线后才暴露,且难以回溯。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

674

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

319

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

345

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1084

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

355

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

671

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

564

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

408

2024.04.29

桌面文件位置介绍
桌面文件位置介绍

本专题整合了桌面文件相关教程,阅读专题下面的文章了解更多内容。

0

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 776人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号