欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解(SQL数据库和Oracle数据库的区别)

程序员文章站 2022-05-27 13:37:06
1.insert into select语句 语句形式为:insert into table2(field1,field2,...) select value1,valu...

1.insert into select语句

语句形式为:insert into table2(field1,field2,...) select value1,value2,... from table1

或者:insert into table2 select * from table1

注意:(1)要求目标表table2必须存在,并且字段field,field2...也必须存在

(2)注意table2的主键约束,如果table2有主键而且不为空,则 field1, field2...中必须包括主键

(3)注意语法,不要加values,和插入一条数据的sql混了,不要写成:

insert into table2(field1,field2,...) values (select value1,value2,... from table1)

由于目标表table2已经存在,所以我们除了插入源表table1的字段外,还可以插入常量。示例如下:

 --1.创建测试表 
 create table table1 
 ( 
 a varchar(10), 
 b varchar(10), 
 c varchar(10)
 )
 create table table2 
 ( 
 a varchar(10), 
 c varchar(10), 
 d int
 )

 --2.创建测试数据 
 insert into table1 values('赵','asds','90') 
 insert into table1 values('钱','asds','100') 
 insert into table1 values('孙','asds','80') 
 insert into table1 values('李','asds',null) 

 select * from table2 

--3.insert into select语句复制表数据部分列和常值

insert into table2(a, c, d) select a,c,5 from table1

或:insert into table2 select * from table1

--4.显示更新后的结果 

select * from table2 

 --5.删除测试表 
 drop table table1 
 drop table table2

2.select into from语句

语句形式为:select vale1, value2 into table2 from table1

要求目标表table2不存在,因为在插入时会自动创建表table2,并将table1中指定字段数据复制到table2中。示例如下:

--1.创建测试表 
 create table table1 
 ( 
 a varchar(10), 
 b varchar(10), 
 c varchar(10)
 )

 --2.创建测试数据 
 insert into table1 values('赵','asds','90') 
 insert into table1 values('钱','asds','100') 
 insert into table1 values('孙','asds','80') 
 insert into table1 values('李','asds',null) 

 --3.select into from语句创建表table2并复制数据 
 select a,c into table2 from table1 
 
 --4.显示更新后的结果 
 select * from table2 

 --5.删除测试表 
 drop table table1 
 drop table table2 

注意:如果在sql/plus或者pl/sql执行这条语句,会报"ora-00905:缺失关键字"错误,原因是pl/sql与t-sql的区别。
t-sql中该句正常,但pl/sql中解释是:
select..into is part of pl/sql language which means you have to use it inside a pl/sql block. you can not use it in a sql statement outside of pl/sql.
即不能单独作为一条sql语句执行,一般在pl/sql程序块(block)中使用。

如果想在pl/sql中实现该功能,可使用create table newtable as select * from ...:
如: create table newtable as select * from atable;

newtable 除了没有键,其他的和atable一样

---------sql select into语法介绍
sql select into 语句可用于创建表的备份复件。
select into 语句
select into 语句从一个表中选取数据,然后把数据插入另一个表中。
select into 语句常用于创建表的备份复件或者用于对记录进行存档。
sql select into 语法
您可以把所有的列插入新表:
select * into new_table_name [in externaldatabase] from old_tablename
或者只把希望的列插入新表:
select column_name(s) into new_table_name [in externaldatabase] from old_tablename
sql select into 实例 - 制作备份复件
下面的例子会制作 "persons" 表的备份复件:
select * into persons_backup from persons
in 子句可用于向另一个数据库中拷贝表:
select * into persons in 'backup.mdb' from persons
如果我们希望拷贝某些域,可以在 select 语句后列出这些域:
select lastname,firstname
into persons_backup
from persons
sql select into 实例 - 带有 where 子句
我们也可以添加 where 子句。
下面的例子通过从 "persons" 表中提取居住在 "beijing" 的人的信息,创建了一个带有两个列的名为 "persons_backup" 的表:
select lastname,firstname into persons_backup from persons where city='beijing'
sql select into 实例 - 被连接的表
从一个以上的表中选取数据也是可以做到的。
下面的例子会创建一个名为 "persons_order_backup" 的新表,其中包含了从 persons 和 orders 两个表中取得的信息:
select persons.lastname,orders.orderno
into persons_order_backup
from persons
inner join orders
on persons.id_p=orders.id_p

mysql中select into 和sql中的select into 对比
现在有张表为student,我想将这个表里面的数据复制到一个为dust的新表中去。

answer 01:
create table dust select * from student;//用于复制前未创建新表dust的情况下
answer 02:
insert into dust select * from student;//已经创建了新表dust的情况下

现在使用select..into..语句实现以上东东。

mysql不支持select into语句直接备份表结构和数据,一些种方法可以代替, 也有其它方法可以处理,总结如下:

方法1:

mysql不支持:
select * into new_table_name from old_table_name; 这是sql server中的用法
替代方法:
create table new_table_name (select * from old_table_name);

方法2:

1.先备份表结构和数据
#导出命令 -u用户名 -p密码 -h主机ip地址 数据库名 表名1 > 导出文件.sql
mysqldump -uroot -proot -h192.168.0.88 ok_db oktable2 > ok_db.sql

2.修改备份表的名字
3.登录mysql
4.选择数据库
5.执行: source 备份表的路径 如:source d:/ok_db.sql 回车即可。
6.完成.

mysql select into outfile用于导出指定的查询数据到文件如下:

1.导出表中所有数据到c盘根目录outfile.txt中如下:
select * into outfile 'c://outfile.txt' from test;

2.导出表中指定查询条件2005-06-08号的数据到c盘根目录outfile1.txt中如下:
select * into outfile 'c://outfile.txt' from test where begindate='2008-06-08';

mysql> load data local infile "d:/gpsdata.txt" into table positiondata fields terminated by ';' (userid,latitude,longitude,altitude,speed,innerid,repo
rttime,status);

load data [low_priority concurrent] [local] infile 'file_name.txt'
[replace ignore]
into table tbl_name
[fields
[terminated by 'string']
[[optionally] enclosed by 'char']
[escaped by 'char' ]
]
[lines
[starting by 'string']
[terminated by 'string']
]
[ignore number lines]
[(col_name_or_user_var,...)]
[set col_name = expr,...)]

fields和lines在前面,(col_name_or_user_var,…)在后面 如果你使用的时候直接把要写的这些属性放在表名后面,这样是不正确的,一定要写到fields和lines的后面!

补充一点,a表数据 复制到b表,b表不能有自增id

如果有自增id,则不插入自增

insert into b (title) select title from a