您的位置:首页 > 其它

SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

2015-07-07 10:09 260 查看
第一句:SELECT * INTO [ToTable] FROM [FromTable]

第二句:INSERT INTO [ToTable] ([fild_One],[fild_Two]) SELECT [fild_One], 8 FROM [FromTable]

以上两句都是将 [FromTable] 的数据插入到 [ToTable],但两句又有区别的:

第一句(SELECT INTO FROM)要求目标表[ToTable]不存在,因为在插入时会自动创建。

第二句(INSERT INTO SELECT FROM)要求目标表[ToTable]存在,由于目标表已经存在,所以我们除了插入源表[FromTable]的字段外,还可以插入常量,如例中的:8。

Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少。但我们在开发、测试过程中,经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。

1.INSERT INTO SELECT语句

语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1

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

--1.创建测试表
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
create TABLE Table2
(
a varchar(10),
c varchar(10),
d int,
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
GO
--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)
GO
select * from Table2
--3.INSERT INTO SELECT语句复制表数据
Insert into Table2(a, c, d) select a,c,5 from Table1
GO
--4.显示更新后的结果
select * from Table2
GO
--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),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON [PRIMARY]
GO
--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)
GO
--3.SELECT INTO FROM语句创建表Table2并复制数据
select a,c INTO Table2 from Table1
GO
--4.显示更新后的结果
select * from Table2
GO
--5.删除测试表
drop TABLE Table1
drop TABLE Table2


一、启动与退出
1、进入MySQL:
启动MySQL Command Line Client(MySQL的DOS界面),直接输入安装时的密码即可。此时的提示符是:mysql>

2、退出MySQL:
quit或exit

3、修改密码  
格式:mysqladmin -u用户名 -p旧密码 password 新密码  
例1:给root加个密码ab12。首先在DOS下进入目录mysqlbin,然后键入以下命令  
   mysqladmin -uroot -password ab12   
   注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。   
例2:再将root的密码改为djg345
   mysqladmin -uroot -pab12 password djg345

二、导入与导出
1、导出整个数据库
命令:mysqldump -u 用户名 -p --default-character-set=utf8 数据库名 > 导出的文件名(数据库默认编码是urf-8)
例如:mysqldump -u root -p 1234 dbname > test.sql

2、导出一个表
命令:mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
例如:mysqldump -u root -p 1234 tbname > test.sql

3、导出一个数据库结构
例如:mysqldump -u root -p -d –add-drop-table dbname > test.sql
-d 没有数据
–add-drop-table 在每个create语句之前增加一个drop table

4、导入数据库
A:常用source 命令(进入mysql数据库控制台)
例如:$ mysql -u root -p
mysql>use 数据库
然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql>source wcnc_db.sql

B:使用mysqldump命令
例如:mysqldump -u username -p dbname < filename.sql

C:使用mysql命令
例如:mysql -u username -p dbname < filename.sql

5、将txt数据导入到特定表当中
命令:load data local infile "数据文件名“ into table 表名;
例如:
数据库名:user,表名:userinfo
表字段:id、name、age、sex
数据文件名为:userinfo.txt
1 张三 24 男
2 李斯 22 男
3 韩美美 25 女
……
导入数据命令:
$ mysql -uroot -ptest
mysql > use user;
mysql > load data local infile "userinfo.txt" into table userinfo;

注:数据文件与mysql进入是在一个目录下,否则要写全路径

三、复制表与表结构
1、复制表结构及数据到新表
命令:CREATE TABLE 新表 SELECT * FROM 旧表
[注:]这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用 delete from newtable; 来删除。
不过这种方法的一个最不好的地方就是新表中没有了旧表的primary key、Extra(auto_increment)等属性。需要自己用"alter"添加,而且容易搞错。

2、只复制表结构到新表
命令:CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2

CREATE TABLE 新表 LIKE 旧表

3、复制旧表的数据到新表(假设两个表结构一样)
命令:INSERT INTO 新表 SELECT * FROM 旧表

4、复制旧表的数据到新表(假设两个表结构不一样)
命令:INSERT INTO 新表(字段1,字段2,.......) SELECT 字段1,字段2,...... FROM 旧表

5、可以将表1结构复制到表2
命令:SELECT * INTO 表2 FROM 表1 WHERE 1=2

6、可以将表1内容全部复制到表2
命令:SELECT * INTO 表2 FROM 表1

7、 显示创建表语句
命令:show create table 旧表;
这样会将旧表的创建命令列出。我们只需要将该命令拷贝出来,更改table的名字,就可以建立一个完全一样的表

8、mysqldump
命令:用mysqldump将表dump出来,改名字后再导回去或者直接在命令行中运行

四、库操作
1、创建数据库
命令:create database <数据库名> [default charset 字符集]

例如:建立一个名为 xxxx 的数据库,默认建表的字符集为utf8
mysql> create database xxxx default charset utf8;

2、显示所有的数据库
命令:show databases (注意:最后有个s)
例如:mysql> show databases;

3、删除数据库
命令:drop database <数据库名>
例如:删除名为 xxxx 的数据库
mysql> drop database xxxx;

4、连接数据库
命令: use <数据库名>
例如:如果 xxxx 数据库存在,尝试存取它:
mysql> use xxxx;
屏幕提示:Database changed

5、查看当前使用的数据库
命令:mysql> select database();

6、当前数据库包含的表信息
命令:mysql> show tables; (注意:最后有个s)

五、表操作,操作之前应连接某个数据库
1、建表
命令:create table <表名> ( <字段名1> <类型1> [,..<字段名n> <类型n>]);
例如:mysql > create table MyClass(
> id int(4) not null primary key auto_increment,
> name char(20) not null,
> sex int(4) not null default '0',
> degree double(16,2)
> )ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

2、获取表结构
命令: desc 表名,或者show columns from 表名
例如:mysql > DESCRIBE MyClass;
mysql > desc MyClass;
mysql > show columns from MyClass;

3、删除表
命令:drop table <表名>
例如:删除表名为 MyClass 的表
mysql> drop table MyClass;

4、插入数据
命令:insert into <表名> [( <字段名1>[,..<字段名n > ])] values ( 值1 )[, ( 值n )]
例如:往表 MyClass中插入二条记录, 这二条记录表示:编号为1的名为Tom的成绩为96.45, 编号为2 的名为Joan 的成绩为82.99,编号为3 的名为Wang 的成绩为96.5.
mysql > insert into MyClass values(1,'Tom',96.45),(2,'Joan',82.99), (2,'Wang', 96.59);

5、查询表中的数据
1)查询所有行
命令: select <字段1,字段2,...> from < 表名 > where < 表达式 > [distinct:去除重复字段]
例如:查看表 MyClass 中所有数据
mysql > select * from MyClass;

2)查询前几行数据
例如:查看表 MyClass 中前2行数据
mysql > select * from MyClass order by id limit 0,2;
或者:
mysql > select * from MyClass limit 0,2;

6、删除表中数据
1)命令:delete from 表名 where 表达式
例如:删除表 MyClass中编号为1 的记录
mysql> delete from MyClass where id=1;

2)命令:truncate table 表名

例如:删除表 MyClass 中的记录

mysql > truncate table MyClass;

[注:]delete 删除的表内容再插入数据时,自增字段从删除的那个开始。

truncate 删除的表内容,相当于删除表后再建一个一样的表,自增字段从1开始。

7、修改表中数据
命令:update 表名 set 字段=新值,… where 条件
例如:mysql > update MyClass set name='Mary' where id=1;

8、在表中增加字段:
命令:alter table 表名 add字段 类型其他;
例如:在表MyClass中添加了一个字段passtest,类型为int(4),默认值为0
mysql > alter table MyClass add passtest int(4) default '0';

9、重置表自增字段:

命令:

9、更改表名:
命令:rename table 原表名 to 新表名;
例如:在表MyClass名字更改为YouClass
mysql> rename table MyClass to YouClass;

10、更新字段内容
命令:update 表名 set 字段名 = 新内容
update 表名 set 字段名 = replace(字段名,'旧内容','新内容');
例如:文章前面加入4个空格
update article set content=concat('  ',content);

六、字段类型
1.INT[(M)] 型: 正常大小整数类型
2.DOUBLE[(M,D)] [ZEROFILL] 型:正常大小(双精密)浮点数字类型
3.DATE 日期类型:支持的范围是1000-01-01到9999-12-31。MySQL以YYYY-MM-DD格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列
4.CHAR(M) 型:定长字符串类型,当存储时,总是是用空格填满右边到指定的长度
5.BLOB TEXT类型,最大长度为65535(2^16-1)个字符。
6.VARCHAR型:变长字符串类型
7.导入数据库表
1)创建.sql文件
 2)先产生一个库如auction.c:mysqlbin>mysqladmin -u root -p creat auction,会提示输入密码,然后成功创建。
 3)导入auction.sql文件
   c:mysqlbin>mysql -u root -p auction < auction.sql。
  通过以上操作,就可以创建了一个数据库auction以及其中的一个表auction。

8.修改数据库
1)在mysql的表中增加字段:
    alter table dbname add column userid int(11) not null primary key auto_increment;
   这样,就在表dbname中添加了一个字段userid,类型为int(11)。

9.mysql数据库的授权
命令:mysql>grant select,insert,delete,create,drop on *.* (或test.*/user.*/..) to 用户名@localhost identified by '密码';
例如:新建一个用户帐号以便可以访问数据库,需要进行如下操作:
   mysql> grant usage
   -> ON test.*
   -> TO testuser@localhost;
   Query OK, 0 rows affected (0.15 sec)

   此后就创建了一个新用户叫:testuser,这个用户只能从localhost连接到数据库并可以连接到test 数据库。下一步,我们必须指定testuser这个用户可以执行哪些操作:
   mysql> GRANT select, insert, delete,update
   -> ON test.*
   -> TO testuser@localhost;
   Query OK, 0 rows affected (0.00 sec)

  此操作使testuser能够在每一个test数据库中的表执行SELECT,INSERT和DELETE以及UPDATE查询操作。现在我们结束操作并退出MySQL客户程序:
   mysql> exit
   Bye!

web开发中,我们经常需要将一个表的数据插入到另外一个表,有时还需要指定导入字段,设置只需要导入目标表中不存在的记录,虽然这些都可以在程序中拆分成简单sql来实现,但是用一个sql的话,会节省大量代码。下面我以mysql数据库为例分情况一一说明:

两张表:insertTest和insertTest2,前者中有测试数据

复制代码 代码如下:

create table insertTest(id int(4),name varchar(12));

insert into insertTest values(100,‘liudehua');

insert into insertTest values(101,‘zhourunfa');

insert into insertTest values(102,‘zhouhuajian');

1.如果2张表的字段一致,并且希望插入全部数据,可以用这种方法:

INSERT INTO 目标表 SELECT * FROM 来源表;

复制代码 代码如下:

insert into insertTest select * from insertTest2;

2.如果只希望导入指定字段,可以用这种方法:


复制代码 代码如下:

INSERT INTO 目标表 (字段1, 字段2, …) SELECT 字段1, 字段2, … FROM 来源表;

注意字段的顺序必须一致。

复制代码 代码如下:

insert into insertTest2(id) select id from insertTest2;

3.如果您需要只导入目标表中不存在的记录,可以使用这种方法:


复制代码 代码如下:

INSERT INTO 目标表

(字段1, 字段2, …)

SELECT 字段1, 字段2, …

FROM 来源表

WHERE not exists (select * from 目标表

where 目标表.比较字段 = 来源表.比较字段);

1>.插入多条记录:


复制代码 代码如下:

insert into insertTest2

(id,name)

select id,name

from insertTest

where not exists (select * from insertTest2

where insertTest2.id=insertTest.id);

2>.插入一条记录:


复制代码 代码如下:

insert into insertTest

(id, name)

SELECT 100, ‘liudehua'

FROM dual

WHERE not exists (select * from insertTest

where insertTest.id = 100);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: