數據庫中的數據編輯是我們遇到的最頻繁的工作,這一個隨筆中我來總結一下最常用的數據編輯。
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關鍵字。
可見即可得的編輯
如果我們是應用程序開發,我相信大多數人還是更愿意使用SQL Server Management Studio中的圖像化界面來操作數據,畢竟提供了這么多強大的功能,為什么不用呢。記得我曾經提到過Oracle中可以直接修改sql語句選擇得到的數據,當時質問Microsoft SQL Server為何沒有提供這樣強大的功能。呵呵,今天發現SQL Server還是提供了這樣的功能。不過這種修改只能是單獨一個表,如果在這個查詢語句中有內連接之類的估計就不行了。廢話不說,上圖:
SELECT TOP (1000) dt, wait_type, waiting_tasks_count, wait_time_ms, max_wait_time_ms, signal_wait_time_ms
FROM new_waitestats
WHERE (wait_type = 'ABR')
使用編輯器復制粘貼數據
還有一種情況可以使用編輯器代替上面的insert into select語句, 如果兩個表的字段完全一樣,我們從一個表中查詢得到數據,然后復制到另外一個表中。
這些都是在平時工作中見到的,覺得很有意思在這里記錄下來。這些雕蟲小技對于數據庫技術大牛來時不值得一提,還望大牛們看到了不要笑我班門弄斧啊。
新聞熱點
疑難解答