書名: SQL Server 2016 數(shù)據(jù)庫教程(第4版)作者名: 鄭阿奇 劉啟芬 顧韻華主編本章字?jǐn)?shù): 2509字更新時(shí)間: 2019-12-20 19:40:47
3.5 命令方式操作表數(shù)據(jù)
對(duì)表數(shù)據(jù)的插入、修改和刪除還可以通過T-SQL語句來進(jìn)行,與界面操作表數(shù)據(jù)相比,通過T-SQL語句操作表數(shù)據(jù)更為靈活,功能更為強(qiáng)大。
3.5.1 插入記錄:INSERT
插入記錄使用INSERT語句,語法格式如下:
INSERT [ TOP ( 表達(dá)式 ) [ PERCENT ] ] [ INTO ] 表名 | 視圖名 [ ( 列表 ) ] VALUES ( DEFAULT | NULL | 表達(dá)式 … ) / *指定列值* / | DEFAULT VALUES / *強(qiáng)制新行包含為每個(gè)列定義的默認(rèn)值* /
說明
(1)表名:被操作的表的名稱。前面可以指定數(shù)據(jù)庫名和架構(gòu)名。
(2)視圖名:被操作的視圖名稱。有關(guān)視圖的內(nèi)容將在第4章中介紹。
(3)列表:需要插入數(shù)據(jù)的列的列表。包含了新插入行的各列的名稱。如果只給表的部分列插入數(shù)據(jù)時(shí),需要用“列列表”指出這些列。
例如,當(dāng)加入表中的記錄的某些列為空值或?yàn)槟J(rèn)值時(shí),可以在INSERT語句中給出的“列表”中省略這些列。沒有在“列表”中指出的列,它們的值根據(jù)默認(rèn)值或列屬性來確定,其原則如下。
① 具有IDENTITY屬性的列,其值由系統(tǒng)根據(jù)初值和增量值自動(dòng)計(jì)算得到;
② 具有默認(rèn)值的列,其值為默認(rèn)值;
③ 沒有默認(rèn)值的列,若允許為空值,則其值為空值;若不允許為空值,則出錯(cuò);
④ 類型為timestamp的列,系統(tǒng)自動(dòng)賦值;
⑤ 如果是計(jì)算列,則使用計(jì)算值。
(4)VALUES子句:包含各列需要插入的數(shù)據(jù)清單,數(shù)據(jù)的順序要與列的順序相對(duì)應(yīng)。若省略“列列表”,則VALUES子句給出每一列(除IDENTITY屬性和timestamp類型以外的列)的值。VALUES子句中的值可有以下3種。
① DEFAULT:指定為該列的默認(rèn)值。這要求定義表時(shí)必須指定該列的默認(rèn)值。
② NULL:指定該列為空值。
③ 表達(dá)式:可以是一個(gè)常量、變量或一個(gè)表達(dá)式,其值的數(shù)據(jù)類型要與列的數(shù)據(jù)類型一致。例如,列的數(shù)據(jù)類型為int,若插入的數(shù)據(jù)是'aaa'就會(huì)出錯(cuò)。當(dāng)數(shù)據(jù)為字符型時(shí),要用單引號(hào)括起來。
(5)DEFAULT VALUES:該關(guān)鍵字說明向當(dāng)前表中所有列均插入其默認(rèn)值。此時(shí),要求所有列均定義了默認(rèn)值。
【例3.6】向test1數(shù)據(jù)庫的表xsb1中插入如下一行數(shù)據(jù):
191301, 王林, 1, 1990-02-10, 計(jì)算機(jī), 50 , NULL
在“SSMS”中單擊“新建查詢”,在“查詢編輯器”中輸入下列T-SQL命令:
USE test1 GO INSERT INTO xsb1 VALUES('191301', '王林', 1, '1990-02-10', '計(jì)算機(jī)',50, NULL) GO
語句的執(zhí)行結(jié)果如圖3.6所示。

圖3.6 使用T-SQL語句向表中插入數(shù)據(jù)
注意
若插入數(shù)據(jù)行中含有與原有行中關(guān)鍵字相同的列值,則INSERT語句無法插入此行。
例如,如果重復(fù)執(zhí)行上述命令,系統(tǒng)顯示錯(cuò)誤信息,如圖3.7所示。

圖3.7 顯示錯(cuò)誤信息
說明
插入上例數(shù)據(jù)也可以使用以下命令:
INSERT INTO xsb1 (學(xué)號(hào), 姓名, 性別, 出生時(shí)間, 總學(xué)分) VALUES('191301', '王林', 1, '1990-02-10', 50)
或者:
INSERT INTO xsb1 VALUES('191301', '王林', 1, '1990-02-10', DEFAULT,50, NULL);
INSERT語句可以一次向表中插入多條記錄,中間用逗號(hào)隔開。
【例3.7】一次向test1數(shù)據(jù)庫xsb1表中插入兩行數(shù)據(jù):
'201301', '王海', 1, '1996-05-10', '軟件工程', 50, NULL '201302', '李娜', 0, '1996-04-12', '軟件工程', 52, NULL
命令如下:
INSERT INTO xsb1 VALUES('201301', '王海', 1, '1991-05-10', '軟件工程', 50, NULL), ('201302', '李娜', 0, '1991-04-12', '軟件工程', 52, NULL)
【例3.8】從test1數(shù)據(jù)庫表xsb1中生成計(jì)算機(jī)專業(yè)的學(xué)生表(xsb2),包括學(xué)號(hào)、姓名、出生時(shí)間、總學(xué)分、備注。
(1)用界面方式或者CREATE TABLE語句建立表xsb2,表結(jié)構(gòu)與xsb1相同。
(2)用INSERT語句向xsb2表中插入數(shù)據(jù):
INSERT INTO xsb2 SELECT * FROM xsb1 WHERE專業(yè)= '計(jì)算機(jī)'
(3)使用SELECT語句從xsb2表中查詢結(jié)果:
SELECT * FROM xsb2 / * xsb1表的內(nèi)容* /
執(zhí)行結(jié)果如圖3.8所示。

圖3.8 執(zhí)行結(jié)果
在執(zhí)行INSERT語句時(shí),如果插入的數(shù)據(jù)與約束或規(guī)則的要求產(chǎn)生沖突,或值的數(shù)據(jù)類型與列的數(shù)據(jù)類型不匹配,那么INSERT執(zhí)行失敗。
3.5.2 修改記錄:UPDATE
在T-SQL中,UPDATE語句可以用來修改表中的數(shù)據(jù)行。
語法格式:
UPDATE [ TOP ( 表達(dá)式 ) [ PERCENT ] ] { 表名 | 視圖名 } SET { 列名=表達(dá)式, … } / *賦予新值* / [ FROM <表源> …] [ WHERE <查找條件> | … ] / *指定條件* / ……
說明
(1)SET子句:用于指定要修改的列或變量名及其新值。
(2)FROM子句:指定用表來為更新操作提供數(shù)據(jù)。
(3)WHERE子句:WHERE子句中的<查找條件>指明只對(duì)滿足該條件的行進(jìn)行修改,若省略該子句,則對(duì)表中的所有行進(jìn)行修改。
【例3.9】將test1數(shù)據(jù)庫的xsb1表中學(xué)號(hào)為“191301”的學(xué)生的備注值改為“外?;フJ(rèn)學(xué)分課程”,同時(shí)將總學(xué)分+3。
USE test1 GO UPDATE xsb1 SET 備注 = '外校互認(rèn)學(xué)分課程', 總學(xué)分 = 總學(xué)分+3 WHERE學(xué)號(hào)='191301' GO
執(zhí)行完上述語句后,xsb1表學(xué)號(hào)為“191301”的學(xué)生的記錄如圖3.9所示。

圖3.9 修改數(shù)據(jù)以后的表
說明
對(duì)于學(xué)生成績(jī)管理數(shù)據(jù)庫,一般來說,學(xué)生表(xsb)總學(xué)分字段數(shù)據(jù)增加是由于在成績(jī)表(cjb)中增加了記錄(學(xué)生上一門課成績(jī)合格),這兩個(gè)表的記錄修改命令是一起完成的。
3.5.3 刪除記錄:DELETE/TRUNCATE TABLE
在T-SQL語言中,刪除表數(shù)據(jù)可以使用DELETE語句或TRUNCATE TABLE語句來實(shí)現(xiàn),分別用于刪除表中符合條件的記錄和所有記錄。
1. 刪除符合條件記錄
語法格式:
DELETE [ TOP ( 表達(dá)式 ) [ PERCENT ] ] [ FROM 表名 | 視圖名 | <表源> ] [ WHERE <查找條件> | … ] / *指定條件* /
說明
(1)[TOP(表達(dá)式)[PERCENT]]:指定將要?jiǎng)h除的任意行數(shù)或任意行的百分比。
(2)FROM子句:說明從何處刪除數(shù)據(jù)??梢詮囊韵?種類型的對(duì)象中刪除數(shù)據(jù)。
表:由“表名”指定要從其中刪除數(shù)據(jù)的表,關(guān)鍵字WITH指定目標(biāo)表所允許的一個(gè)或多個(gè)表提示,一般情況下不需要使用WITH關(guān)鍵字。
視圖:由“視圖名”指定要從其中刪除數(shù)據(jù)的視圖,注意該視圖必須可以更新,并且正確引用了一個(gè)基本表。
表源:將在介紹SELECT語句時(shí)詳細(xì)討論。
(3)WHERE子句:為刪除操作指定條件。若省略WHERE子句,則DELETE語句將刪除所有數(shù)據(jù)。
【例3.10】將test1數(shù)據(jù)庫的xsb1表中總學(xué)分為0的行刪除,使用如下語句:
USE test1 GO DELETE FROM xsb1 WHERE總學(xué)分 = 0 GO
2. 刪除表中所有記錄
使用TRUNCATE TABLE語句將刪除指定表中的所有數(shù)據(jù),因此也稱為清除表數(shù)據(jù)語句。
語法格式:
TRUNCATE TABLE 表名
說明
(1)使用TRUNCATE TABLE語句刪除了指定表中的所有行,但表結(jié)構(gòu)及其列、約束、索引等保持不變,而新行標(biāo)識(shí)所用的計(jì)數(shù)值重置為該列的初始值。如果要保留標(biāo)識(shí)計(jì)數(shù)值,則要使用DELETE語句。
(2)“TRUNCATE TABLE表名”與“DELETE表名”二者均刪除表中的全部行。但TRUNCATE TABLE比DELETE速度快,且使用的系統(tǒng)和事務(wù)日志資源少。DELETE語句每次刪除一行,并在事務(wù)日志中為所刪除的每一行記錄一項(xiàng)。而TRUNCATE TABLE通過釋放存儲(chǔ)表數(shù)據(jù)所用的數(shù)據(jù)頁來刪除數(shù)據(jù),并且只在事務(wù)日志中記錄頁的釋放。
對(duì)于由外鍵(FOREIGN KEY)約束引用的表,不能使用TRUNCATE TABLE語句刪除數(shù)據(jù),而應(yīng)使用不帶WHERE子句的DELETE語句。另外,TRUNCATE TABLE語句也不能用于參與了索引視圖的表。
(3)表記錄刪除后不能恢復(fù)。
(4)如果刪除表記錄的同時(shí)刪除表結(jié)構(gòu),則使用“DROP TABLE表名”命令。
例如,刪除test1數(shù)據(jù)庫的xsb1和xsb2表中的所有行。
USE test1 GO DELETE xsb1 GO TRUNCATE TABLE xsb2 GO DROP TABLE xsb3 GO SELECT * FROM xsb1 / *顯示沒有記錄* / GO SELECT * FROM xsb2 / *顯示沒有記錄* / GO SELECT * FROM xsb3 / *顯示錯(cuò)誤信息,因?yàn)閤sb3已經(jīng)沒有了* / GO
- 數(shù)據(jù)庫技術(shù)與應(yīng)用教程(Access)
- 有趣的二進(jìn)制:軟件安全與逆向分析
- 復(fù)雜性思考:復(fù)雜性科學(xué)和計(jì)算模型(原書第2版)
- 數(shù)據(jù)結(jié)構(gòu)與算法(C語言版)
- 商業(yè)分析思維與實(shí)踐:用數(shù)據(jù)分析解決商業(yè)問題
- Ceph源碼分析
- 數(shù)據(jù)挖掘原理與SPSS Clementine應(yīng)用寶典
- 大數(shù)據(jù)架構(gòu)商業(yè)之路:從業(yè)務(wù)需求到技術(shù)方案
- R語言數(shù)據(jù)挖掘
- 新手學(xué)會(huì)計(jì)(2013-2014實(shí)戰(zhàn)升級(jí)版)
- 貫通SQL Server 2008數(shù)據(jù)庫系統(tǒng)開發(fā)
- 大數(shù)據(jù)與機(jī)器學(xué)習(xí):實(shí)踐方法與行業(yè)案例
- 數(shù)據(jù)應(yīng)用工程:方法論與實(shí)踐
- 智能與數(shù)據(jù)重構(gòu)世界
- SQL Server 2012 數(shù)據(jù)庫教程(第3版)