🚀 个人主页 极客小俊
✍🏻 作者简介:程序猿、设计师、技术分享
🐋 希望大家多多支持, 我们一起学习和进步!
🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注


前言
我们在开发、测试过程中,经常会遇到需要表复制的情况,
比如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们
就要使用 INSERT INTO SELECT和SELECT INTO 表复制语句了~
INSERT INTO SELECT(最常用,往已有表插数据)
这个语法,我其实在之前的教程中已经讲过,今天我们就再次复盘一下
也就是可以将一个表中的数据复制到另一个表!
语法规则
INSERT INTO 目标表名 (字段1, 字段2, ..., 字段Z)
SELECT 字段A, 字段B, ..., 字段Z
FROM 源表名
WHERE 条件;
目标表名:你想要插入数据的表
(字段1, 字段2, ..., 字段Z):目标表中你希望插入数据的字段,
注意,这些字段的顺序和数量要与select 语句中返回的字段相匹配和对应才行~
SELECT 字段A, 字段B, ..., 字段Z:从源表中选择的字段, 这些字段的数据将被插入到目标表中!
FROM 源表名:也就是指定了数据来自哪个表!
WHERE 条件(可选):用于过滤源表中的行,只有满足条件的数据行才会被复制到目标表中!
注意
这个语法的核心就是目标表必须提前建好,把另一张表或多张表的查询结果,直接插入到这个已存在的表中,相当于给已有表格填新数据~
使用场景:
通常我们在一些比较小的场景下会使用到,比如: 数据备份、数据汇总、跨表迁移
案例实战
举个例子 为了方便测试,大家可以使用以下测试数据~
-- 1. 学生表(student)(字段->学号、姓名、年龄、性别、班级)
CREATE TABLE student (
num_id INT,
username VARCHAR(20),
age INT,
sex VARCHAR(4),
class VARCHAR(20)
)
先拿到SQL Server 2000中执行一下
如图

然后插入以下测试数据
INSERT INTO student VALUES(1001, '张三', 18, '男', '高一(1)班')
INSERT INTO student VALUES(1002, '李四', 17, '女', '高一(1)班')
INSERT INTO student VALUES(1003, '王五', 18, '男', '高一(2)班')
INSERT INTO student VALUES(1004, '赵六', 17, '女', '高一(2)班')
INSERT INTO student VALUES(1005, '钱七', 18, '男', '高一(1)班')
INSERT INTO student VALUES(1006, '孙八', 17, '女', '高一(3)班')
INSERT INTO student VALUES(1007, '周九', 18, '男', '高一(3)班')
INSERT INTO student VALUES(1008, '吴十', 17, '女', '高一(3)班')
如图

老师表也一样
-- 2. 老师表teacher(字段->姓名、科目、教龄、所带班级)
CREATE TABLE teacher (
tid INT,
tname VARCHAR(20),
subject VARCHAR(20),
experience INT,
sclass VARCHAR(20)
)
INSERT INTO teacher VALUES(2001, '张老师', '语文', 5, '高一(1)班')
INSERT INTO teacher VALUES(2002, '李老师', '数学', 8, '高一(2)班')
INSERT INTO teacher VALUES(2003, '王老师', '英语', 3, '高一(3)班')
INSERT INTO teacher VALUES(2004, '刘老师', '物理', 10, '高一(1)班')
INSERT INTO teacher VALUES(2005, '陈老师', '化学', 6, '高一(2)班')
如图

需求
把学生表的部分数据备份到备份表 比如说: 条件只备份高一(1)班的学生!
那首先第一步你要自己手动创建这个学生备份表(student_backup), 而且是必须提前建,结构和学生表一致~
SQL代码如下
CREATE TABLE student_backup (
num_id INT,
username VARCHAR(20),
age INT,
sex VARCHAR(4),
class VARCHAR(20)
)
如图

然后用INSERT INTO SELECT 来备份并插入数据条件是只插入高一(1)班)的学生!
SQL 代码如下
INSERT INTO student_backup (num_id, username,age,sex,class)
SELECT num_id, username,age,sex,class
FROM student
WHERE class = '高一(1)班';
如图

最后我们看看结果~
如图

例如: 把老师表的资深老师数据汇总到新表~ 也是同理~
SQL 代码如下
-- 首先我们手动创建【资深老师表】(提前建,只保留需要的字段)
CREATE TABLE high_teacher (
tid INT,
tname VARCHAR(20),
subject VARCHAR(20),
experience INT,
)
如图

然后跨表插入,条件为筛选教龄>5年的老师
如下
INSERT INTO high_teacher
SELECT tid, tname, subject, experience
FROM teacher
WHERE experience > 5
-- 查看插入结果
SELECT * FROM high_teacher
如图

现在搞懂了INSERT INTO SELECT的使用方法了吗?~
SELECT INTO(最快捷,自动建表+插数据)
核心规则
这种方式的插入数据就不用提前建表,执行语句时,系统会自动根据查询结果的字段,创建一张新表,同时把查询到的数据写入新表!
使用场景:快速生成临时表、数据快照
比如:临时筛选优秀学生、不用手动建表,省时高效~
案例实战
举个例子
自动创建优秀学生表, 条件筛选年龄=18的学生!
SQL如下
SELECT num_id, username, age, sex,class
INTO high_student
FROM student
WHERE age = 18
如图

查看结果

最后 混淆区分 避免踩坑
很多人出错,就是没分清这2个语法的核心区别,整理成表格,一目了然,收藏起来,下次用的时候直接对照!
| 语法 | 是否需要提前建表 | 核心作用 | 适用场景 |
|---|---|---|---|
| INSERT INTO SELECT | 是(必须提前建) | 向已有表插入数据 | 数据备份、跨表迁移 |
| SELECT INTO | 否(自动建表) | 新建表+插入数据 | 临时表、数据快照 |
SELECT INTO 适合快速整表复制!
用SELECT INTO 时,自动创建的表,字段名和数据类型会和查询结果一致,无需手动设置
在SQL Server 2000 中,SELECT INTO 不能在视图上使用,只能用于表查询
INSERT INTO SELECT 适合精准复制部分数据!
而且用 INSERT INTO SELECT 时,目标表的字段数量、数据类型,必须和查询结果的字段完全匹配,否则会报错
另外不管用哪种语法,插入的数据不能违反目标表的约束~


"👍点赞" "✍️评论" "收藏❤️"
欢迎一起交流学习❤️❤️💛💛💚💚

好玩 好用 好看的干货教程可以
点击下方关注❤️
微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇


962

被折叠的 条评论
为什么被折叠?



