SQL点滴14—编辑数据
数据库中的数据编辑是我们遇到的最频繁的工作,这一个随笔中我来总结一下最常用的数据编辑。
select into
经常遇到一种情况是,我们希望创建一个新表,表中的数据来源于原有的一个表;原有一个表,但是这个表中的数据已经很混乱,我们希望把这些数据备份出来,然后把原有的表中的数据清除,重新导入;在这些情况下我们可以使用select into语句。
如果当前用户拥有建表权限,在select语句使用关键字into可以在数据库中创建新的 表。这个语句只需要把into new_table_name加到选择出的列名之后,from关键字之前,当然数据可以来源于一个或多个表中。需要说明的是在新表中只包含select字句中查询的到的数据,没有任何键,约束,关系。下面实例:
select top(10) *
into new_intervalwaitssample
from IntervalWaitsSample
select * from new_intervalwaitssample这个语句就将IntervalWaitsSample表中的前10行数据放在一个新建的表new_intervalwaitssample中。
insert into select
现在已经有这个新表了,如果我们想再从原表IntervalWaitsSample中选择一些数据插入到这个新表中呢,这时候就需要使用insert into select语句了,下面实例:
insert into new_intervalwaitssample
select * from IntervalWaitsSample where wait_type=ASSEMBLY_LOAD这个语句就将原表IntervalWaitsSample中的所有wait_type=ASSEMBLY_LOAD的数据插入到新表中了。
insert into select union
现在如果我们有一些已知的数据想把这些数据一次性写入到目标表里面,应该怎么办呢,这时候union语句就很有用了,可以使用insert into select union语句,注意这个语句和insert into select很相似,差别就在于后面的select语句使用了union把多个select连接起来。
insert into select value11 , value12 , value13
union select value21 , value22 , value23
union select value31 , value32 , value33
… …下面是实例:
insert into new_intervalwaitssample
select ASYNC_NETWORK_IO,2011-05-09 16:50:00.973,0.00 union
select ASYNC_NETWORK_IO,2011-05-09 17:00:00.020,0.00 union
select ASYNC_NETWORK_IO,2011-05-09 17:15:00.123,0.00 union
select ASYNC_NETWORK_IO,2011-05-09 17:25:00.190,0.00
从表中“剪切”数据
还有一种情况,假设我们想从一个表中的数据删除几条数据,然后把这些删除的数据放到另外一个表中。这个动作就像使用剪切,粘贴一样。不过这种情况要注意,他只能从用户表中剪切数据,不能从视图中剪切数据。它的语法如下
Delete sourcetable
output deleted.value1,deleted.value2,deleted.value3
into targettable
from targettable where … …下面是实例
delete WaitStats
output
deleted.dt,
deleted.wait_type,
deleted.waiting_tasks_count,
deleted.wait_time_ms,
deleted.max_wait_time_ms,
deleted.signal_wait_time_ms
into new_waitestats
where WaitStats.wait_type=ABR要注意的是这里有一个很少见的关键字deleted,它是当前要删除的表的别名,这个有点像类中的this关