创建一个新表并复制另一个表的结构和数据到这张表
CREATE TABLE 新建的表名
AS
SELECT * FROM 已经存在的表的表名
其中 AS 可以省略,需要复制指定列结构和数据的时候可以将 * 切换为具体的列名,与一般的 SELECT 查询指定字段写法一致。
SELECT INTO 复制一个表数据到另一张表
(MYSQL 不支持该写法,但支持INSERT INTO … SELECT)
语法示例
- 复制所有列数据(可以当作备份操作)
SELECT * INTO 新表表名 FROM 源表表名;
- 复制指定列数据
SELECT name, sex INTO 新表表名 FROM 源表表名;
- 复制源表指定条件的数据
SELECT * INTO 新表表名 FROM 源表表名 WHERE 源表需要符合的条件;
条件就是一般的 某个字段等于某某某 等条件。
- 复制多个表的数据到一张表内
SELECT 源表表名.源表字段1, 源表2表名.字段1, 源表2表名.源表2字段2
INTO 新表表名
FROM 源表表名
LEFT JOIN 源表2表名
ON 源表表名.id=源表2表名.pid;
- 使用 SELECT INTO 创建一个新的空表。只需添加使查询没有数据返回的 WHERE 子句即可,例如:
SELECT * INTO 新表表名 FROM 源表表名 WHERE 0=1;
因为 0=1 永不成立,所以无数据返回,则只复制表结构,创建空表。
INSERT INTO … SELECT 从一个表复制数据,把数据插入到一个已存在的表中
- 复制一个表的所有数据到另一个已存在的表
INSERT INTO table2 SELECT * FROM table1;
- 复制指定的列数据到另一个已存在的表中
INSERT INTO table2 (column_name(s)) SELECT column_name(s) FROM table1;
示例:
INSERT INTO table2 (name, sex) SELECT wname, sex FROM table1;
添加条件则如下示例:
INSERT INTO table2 (name, sex) SELECT wname, sex FROM table1 WHERE id=10;
区分
select into from 和 insert into select 都可以用来复制表
主要区别为:
select into from 要求目标表不存在,因为在插入时会自动创建
insert into select from 要求目标表已存在
- 复制表结构及其数据:
create table table_name_new as select * from table_name_old - 只复制表结构:
create table table_name_new as select * from table_name_old where 1=2;
或者:
create table table_name_new like table_name_old - 只复制表数据:
如果两个表结构一样:
insert into table_name_new select * from table_name_old
如果两个表结构不一样:
insert into table_name_new(column1,column2…) select column1,column2… from table_name_old
部分总结来源于各大学习网站