【你也能从零基础学会网站开发】SQL Server 一篇吃透 INSERT INTO SELECT vs SELECT INTO 完整案例+避坑指南

张开发
2026/4/11 17:42:55 15 分钟阅读

分享文章

【你也能从零基础学会网站开发】SQL Server 一篇吃透 INSERT INTO SELECT vs SELECT INTO 完整案例+避坑指南
个人主页极客小俊✍ 作者简介程序猿、设计师、技术分享 希望大家多多支持, 我们一起学习和进步 欢迎评论 ❤️点赞评论 收藏 加关注目录前言INSERT INTO SELECT最常用往已有表插数据案例实战SELECT INTO最快捷自动建表插数据案例实战最后 混淆区分 避免踩坑前言我们在开发、测试过程中经常会遇到需要表复制的情况比如将一个table1的数据的部分字段复制到table2中或者将整个table1复制到table2中这时候我们就要使用 INSERT INTO SELECT和SELECT INTO 表复制语句了~INSERT INTO SELECT最常用往已有表插数据这个语法我其实在之前的教程中已经讲过今天我们就再次复盘一下也就是可以将一个表中的数据复制到另一个表!语法规则INSERTINTO目标表名(字段1,字段2,...,字段Z)SELECT字段A,字段B,...,字段ZFROM源表名WHERE条件;目标表名你想要插入数据的表(字段1, 字段2, ..., 字段Z)目标表中你希望插入数据的字段,注意,这些字段的顺序和数量要与select 语句中返回的字段相匹配和对应才行~SELECT 字段A, 字段B, ..., 字段Z从源表中选择的字段, 这些字段的数据将被插入到目标表中!FROM 源表名也就是指定了数据来自哪个表!WHERE 条件可选用于过滤源表中的行只有满足条件的数据行才会被复制到目标表中!注意这个语法的核心就是目标表必须提前建好把另一张表或多张表的查询结果直接插入到这个已存在的表中相当于给已有表格填新数据~使用场景通常我们在一些比较小的场景下会使用到比如:数据备份、数据汇总、跨表迁移案例实战举个例子为了方便测试大家可以使用以下测试数据~-- 1. 学生表(student)字段-学号、姓名、年龄、性别、班级CREATETABLEstudent(num_idINT,usernameVARCHAR(20),ageINT,sexVARCHAR(4),classVARCHAR(20))先拿到SQL Server 2000中执行一下如图然后插入以下测试数据INSERTINTOstudentVALUES(1001,张三,18,男,高一(1)班)INSERTINTOstudentVALUES(1002,李四,17,女,高一(1)班)INSERTINTOstudentVALUES(1003,王五,18,男,高一(2)班)INSERTINTOstudentVALUES(1004,赵六,17,女,高一(2)班)INSERTINTOstudentVALUES(1005,钱七,18,男,高一(1)班)INSERTINTOstudentVALUES(1006,孙八,17,女,高一(3)班)INSERTINTOstudentVALUES(1007,周九,18,男,高一(3)班)INSERTINTOstudentVALUES(1008,吴十,17,女,高一(3)班)如图老师表也一样-- 2. 老师表teacher字段-姓名、科目、教龄、所带班级CREATETABLEteacher(tidINT,tnameVARCHAR(20),subjectVARCHAR(20),experienceINT,sclassVARCHAR(20))INSERTINTOteacherVALUES(2001,张老师,语文,5,高一(1)班)INSERTINTOteacherVALUES(2002,李老师,数学,8,高一(2)班)INSERTINTOteacherVALUES(2003,王老师,英语,3,高一(3)班)INSERTINTOteacherVALUES(2004,刘老师,物理,10,高一(1)班)INSERTINTOteacherVALUES(2005,陈老师,化学,6,高一(2)班)如图需求把学生表的部分数据备份到备份表比如说: 条件只备份高一(1)班的学生!那首先第一步你要自己手动创建这个学生备份表(student_backup), 而且是必须提前建结构和学生表一致~SQL代码如下CREATETABLEstudent_backup(num_idINT,usernameVARCHAR(20),ageINT,sexVARCHAR(4),classVARCHAR(20))如图然后用INSERT INTO SELECT来备份并插入数据条件是只插入高一(1)班的学生!SQL 代码如下INSERTINTOstudent_backup(num_id,username,age,sex,class)SELECTnum_id,username,age,sex,classFROMstudentWHEREclass高一(1)班;如图最后我们看看结果~如图例如: 把老师表的资深老师数据汇总到新表~ 也是同理~SQL 代码如下-- 首先我们手动创建【资深老师表】提前建只保留需要的字段CREATETABLEhigh_teacher(tidINT,tnameVARCHAR(20),subjectVARCHAR(20),experienceINT,)如图然后跨表插入条件为筛选教龄5年的老师如下INSERTINTOhigh_teacherSELECTtid,tname,subject,experienceFROMteacherWHEREexperience5-- 查看插入结果SELECT*FROMhigh_teacher如图现在搞懂了INSERT INTO SELECT的使用方法了吗~SELECT INTO最快捷自动建表插数据核心规则这种方式的插入数据就不用提前建表执行语句时系统会自动根据查询结果的字段创建一张新表同时把查询到的数据写入新表!使用场景快速生成临时表、数据快照比如:临时筛选优秀学生、不用手动建表省时高效~案例实战举个例子自动创建优秀学生表, 条件筛选年龄18的学生!SQL如下SELECTnum_id,username,age,sex,classINTOhigh_studentFROMstudentWHEREage18如图查看结果最后 混淆区分 避免踩坑很多人出错就是没分清这2个语法的核心区别整理成表格一目了然收藏起来下次用的时候直接对照语法是否需要提前建表核心作用适用场景INSERT INTO SELECT是必须提前建向已有表插入数据数据备份、跨表迁移SELECT INTO否自动建表新建表插入数据临时表、数据快照SELECT INTO适合快速整表复制!用SELECT INTO时自动创建的表字段名和数据类型会和查询结果一致无需手动设置在SQL Server 2000中SELECT INTO不能在视图上使用只能用于表查询INSERT INTO SELECT适合精准复制部分数据!而且用INSERT INTO SELECT时目标表的字段数量、数据类型必须和查询结果的字段完全匹配否则会报错另外不管用哪种语法插入的数据不能违反目标表的约束~点赞✍️评论收藏❤️大家的支持就是我坚持下去的动力!如果以上内容有任何错误或者不准确的地方欢迎在下面 留个言指出、或者你有更好的想法欢迎一起交流学习❤️❤️更多好玩 好用 好看的干货教程可以点击下方关注❤️微信公众号❤️说不定有意料之外的收获哦..嘿嘿嘿、嘻嘻嘻!

更多文章