天天看點

SQL點滴14—編輯資料

資料庫中的資料編輯是我們遇到的最頻繁的工作,這一個随筆中我來總結一下最常用的資料編輯。

  

<b>select into</b>

經常遇到一種情況是,我們希望建立一個新表,表中的資料來源于原有的一個表;原有一個表,但是這個表中的資料已經很混亂,我們希望把這些資料備份出來,然後把原有的表中的資料清除,重新導入;在這些情況下我們可以使用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中。

   

<b>insert into select</b>

現在已經有這個新表了,如果我們想再從原表IntervalWaitsSample中選擇一些資料插入到這個新表中呢,這時候就需要使用insert into select語句了,下面執行個體:

insert into new_intervalwaitssample

select * from IntervalWaitsSample where wait_type='ASSEMBLY_LOAD'

這個語句就将原表IntervalWaitsSample中的所有wait_type='ASSEMBLY_LOAD'的資料插入到新表中了。

<b>insert into select union</b>

現在如果我們有一些已知的資料想把這些資料一次性寫入到目标表裡面,應該怎麼辦呢,這時候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

… …

下面是執行個體:

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'

使用表值構造函數

我們還可以直接使用表值構造函數,這個更加簡單直接,代碼如下:

values

('ASYNC_NETWORK_IO','2011-05-09 16:50:00.973','0.00'),

('ASYNC_NETWORK_IO','2011-05-09 17:00:00.020','0.00'),

('ASYNC_NETWORK_IO','2011-05-09 17:15:00.123','0.00'),

('ASYNC_NETWORK_IO','2011-05-09 17:25:00.190','0.00')

<b>從表中“剪切”資料</b>

還有一種情況,假設我們想從一個表中的資料删除幾條資料,然後把這些删除的資料放到另外一個表中。這個動作就像使用剪切,粘貼一樣。不過這種情況要注意,他隻能從使用者表中剪切資料,不能從視圖中剪切資料。它的文法如下

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關鍵字。

<b>可見即可得的編輯</b>

如果我們是應用程式開發,我相信大多數人還是更願意使用SQL Server Management Studio中的圖像化界面來操作資料,畢竟提供了這麼多強大的功能,為什麼不用呢。記得我曾經提到過Oracle中可以直接修改sql語句選擇得到的資料,當時質問Microsoft SQL Server為何沒有提供這樣強大的功能。呵呵,今天發現SQL Server還是提供了這樣的功能。不過這種修改隻能是單獨一個表,如果在這個查詢語句中有内連接配接之類的估計就不行了。廢話不說,上圖:

點選要修改的表右擊選擇Edit top 200 rows

當打開編輯界面的時候,SQL server上面會多出一個标簽

SQL點滴14—編輯資料

,滑鼠滑到這個标簽上,再滑到Panel上,再滑到SQL上,點選SQL,或者在編輯界面右擊也能看到。如圖1

SQL點滴14—編輯資料

圖1

這時候在上面的文字區就可以編寫自己想要修改的資料的查詢語句如下列:

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')

這裡我們想要修改wait_type=’ABR’的資料,點選查詢按鈕 ,在下面的表格内就可以看到所有符合條件的資料,這時候就可以修改這些資料了,注意改好之後按Enter鍵才會寫到資料庫裡面。這樣做是不是很偷懶呢呵呵,不用寫update語句,直接在裡面修改。

<b>使用編輯器複制粘貼資料</b>

 還有一種情況可以使用編輯器代替上面的insert into select語句, 如果兩個表的字段完全一樣,我們從一個表中查詢得到資料,然後複制到另外一個表中。

首先點選資料行的開頭,選中整行,然後點選copy如圖2

SQL點滴14—編輯資料

然後右擊想要插入資料的第二個表,滑鼠拖動滾動條到最後,直到顯示一行全部都是空值的一行,然後右擊paste,按Enter鍵,這樣一條資料就插入進去了。如圖3

SQL點滴14—編輯資料

這些都是在平時工作中見到的,覺得很有意思在這裡記錄下來。這些雕蟲小技對于資料庫技術大牛來時不值得一提,還望大牛們看到了不要笑我班門弄斧啊。